1 对比@Autowired和@Resource
@Autowired
: 先按byType去找,如果没找到,则会按照byName去找@Resource
: 先按byName去找,如果没找到则会byType去找。如果设置了name属性,则只会按byName去找,找不到就报错
当同一个接口只有一个实现类时, 两者的效率相差不大. 但是当实现类数量较多时,
@Autowired
的效率会远远低于@Resource
, 因为需要先找到该类型的所有实现类,再进行byName的匹配
2 对比@Autowired和@Bean
@Autowired
: 注入实例(需要在此之前就已经创建出一个实例, 例如在主程序启动类运行后依赖注入或者根据@Bean主动创建)
@Autowired
注解用于自动注入Spring容器中的bean。它会在Spring上下文启动完成后,通过类型匹配来注入已存在的bean。
如果在Spring容器中找不到合适的bean,使用@Autowired标注的字段就会抛出NullPointerException@Bean
: 在此方法中创建并返回一个目标实例
@Bean
注解用于定义一个Spring bean并将它注册到Spring容器中。这个方法通常在@Configuration类中定义,Spring会在初始化视图时调用这个方法并将返回的对象作为bean存储到容器中。
由于
@Autowired
注入的是在此之前已经创建的实例, 因此在主程序启动类中的.run()
运行之前, 使用@Autowired
会出现NullPointerException错误. 而@Bean
可以手动获取,如下
@SpringBootApplication
public class DemoApplication {
@Bean
Service service(){
return new Service();
}
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(DemoApplication.class);
Service service = context.getBean(Service.class);
service.test();
}
}
3 对比@Component和@Controller等
@Component
用途: 它是一个通用的注解,表示一个Spring管理的组件。
特性: 可以自动扫描并注册在Spring的应用上下文中。适用于所有类型的Spring Bean。@Service
用途: 特专用于服务层的类,表示其主要业务逻辑。
特性: 语义更明确,通常用于标识服务层的Bean。这在进行AOP(面向切面编程)时更清晰。@Repository
用途: 用于数据访问层,通常是持久层(例如DAO)。
特性: 除了表明这是一个数据访问组件外,还在发生数据访问异常时,能够自动转换为Spring的 DataAccessException。@Controller
用途: 用于Web层,控制器类的标识。
特性: 专门用于处理HTTP请求和响应,通常与 Spring MVC 一起使用。@RestController
用途: 是 @Controller 和 @ResponseBody 的组合,用于RESTful API。
特性: 自动将返回的对象转换为JSON/XML格式并写入HTTP响应体。
比较总结
用途明确性: @Service, @Repository, 和 @Controller 拥有更具体的用途,相比之下,@Component 更通用。
语义: 使用特定的注解能够提高代码的可读性和可维护性,因为它们能明确指出类的角色。
功能性: @Repository 和 @Service 提供了一些额外的功能(例如异常处理),@Controller 和 @RestController 处理请求和响应相关的功能。
在实际使用中,建议根据类的职责选择不同的注解,而不是仅使用 @Component,以便更清晰地表达代码意图。