Spring,SpringMVC,SpringBoot中注解讲解

文章目录

  • 1 Spring和SpringMVC 注解
    • 1.1 SpringMVC 注解
      • 1.1.1 @RequestMapping
      • 1.1.2 @RequestBody
      • 1.1.3 @GetMapping
      • 1.1.4 @PostMapping
      • 1.1.5 @PutMapping
      • 1.1.6 @DeleteMapping
      • 1.1.7 @PatchMapping
      • 1.1.8 @ControllerAdvice
      • 1.1.9 @ResponseBody
      • 1.1.10 @ExceptionHandler
      • 1.1.11 @ResponseStatus
      • 1.1.12 @PathVariable
      • 1.1.13 @RequestParam
      • 1.1.14 @Controller
      • 1.1.15 @RestController
      • 1.1.16 @ModelAttribute
      • 1.1.17 @CrossOrigin
      • 1.1.18 @InitBinder
    • 1.2 Spring Bean 注解
      • 1.2.1 @ComponentScan
      • 1.2.2 @Component
      • 1.2.3 @Service
      • 1.2.4 @Repository
  • 2 Spring Dependency Inject
    • 2.1 Spring DI注解
      • 2.1.1 @DependsOn
      • 2.1.2 @Bean
    • 2.2 Scops注解
      • 2.2.1 @Scope
      • 2.2.2 @Scope 单例模式
  • 3 容器配置注解
    • 3.1 @Autowired
      • 3.1.1 作用于构造函数
      • 3.1.2 作用于setter方法
      • 3.1.3 作用于字段
    • 3.2 @Primary
    • 3.3 @PostConstruct与@PreDestroy
    • 3.4 @Qualifier
  • 4 Spring Boot注解
    • 4.1 @SpringBootApplication
    • 4.2 @EnableAutoConfiguration
    • 4.3 条件注解
      • 4.3.1 @Conditional
      • 4.3.2 @ConditionalOnClass与@ConditionalOnMissingClass
      • 4.3.3 @ConditionalOnBean与@ConditionalOnMissingBean
      • 4.3.4 @ConditionalOnProperty
      • 4.3.5 @ConditionalOnResource
      • 4.3.6 @ConditionalOnWebApplication与@ConditionalOnNotWebApplication
      • 4.3.7 @ConditionalExpression

1 Spring和SpringMVC 注解

1.1 SpringMVC 注解

1.1.1 @RequestMapping

@RequestMapping 注解的主要用途是将Web请求与请求处理类中的方法进行映射。Spring MVCSpring WebFlux都通过RquestMappingHandlerMappingRequestMappingHndlerAdapter两个类来提供对@RequestMapping注解的支持。
@RequestMapping注解对请求处理类中的请求处理方法进行标注;
@RequestMapping注解拥有以下的六个配置属性:

  • value:映射的请求URL或者其别名
  • method:兼容HTTP的方法名
  • params:根据HTTP参数的存在、缺省或值对请求进行过滤
  • header:根据HTTP Header的存在、缺省或值对请求进行过滤
  • consume:设定在HTTP请求正文中允许使用的媒体类型
  • product:在HTTP响应体中允许使用的媒体类型

提示:在使用@RequestMapping之前,请求处理类还需要使用@Controller@RestController进行标记
下面是使用@RequestMapping的两个示例:

@Controller
public class DemoController{
@RequestMapping(value="/demo/home",method=RequestMethod.GET)
public String home(){return "/home";
}
}

@RequestMapping还可以对类进行标记,这样类中的处理方法在映射请求路径时,会自动将类上@RequestMapping设置的value拼接到方法中映射路径之前,如下:

@Controller
@RequestMapping(value="/demo")
public class DemoController{
@RequestMapping(value="/home",method=RequestMethod.GET)
public String home( ){return "/home";}
}

1.1.2 @RequestBody

@RequestBody在处理请求方法的参数列表中使用,它可以将请求主体中的参数绑定到一个对象中,请求主体参数是通过HttpMessageConverter传递的,根据请求主体中的参数名与对象的属性名进行匹配并绑定值。此外,还可以通过@Valid注解对请求主体中的参数进行校验。
下面是一个使用@RequestBody的示例:

@RequestController
@RequestMapping("/api/v1")
public class UserController{
@Autowired
private UserService userService;
@PostMapping("/users")
public User createUser(avalid @RequestBody User user){
return userService.save(user);
}
}

1.1.3 @GetMapping

@GetMapping注解用于处理HTTP GET请求,并将请求映射到具体的处理方法中。具体来说,@GetMapping是一个组合注解,它相当于是@RequestMapping(method=RequestMethod.GET)的快捷方式。
下面是@GetMapping的一个使用示例:

@RequestController
@RequestMapping("/api/v1")
public class UserController{@Autowired
private UserService userService;
@GetMapping("/users")
public List<User> findAllUser(){
List<User> users = userService.findAll();
return users;
}@GetMapping("/users/{id}")
public User findOneById(@PathVariable(name="id") long id) throws
UserNotFoundException{
return userService.find0ne(id);
}
}

1.1.4 @PostMapping

@PostMapping注解用于处理HTTP POST请求,并将请求映射到具体的处理方法中。@PostMapping@GetMapping一样,也是一个组合注解,它相当于是@RequestMapping(method=HttpMethod.POST)的快捷方式。
下面是使用@PostMapping的一个示例:

@RequestController
@RequestMapping("/api/v1")
public class UserController{
@Autowired
private UserService userService;
@PostMapping("/users")
public User createUser(avalid @RequestBody User user){
return userService.save(user);
}
}

1.1.5 @PutMapping

@PutMapping注解用于处理HTTP PUT请求,并将请求映射到具体的处理方法中,@PutMapping是一个组合注解,相当于是@RequestMapping(method=HttpMethod.PUT)的快捷方式。
下面是使用@PutMapping的一个示例:

@RequestController
@RequestMapping("/api/v1")
public class UserController{
@Autowired
private UserRepository userRepository;@PutMapping("/users/{id}")
public ResponseEntity<User> updateUser(@PathValriable(name="id" )long id,avalue
aResponseBody User detail)throws UserNotFoundException{User user = userRepository.findById(id).orElseThrow(()new UserNotFountException("User not found with this id:"+id));
user.setLastName(detail.getLastName());
user.setEmail(detail.getEmail());
user.setAddress(detail.getAddress());final User origin = userRepository.save(user);
return ResponseEntity.ok(origin);}
}

1.1.6 @DeleteMapping

@DeleteMapping注解用于处理HTTP DELETE请求,并将请求映射到删除方法中。@DeleteMapping是一个组合注解,它相当于是@RequestMapping(method=HttpMethod.DELETE)的快捷方式。
下面是使用@DeleteMapping的一个示例:

@RequestController
@RequestMapping("/api/v1")
public class UserController{
@Autowired
private UserRepository userRepository;
@DeleteMapping("/users/{id}")
public Map<String,Boolean> deleteById(@PathVariable(name="id")long id) throws
UserNotFountException{User user = userRepository.findById(id).orElseThrow(()new UserNotFoundException("User not found for this id :"+id));
userRepository.delete(user);Map<String,Boolean> response = new HashMap<();
response.put("deleted",Boolean.TRUE);
return response;
}
}

1.1.7 @PatchMapping

@PatchMapping注解用于处理HTTP PATCH请求,并将请求映射到对应的处理方法中。@PatchMapping相当于是@RequestMapping(method=HttpMethod.PATCH)的快捷方式。
下面是一个简单的示例:

@RequestController
@RequestMapping("/api/v1")
public class UserController{@PatchMapping("/users/patch")
public ResponseEntity<0bject> patch( ){
return new ResposneEntity>("Patch method response message",HttpStatus.OK);
}
}

1.1.8 @ControllerAdvice

@ControllerAdvice@Component注解的一个延伸注解,Spring会自动扫描并检测被@ControllerAdvice所标注的类。@ControllerAdvice需要和@ExceptionHandler@InitBinder以及@ModelAttribute注解搭配使用,主要是用来处理控制器所抛出的异常信息。
首先,我们需要定义一个被@ControllerAdvice所标注的类,在该类中,定义一个用于处理具体异常的方法,并使用@ExceptionHandler注解进行标记。
此外,在有必要的时候,可以使用@InitBinder在类中进行全局的配置,还可以使用@ModelAttribute配置与视图相关的参数。使用@ControllerAdvice注解,就可以快速的创建统一的,自定义的异常处理类。
下面是一个使用@ControllerAdvice的示例代码:

@ControllerAdvice(basePackages={"com.ramostear.controller.user"})
public class UserControllerAdvice{@InitBinder
public void binder(WebDataBinder binder){
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
format.setLenient(false);
binder.registerCustomEditor(Date.class,"user",new CustomDateFormat(format,true));
}@ModelAttribute
public void modelAttribute(Model model){
model.addAttribute("msg","User not found exception.");
}@ExceptionHandler(UserNotFoundException.class)
public ModelAndView userNotFoundExceptionHandler(UserNotFoundException ex){
ModelAndView modelAndView= new ModelAndView();
modelAndView.add0bject("exception",ex);
modelAndView.setViewName("error");
return modelAndview;
}
}

1.1.9 @ResponseBody

@ResponseBody会自动将控制器中方法的返回值写入到HTTP响应中。特别的,@ResponseBody注解只能用在被@Controller注解标记的类中。如果在被@RestController标记的类中,则方法不需要使用@ResponseBody注解进行标注。@RestController相当于是@Controller@ResponseBody的组合注解。
下面是使用该注解的一个示例

@ResponseBody
@GetMapping("/users/{id}")
public User findByUserId(@PathVariable long id)throws UserNotFoundException{
User user = userService.findOne(id);
return user;
}

1.1.10 @ExceptionHandler

@ExceptionHander注解用于标注处理特定类型异常类所抛出异常的方法。当控制器中的方法抛出异常时,Spring会自动捕获异常,并将捕获的异常信息传递给被@ExceptionHandler标注的方法。
下面是使用该注解的一个示例:

@ExceptionHandler(UserNotFoundException.class)
public ResponseEnitty<Object> userNotFoundExceptionHandler(UserNotFoundException
ex,WebRequest request){UserErrorDetail detail = new UserErrorDetail(new Date(),ex.getMessage(),request.getDescription(false));return new ResponseEntity>(detail,HttpStatus.NOT_FOUND);
}

1.1.11 @ResponseStatus

@ResponseStatus注解可以标注请求处理方法。使用此注解,可以指定响应所需要的HTTP STATUS。特别地,我们可以使用HttpStauts类对该注解的value属性进行赋值。
下面是使用@ResponseStatus注解的一个示例:

@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(UserNotFoundException.class)
public ResponseEnitty<0bject> userNotFoundExceptionHandler(UserNotFoundException ex,WebRequest request){UserErrorDetail detail = new UserErrorDetail(new Date(),ex.getMessage(),request.getDescription(false));return new ResponseEntit<>(detail,HttpStatus.NOT_FOUND);
}

1.1.12 @PathVariable

@PathVariable注解是将方法中的参数绑定到请求URI中的模板变量上。可以通过@RequestMapping注解来指定URI的模板变量,然后使用@PathVariable注解将方法中的参数绑定到模板变量上。
特别地,@PathVariable注解允许我们使用value或name属性来给参数取一个别名。下面是使用此注解的一个示例:

@GetMapping("/users/{id}/roles/{roleId}")
public Role getUserRole(@PathVariable(name="id")long id,aPathVariable(value="roleId")long roleId)throws ResourceNotFoundException{return userRoleService.findByUserIdAndRoleId(id,roleId);
}

模板变量名需要使用{ }进行包裹,如果方法的参数名与URI模板变量名一致,则在@PathVariable中就可以省略别名的定义。
下面是一个简写的示例:

@GetMapping("/users/{id}/roles/{roleId}")
public Role getUserRole(@PathVariable long id,aPathVariable long roleId)throws
ResourceNotFoundException{return userRoleService.findByUserIdAndRoleId(id,roleId);
}

提示:如果参数是一个非必须的,可选的项,则可以在@PathVariable中设置require = false

1.1.13 @RequestParam

@RequestParam注解用于将方法的参数与Web请求的传递的参数进行绑定。使用@RequestParam可以轻松的访问HTTP请求参数的值。
下面是使用该注解的代码示例:

@GetMapping
public Role getUserRole(@RequestParam(name="id") long id,@RequestParam(name="roleId")
long roleId)throws ResourceNotFoundException{return userRoleService.findByUserIdAndRoleId(id,roleId);
}

该注解的其他属性配置与@PathVariable的配置相同,特别的,如果传递的参数为空,还可以通过defaultValue设置一个默认值。示例代码如下:

@GetMapping
public Role getUserRole(@RequestParam(name="id",defaultValue="θ") long
id,@RequestParam(name="roleId",defaultValue="θ") long roleId)throws
ResourceNotFoundException{if(id=0|| roleId=0){return new Role();
}
return userRoleService.findByUserIdAndRoleId(id,roleId);
}

1.1.14 @Controller

@Controller@Component注解的一个延伸,Spring 会自动扫描并配置被该注解标注的类。此注解用于标注Spring MVC的控制器。下面是使用此注解的示例代码:

@Controller
@RequestMapping("/api/v1")
public class UserApiController{@Autowired
private UserService userService;@GetMapping("/users/{id}")
@ResponseBody
public User getUserById(@PathVariable long id)throws UserNotFoundException{
return userService.findOne(id);
}
}

1.1.15 @RestController

@RestController是在Spring 4.0开始引入的,这是一个特定的控制器注解。此注解相当于@Controller@ResponseBody的快捷方式。当使用此注解时,不需要再在方法上使用@ResponseBody注解。
下面是使用此注解的示例代码:

@RestController
@RequestMapping("/api/v1")
public class UserApiController{@Autowired
private UserService userService;@GetMapping("/users/{id}")
public User getUserById(@PathVariable long id)throws UserNotFoundException{
return userService.findOne(id);
}
}

1.1.16 @ModelAttribute

通过此注解,可以通过模型索引名称来访问已经存在于控制器中的model。下面是使用此注解的一个简单示例:

@PostMapping("/users")
public void createUser(@ModelAttribute("user") User user){
userService.save(user);
}

@PathVariable@RequestParam注解一样,如果参数名与模型具有相同的名字,则不必指定索引名称,简写示例如下:

@PostMapping("/users")
public void createUser(@ModelAttribute User user){
userService.save(user);
}

特别地,如果使用@ModelAttribute对方法进行标注,Spring会将方法的返回值绑定到具体的Model上。示例如下:

@ModelAttribute("ramostear")
User getUser(){User user = new User();
user.setId(1);
user.setFirstName("ramostear");
user.setEmail("ramosteara163.com")
//....return user;
}

Spring调用具体的处理方法之前,被@ModelAttribute注解标注的所有方法都将被执行。

1.1.17 @CrossOrigin

@CrossOrigin注解将为请求处理类或请求处理方法提供跨域调用支持。如果我们将此注解标注类,那么类中的所有方法都将获得支持跨域的能力。使用此注解的好处是可以微调跨域行为。使用此注解的示例如下:

@CrossOrigin
@GetMapping("/users/home" )
public String userDetails(aRequestParam(name="id",defaultValue="0" )long id)throws
UserNotFoundException{if(id = 0){
return new User();
}
return userService.find0ne(id).toString();
}

1.1.18 @InitBinder

@InitBinder注解用于标注初始化WebDataBinider 的方法,该方法用于对Http请求传递的表单数据进行处理,如时间格式化、字符串处理等。能够实现:从request获取到handler方法中由@RequestParam注解或@PathVariable注解修饰的参数后,假如获取到的参数类型与handler方法上的参数类型不匹配,此时可以使用初始化好的WebDataBinder对获取到的参数进行类型处理。

下面是使用此注解的示例:

@Controller
public class YourController {@InitBinderpublic void initBinder(WebDataBinder binder) {// 配置数据绑定器binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));// 其他配置...}@RequestMapping("/test")public String test(@RequestParam("dateParam") Date date) {// 处理业务逻辑return "test";}
}

1.2 Spring Bean 注解

1.2.1 @ComponentScan

@ComponentScan注解用于配置Spring需要扫描的被组件注解注释的类所在的包。可以通过配置其basePackages属性或者value属性来配置需要扫描的包路径。value属性是basePackages的别名。

1.2.2 @Component

@Component注解用于标注一个普通的组件类,它没有明确的业务范围,只是通知Spring被此注解的类需要被纳入到Spring Bean容器中并进行管理。此注解的使用示例如下:

@Component
public class EncryptUserPasswordComponent{public String encrypt(String password,String salt){}
}

1.2.3 @Service

@Service注解是@Component的一个延伸(特例),它用于标注业务逻辑类。与@Component注解一样,被此注解标注的类,会自动被Spring所管理。下面是使用@Service注解的示例:

public interface UserService{User createUser(User user);
}@Service("userService")
public class UserServiceImpl implements UserService{@Autowired
private UserRepository userRepository;@Override
public User createUser(User user){
return userRepository.save(user);
}@RestController
@RequestMapping("/users" )
public class UserController{@Autowired
private UserService userService;
@PostMapping
public User createUser(aRequestBody User user){
return userService.createUser(user);}
}

1.2.4 @Repository

@Repository注解也是@Component注解的延伸,与@Component注解一样,被此注解标注的类会被Spring自动管理起来,@Repository注解用于标注DAO层的数据持久化类。此注解的用法如下:

@Entity
@Table(name="t_user")
public class User{@Id
@Column(name="USER_ID")
private Long id;//...
}@Repository
public interface UserRepository extends JpaRepository<User,Long>{
//...
}

2 Spring Dependency Inject

2.1 Spring DI注解

2.1.1 @DependsOn

@DependsOn注解可以配置Spring IoC容器在初始化一个Bean之前,先初始化其他的Bean对象。下面是此注解使用示例代码:

public class FirstBean {
@Autowired
private SecondBean secondBean;
@Autowired
private ThirdBean thirdBean;public FirstBean(){// ...}//...
}public class SecondBean {public SecondBean(){//
...}
}public class ThirdBean {public ThirdBean(){
//...
}
}@Configuration
public class CustomBeanConfig{@Bean("firstBean")
@Depends0n(value={"secondBean","thirdBean"})public FirstBean firstBean(){
return new FirstBean();
}@Bean("secondBean")
public SecondBean secondBean(){
return new SecondBean();@Bean("thirdBean")public ThirdBean thirdBean( ){
return new ThirdBean();}
}

2.1.2 @Bean

@Bean注解主要的作用是告知Spring,被此注解所标注的类将需要纳入到Bean管理工厂中。@Bean注解的用法很简单,在这里,着重介绍@Bean注解中initMethod和destroyMethod的用法。示例如下:

@Component
public class DataBaseInitializer {public void init(){System.out.println("This is init method.");//
}public void destroy(){
System.out.println("This is destroy method.");// ...
}}@Configuration
public class SpringBootApplicatioinConfig{@Bean(initMethod="init",destroyMethod="destroy")public DataBaseInitializer databaseInitializer(){return new DataBaseInitializer();}
}

2.2 Scops注解

2.2.1 @Scope

@Scope注解可以用来定义@Component标注的类的作用范围以及@Bean所标记的类的作用范围。@Scope所限定的作用范围有:singleton、prototype、request、session、globalSession或者其他的自定义范围。这里以prototype为例子进行讲解。
当一个Spring Bean被声明为prototype(原型模式)时,在每次需要使用到该类的时候,Spring IoC容器都会初始化一个新的改类的实例。在定义一个Bean时,可以设置Beanscope属性为prototype:scope=“prototype”,也可以使用@Scope注解设置,如下:

@Scope(value=ConfigurableBeanFactory.SCOPE_PROPTOTYPE)

下面将给出两种不同的方式来使用@Scope注解,示例代码如下:

public interface UserService {}@Component
@Scope(value =ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class UserServiceImpl implements UserService {//...}@Configuration
@ComponentScan(basePackages ="com.ramostear.service" )
public class ServiceConfig {//...
}public class StudentService implements UserService {//...
}@Configuration
public class StudentServiceConfig {@Bean
@scope(value =ConfigurableBeanFactory.SCOPE_PROTOTYPE)public UserService userService() {
return new StudentServiceImpl();
}
}

2.2.2 @Scope 单例模式

@Scope的作用范围设置成Singleton时,被此注解所标注的类只会被Spring IoC容器初始化一次。在默认情况下,Spring IoC容器所初始化的类实例都为singleton。同样的原理,此情形也有两种配置方式,示例代码如下:

public interface UserService {}@Component
@scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON)
public class userServiceImpl implements UserService {
//..
}
@Configuration
@ComponentScan(basePackages ="com.ramostear.service" )
public class ServiceConfig {
//...
}
//-----public class StudentService implements UserService {
//...
}@Configuration
public class StudentServiceConfig {@Bean
@scope(value = ConfigurableBeanFactory.sCOPE_SINGLETON)
public userService userService() {
return new studentServiceImpl();
}
}

3 容器配置注解

3.1 @Autowired

@Autowired注解用于标记Spring将要解析和注入的依赖项。此注解可以作用在构造函数、字段和setter方法上。

3.1.1 作用于构造函数

下面是@Autowired注解标注构造函数的使用示例:

@RestController
public class userController {private UserService userService;
@Autowired
UserController(UserService userService){
this.userService=userService;
}
// ...
}

3.1.2 作用于setter方法

下面是@Autowired注解标注setter方法的示例代码:

@RestController
public class userController {private UserService userService;
@Autowired
public void setUserService(UserService userService){
this.userService=userService;
}
}

3.1.3 作用于字段

@Autowired注解标注字段是最简单的,只需要在对应的字段上加入此注解即可,示例代码如下:

@RestController
public class userController {@Autowired
private User5ervice userService;}

3.2 @Primary

当系统中需要配置多个具有相同类型的bean时,@Primary可以定义这些Bean的优先级。下面将给出一个实例代码来说明这一特性:

public interface MessageService {
String sendMessage();
}@Component
public class EmailMessageServiceImpl implements MessageService {@Override
public string sendMessage(){
return "this is send email method message.";
}
}
@Component
public class WechatMessageImpl implements MessageService {
@override
public string sendMessage(){
return "this is send wechat method message.";
}
}@Primary
@Component
public class DingDingMessageImple implements MessageService {@override
public string sendMessage(){
return "this is send DingDing method message.";
}
}
@RestController
public class MessageController {@Autowired
private MessageService messageService;
@GetMapping("/info" )
public string info(){
return messageService.sendMessage();
}
}
输出结果:
this is send DingDing method message.

3.3 @PostConstruct与@PreDestroy

值得注意的是,这两个注解不属于Spring,它们是源于JSR-250中的两个注解,位于common-annotations.jar中。@PostConstruct注解用于标注在BeanSpring初始化之前需要执行的方法。@PreDestroy注解用于标注Bean被销毁前需要执行的方法。下面是具体的示例代码:

@Component
public class DemoComponent {private List<string> list = new ArrayListo();@PostConstruct
public void init(){
list.add("hello");
list.add("world");
}
@PreDestroy
public void destroy(){
list.clear();
}
}

3.4 @Qualifier

当系统中存在同一类型的多个Bean时,@Autowired在进行依赖注入的时候就不知道该选择哪一个实现类进行注入。此时,我们可以使用@Qualifier注解来微调,帮助@Autowired选择正确的依赖项。下面是一个关于此注解的代码示例:

public interface MessageService {
public string sendMessage(String message);
}
@Service("emailService")
public class EmailServiceImple implements MessageService {
@override
public string sendMessage(String message){
return "send email,content:"+message;
}
}@Service("smsService")
public class SMSServiceImpl implements MessageService{
@Override
public string sendMessage(String message){
return "send SMS,content:"+message;
}
}
public interface MessageProcessor{public string processMessage(String message);
}
public class MessageProcessorImpl implements MessageProcessor{private MessageService messageService;
@Autowired
@Qualifier("emailService")
public void setMessageService(MessageService messageService){
this. messageService = messageService;
@Override
public string processMessage(String message){
return messageService.sendMessage(message);
}
}

4 Spring Boot注解

4.1 @SpringBootApplication

@SpringBootApplication注解是一个快捷的配置注解,在被它标注的类中,可以定义一个或多个Bean,并自动触发自动配置Bean和自动扫描组件。此注解相当于@Configuration、@EnableAutoConfiguration和@ComponentScan的组合。
在Spring Boot应用程序的主类中,就使用了此注解。示例代码如下:

@SpringBootApplication
public class Application{public static void main(String [] args){SpringApplication.run(Application.class,args);}
}

4.2 @EnableAutoConfiguration

@EnableAutoConfiguration注解用于通知Spring,根据当前类路径下引入的依赖包,自动配置与这些依赖包相关的配置项。

4.3 条件注解

4.3.1 @Conditional

@Conditional注解可以控制更为复杂的配置条件。在Spring内置的条件控制注解不满足应用需求的时候,可以使用此注解定义自定义的控制条件,以达到自定义的要求。下面是使用该注解的简单示例:

@Conditioanl(CustomConditioanl.class)
CustomProperties addCustomProperties(){//...}

4.3.2 @ConditionalOnClass与@ConditionalOnMissingClass

这两个注解属于类条件注解,它们根据是否存在某个类作为判断依据来决定是否要执行某些配置。下面是一个简单的示例代码:

@Configuration
@ConditionalOnClass(DataSource.class)
class MySQLAutoConfiguration {//...
}

4.3.3 @ConditionalOnBean与@ConditionalOnMissingBean

这两个注解属于对象条件注解,根据是否存在某个对象作为依据来决定是否要执行某些配置方法。示例代码如下:

@Bean
@ConditionalOnBean(name="dataSource")
LocalContainerEntityManagerFactoryBean entityManagerFactory(){//...}
@Bean
@ConditionalOnMissingBean
public MyBean myBean(){//...}

4.3.4 @ConditionalOnProperty

@ConditionalOnProperty注解会根据Spring配置文件中的配置项是否满足配置要求,从而决定是否要执行被其标注的方法。示例代码如下:

@Bean
@ConditionalOnProperty(name="alipay",havingValue="on")
Alipay alipay(){return new Alipay();}

4.3.5 @ConditionalOnResource

此注解用于检测当某个配置文件存在使,则触发被其标注的方法,下面是使用此注解的代码示例:

@ConditionalOnResource(resources = "classpath:website.properties")
Properties addWebsiteProperties(){//...}

4.3.6 @ConditionalOnWebApplication与@ConditionalOnNotWebApplication

这两个注解用于判断当前的应用程序是否是Web应用程序。如果当前应用是Web应用程序,则使用Spring WebApplicationContext,并定义其会话的生命周期。下面是一个简单的示例:

@ConditionalOnWebApplication
HealthCheckController healthCheckController(){//...}

4.3.7 @ConditionalExpression

此注解可以让我们控制更细粒度的基于表达式的配置条件限制。当表达式满足某个条件或者表达式为真的时候,将会执行被此注解标注的方法。

@Bean
@ConditionalException("${localstore} && ${local == 'true'}")
LocalFileStore store(){//...}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/142355.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式软件工程师面试题——2025校招社招通用(十四)

说明&#xff1a; 面试题来源于网络书籍&#xff0c;公司题目以及博主原创或修改&#xff08;题目大部分来源于各种公司&#xff09;&#xff1b;文中很多题目&#xff0c;或许大家直接编译器写完&#xff0c;1分钟就出结果了。但在这里博主希望每一个题目&#xff0c;大家都要…

Java 入门基础题

目录 1.输出一个整数的每一位 2.判定素数 3.求最大值方法的重载 4.输出闰年 5.打印 X 图形 6.数字9 出现的次数 7.计算分数的值 8. 模拟登陆 9.使用函数求最大值 10.斐波那契数列 星光不负赶路人&#xff0c;加油铁子们&#xff01;&#xff01;&#xff01; 1…

Elasticsearch 在 Java 开发中的应用

Elasticsearch 在 Java 开发中的应用 Elasticsearch 是一个开源的分布式搜索引擎&#xff0c;广泛应用于全文搜索、日志分析等场景。本文将介绍 Elasticsearch 在 Java 开发中的基本使用和一些实际场景中的应用。 1. 引入 Elasticsearch 依赖 首先&#xff0c;需要在 Maven 或…

RT-DETR算法优化改进:Backbone改进 | VanillaNet一种新视觉Backbone,极简且强大!华为诺亚2023

💡💡💡本文独家改进: VanillaNet助力RT-DETR ,替换backbone,简到极致、浅到极致!深度为6的网络即可取得76.36%@ImageNet的精度,深度为13的VanillaNet甚至取得了83.1%的惊人性能。 推荐指数:五星 RT-DETR魔术师专栏介绍: https://blog.csdn.net/m0_63774211/cat…

11-13 /11-14代理模式 AOP

调用者 代理对象 目标对象 代理对象除了可以完成核心任务&#xff0c;还可以增强其他任务,无感的增强 代理模式目的: 不改变目标对象的目标方法的前提,去增强目标方法 分为:静态代理,动态代理 静态代理 有对象->前提需要有一个类&#xff0c;那么我们可以事先写好一个类&a…

【Python基础篇】字面量

博主&#xff1a;&#x1f44d;不许代码码上红 欢迎&#xff1a;&#x1f40b;点赞、收藏、关注、评论。 格言&#xff1a; 大鹏一日同风起&#xff0c;扶摇直上九万里。 文章目录 一 Python中字面量的定义二 常见的字面量类型1 数字(Number)2 字符串(String)3 列表(List)4 元…

微信小程序:仅前端实现对象数组的模糊查询

效果 核心代码 //对数组进行过滤&#xff0c;返回数组中每一想满足name值包括变量query的 let result array.filter(item > { return item.name.includes(query); }); 完整代码 wxml <input type"text" placeholder"请输入名称" placeholder-styl…

前端工具nvm实现node自由

node的自由之路 前言 大家使用vue框架开发的朋友可能会遇到首次运行公司项目环境的时候&#xff0c;会出现使用npm install命令安装依赖包的时候出现各种各样的问题&#xff0c;其中很重要的一个错误原因就是因为你的nodejs版本和当时搭建环境的版本不一致造成的。今天就来给…

R语言——taxize(第一部分)

ropensci 系列之 taxize &#xff08;中译手册&#xff09; taxize 包1. taxize支持的网络数据源简介目前支持的API&#xff1a;针对Catalogue of Life&#xff08;COL&#xff09; 2. 浅尝 taxize 的一些使用例子2.1. **从NCBI上获取唯一的分类标识符**2.2. **获取分类信息**2…

网络安全基础之php开发文件上传的实现

前言 php是网络安全学习里必不可少的一环&#xff0c;简单理解php的开发环节能更好的帮助我们去学习php以及其他语言的web漏洞原理 正文 在正常的开发中&#xff0c;文件的功能是必不可少&#xff0c;比如我们在论坛的头像想更改时就涉及到文件的上传等等文件功能。但也会出…

基于SpringBoot+Vue的宿舍管理系统

基于SpringBootVue的学生宿舍管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatisVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 宿舍公告 登录界面 管理员界面 维修人员 商家界面 学生界面 摘要 摘…

Azure 机器学习:在 Azure 机器学习中使用 Azure OpenAI 模型

目录 一、环境准备二、Azure 机器学习中的 OpenAI 模型是什么&#xff1f;三、在机器学习中访问 Azure OpenAI 模型连接到 Azure OpenAI部署 Azure OpenAI 模型 四、使用自己的训练数据微调 Azure OpenAI 模型使用工作室微调微调设置训练数据自定义微调参数部署微调的模型 使用…

Python---集合中的交集 、并集 | 与差集 - 特性

用 & 来求两个集合的交集&#xff1a;-----键盘上的7上的符号&#xff0c;shift 7 同时按 用 | 来求两个集合的并集&#xff1a; -----键盘上的7上的符号&#xff0c;shift 同时按&#xff08;就是enter键上面那个|\ &#xff09; 用 - 来求两个集合的差集&#xff…

linux查看端口被哪个进程占用

linux查看端口被哪个进程占用 1、lsof -i:端口号 sudo lsof -i :22 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 661 root 3u IPv4 13882 0t0 TCP *:ssh (LISTEN) sshd 661 root 4u IPv6 13893 0t0 TCP *:ssh (LISTEN) ssh…

mysql核心知识整理

目录 聚簇索引与非聚簇索引&#xff1b; 聚簇索引&#xff1a;找到了索引就找到了需要的数据&#xff0c;那么这个索引就是聚簇索引&#xff0c;所以主键就是聚簇索引&#xff0c;修改聚簇索引其实就是修改主键。 非聚簇索引&#xff1a;索引的存储和数据的存储是分离的&#…

抖斗音_快块手直播间获客助手+采集脚本+引流软件功能介绍

软件功能&#xff1a; 支持同时采集多个直播间&#xff0c;弹幕&#xff0c;关*注&#xff0c;礼*物&#xff0c;进直播间&#xff0c;部分用户手*号,粉*丝团采集 不支持采集匿*名直播间 设备需求&#xff1a; 电脑&#xff08;win10系统&#xff09; 文章分享者&#xff1…

Kerberos认证系统

文章目录 前提知识原理第一次对话第二次对话第三次对话 总结发现 前提知识 KDC&#xff1a;由AS、TGS&#xff0c;还有一个Kerberos Database组成。 Kerberos Database用来存储用户的密码或者其他所有信息&#xff0c;请求的时候需要到数据库中查找。 AS&#xff1a;为客户端提…

WebSphere Liberty 8.5.5.9 (三)

WebSphere Liberty 8.5.5.9 将资源先下载&#xff0c;后期本地安装 下载 passwordUtilities-1.0 D:\wlp-webProfile7-java8-8.5.5.9\wlp\bin>installUtility find password 正在建立与已配置存储库的连接... 此过程可能要花几分钟完成。已成功连接至所有已配置的存储库。…

Python爬虫抓取微博数据及热度预测

首先我们需要安装 requests 和 BeautifulSoup 库&#xff0c;可以使用以下命令进行安装&#xff1a; pip install requests pip install beautifulsoup4然后&#xff0c;我们需要导入 requests 和 BeautifulSoup 库&#xff1a; import requests from bs4 import BeautifulSou…

No203.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…