对比@Autowired, @Resource, @Component和@Bean

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等

  1. @Component
    用途: 它是一个通用的注解,表示一个Spring管理的组件。
    特性: 可以自动扫描并注册在Spring的应用上下文中。适用于所有类型的Spring Bean。
  2. @Service
    用途: 特专用于服务层的类,表示其主要业务逻辑。
    特性: 语义更明确,通常用于标识服务层的Bean。这在进行AOP(面向切面编程)时更清晰。
  3. @Repository
    用途: 用于数据访问层,通常是持久层(例如DAO)。
    特性: 除了表明这是一个数据访问组件外,还在发生数据访问异常时,能够自动转换为Spring的 DataAccessException。
  4. @Controller
    用途: 用于Web层,控制器类的标识。
    特性: 专门用于处理HTTP请求和响应,通常与 Spring MVC 一起使用。
  5. @RestController
    用途: 是 @Controller 和 @ResponseBody 的组合,用于RESTful API。
    特性: 自动将返回的对象转换为JSON/XML格式并写入HTTP响应体。

比较总结

用途明确性: @Service, @Repository, 和 @Controller 拥有更具体的用途,相比之下,@Component 更通用。
语义: 使用特定的注解能够提高代码的可读性和可维护性,因为它们能明确指出类的角色。
功能性: @Repository 和 @Service 提供了一些额外的功能(例如异常处理),@Controller 和 @RestController 处理请求和响应相关的功能。
在实际使用中,建议根据类的职责选择不同的注解,而不是仅使用 @Component,以便更清晰地表达代码意图。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值