本文打算介绍几个不太好区分或不好用的Spring注解,比如@Component和@Bean的比较,@ControllerAdvice如何处理自定义异常等等。Spring中的一些注解1、@Component和@Bean有什么区别?作用对象不同:@Component注解作用于类,而@Bean注解作用于方法。@Component通常是通过路径扫描自动检测并自动组装到Spring容器中(我们可以使用@ComponentScan注解来定义要扫描的路径,从中找出标识需要组装的类并自动组装到Spring的bean容器中).@Bean注解通常表示我们在注解标注的方法中定义并生成这个bean。@Bean告诉Spring这是某个类的实例,等我们需要用到的时候返回给我。@Bean注解比@Component注解更易于定制,很多地方我们只能通过@Bean注解来注册bean。比如当我们引用第三方库中的类,需要将其组装到Spring容器中时,只能通过@Bean来实现。@Bean注解使用示例:@ConfigurationpublicclassAppConfig{@BeanpublicTransferServicetransferService(){returnnewTransferServiceImpl();}}@Component注解使用示例:@ComponentpublicclassServiceImplimplementsAService{....}WhatComponentcannotimplement:@BeanpublicOneServicegetService(status){case(status){when1:returnnewserviceImpl1();when2:returnnewserviceImpl2();当3:returnnewserviceImpl3();}}2.Autowire和@Resource的区别@Autowire和@Resource都可以用来组装bean,都可以用于字段或者setter方法。SpringBoot学习笔记分享给大家。@Autowire默认按类型组装。默认情况下,依赖对象必须存在。如果要允许空值,可以将其required属性设置为false。@Resource默认是按名字组装的,当没有找到匹配名字的bean时按类型组装。可以通过名称属性指定名称。如果不指定name属性,在字段上写注解时,使用默认的字段名。当注解写在setter方法上时,使用默认的属性名进行组装。注意:如果指定了name属性,则只会按name进行组装。@Autowire和@Qualifier的组合与@Resource的效果相同:@Autowired(required=false)@Qualifier("example")privateExample示例;@Resource(name="example")private示例示例;@Resource组装顺序如果同时指定了name和type,会从容器中寻找唯一匹配的bean组装,找不到则抛出异常;如果指定了name属性,则从容器中查找匹配名称的bean组件,如果找不到则抛出异常;type属性,从容器中寻找类型唯一匹配的beanassembly,如果找不到或者发现多个异常;如果不指定,则自动按照byName方法进行组装,如果不匹配,则回退到原来的类型进行匹配,如果匹配则自动装配。3.将类声明为Springbean的注解有哪些?@Component:通用注解,可以注解任何Spring组件。如果一个Bean不知道自己属于哪一层,可以用@Component注解来注解。@Repository:对应持久层,即Dao层,主要用于数据库相关操作。@Service:对应service层,主要设计一些复杂的逻辑,需要用到Dao层。@Controller:对应SpringMVC控制层,主要用于接受用户请求,调用Service层向前端页面返回数据。@Configuration:声明该类为配置类,可以在该类中声明一个或多个@Bean方法。4、@Configuration:配置类注解@Configuration表示在一个类中可以声明一个或多个@Bean方法,可以被Spring容器处理,在运行时为这些bean生成bean定义和服务请求,例如:@ConfigurationpublicclassAppConfig{@BeanpublicMyBeanmyBean(){//实例化、配置和返回bean...}}我们可以通过AnnotationConfigApplicationContext注册@Configuration类:AnnotationConfigApplicationContextctx=newAnnotationConfigApplicationContext();ctx.register()ctx.refresh();MyBeanmyBean=ctx.getBean(MyBean.class);//使用myBean...也可以通过组件扫描加载,@Configuration使用@Component进行原始注解,所以@Configuration类也可以通过组件扫描(特别是使用XML元素)。@Configuration类不仅可以使用组件扫描进行引导,还可以使用@ComponentScan注解自行配置组件扫描:@Configuration@ComponentScan("com.acme.app.services")publicclassAppConfig{//各种@Beandefinitions...}Constraintsusing@Configuration:配置类必须作为类提供(例如,它不能是工厂方法返回的实例)。配置类必须是非最终的。配置类必须是非原生的(即不能在方法中声明),原生注解的方法。任何嵌套的配置类都必须声明为静态的。@Bean方法可能不会依次创建更多的配置类。除了单独使用@Configuration注解,我们还可以结合一些外部bean或注解使用,比如EnvironmentAPI、@PropertySource、@Value、@Profile等,这里不再详细介绍。更多用法请参考Spring@Configuration的相关文档。推荐一个SpringBoot基础教程和实例:https://github.com/javastacks...5.@ControllerAdvice:全局异常处理工具。用于定义@ExceptionHandler、@InitBinder、@ModelAttribute,应用于@RequestMapping、@PostMapping、@GetMapping等Controller层的所有注解。默认情况下,@ControllerAdvice中的方法适用于全局所有控制器。而是使用选择器annotations()、basePackageClasses()和basePackages()(或其别名value())来定义目标控制器的更窄子集。SpringBoot学习笔记分享给大家。如果声明了多个选择器,则应用OR逻辑,这意味着所选控制器应至少匹配一个选择器。请注意,选择器检查是在运行时执行的,因此添加许多选择器会对性能产生负面影响并增加复杂性。@ControllerAdvice最常与@ExceptionHandler一起用于全局异常处理。结合下面的例子,我们可以捕获自定义异常进行处理,返回自定义状态码:@ControllerAdvice("com.developlee.errorhandle")publicclassMyExceptionHandler{/***捕获CustomException*@parame*@returnjson格式类型*/@ResponseBody@ExceptionHandler({CustomException.class})//指定拦截异常的类型@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)//自定义浏览器返回状态码publicMapus>String,Object
