本文打算介绍几个不太容易说出其区别或者用途的 Spring 注解,比如 @Component
与 @Bean
的比较,@ControllerAdvice
是如何处理自定义异常的等等。
1. @Component 和 @Bean 的区别是什么?
-
作用对象不同:
@Component
注解作用于类,而@Bean
注解作用于方法、 -
@Component
通常是通过路径扫描来自动侦测以及自动装配到 Spring 容器中(我们可以使用@ComponentScan
注解定义要扫描的路径从中找出标识了需要装配的类自动装配到 Spring 的 bean 容器中)。@Bean
注解通常是我们在标有该注解的方法中定义产生这个 bean,@Bean
告诉了 Spring 这是某个类的实例,当我们需要用它的时候还给我。 -
@Bean
注解比@Component
注解的自定义性更强,而且很多地方我们只能通过@Bean
注解来注册 bean。比如当我们引用第三方库中的类需要装配到 Spring 容器时,只能通过@Bean
来实现。
@Bean
注解使用示例:
@Configuration
public class AppConfig {
@Bean
public TransferService transferService() {
return new TransferServiceImpl();
}
}
@Component 注解使用示例:
@Component
public class ServiceImpl implements AService {
....
}
2. @Autowire 和 @Resource 的区别
-
@Autowire
和@Resource
都可以用来装配 bean,都可以用于字段或 setter 方法。 -
@Autowire
默认按类型装配,默认情况下必须要求依赖对象必须存在,