解读@Bean和@Autowired、@Resource之间的区别
作者:liudachu
这篇文章主要介绍了@Bean和@Autowired、@Resource之间的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
@Bean和@Autowired、@Resource的区别
@Bean 修饰的方法表示初始化一个对象并交由Spring IOC去管理,@Bean 只能和@Component @Repository @Controller @Service @Configration 配合使用.
@Autowired 可修饰变量和方法,用于完成自动装配(将需要的外部资源注入)
@Resource是java提供的注解,和@Autowired类似
@Bean和@Autowired的区别
网站上看到一个问题:
为什么@Autowired在这种情况下不能使用?
@SpringBootApplication public class Application { @Autowired BookingService bookingService; public static void main(String[] args) { bookingService.book("Alice", "Bob", "Carol"); } }
但可以使用 @Bean
@SpringBootApplication public class Application { @Bean BookingService bookingService() { return new BookingService(); } public static void main(String[] args) { ApplicationContext ctx = SpringApplication.run(Application.class, args); BookingService bookingService = ctx.getBean(BookingService.class); bookingService.book("Alice", "Bob", "Carol"); } }
区别:
简单地解释:
@Bean
告诉Spring’这是此类的一个实例,请保留该类,并在我询问时将其还给我’。@Autowired
说“请给我一个该类的实例,例如,我@Bean之前用注释创建的一个实例”。
那有意义吗?在第一个示例中,你要让Spring给你一个的实例BookingService,但是你从未创建一个实例,因此Spring没有任何东西可以给你。在第二个示例中,你将创建一个的新实例BookingService,将其告知Spring,然后在该main()方法中要求其返回。
如果需要,可以从第二种main()方法中删除另外两行,并结合以下两个示例:
@SpringBootApplication public class Application { @Autowired BookingService bookingService; @Bean BookingService bookingService() { return new BookingService(); } public static void main(String[] args) { bookingService.book("Alice", "Bob", "Carol"); } }
在这种情况下,@Bean
注释为Spring提供了BookingService
,并加以@Autowired
利用。
这将是一个毫无意义的示例,因为你都在同一个类中使用它们,但是如果你@Bean
在一个类中定义了该类,而在另一个类中定义了它,则它将变得很有用@Autowired
。
@Resource和@Autowired的区别
- @Autowired会先按byType去找,如果没找到,则会按照byName去找
- @Resource会先按byName去找,如果没找到则会byType去找。如果设置了name属性,则只会按byName去找,找不到就报错。
@Resource(name = "studentServiceImpl") private PersonService personService;
什么时候用Autowired、Resource?
Autowired
:效率低下,先按类型查找,再按名字查找Resource
:按名字查找,后面要跟参数name,好处:当有多个Impl实现类时,可以通name快速找到
当只有一个Impl实类的时候,随便用哪个都差不多,>=2的时候,最好用@Resource,比@Autowired@Qualifier()效率高
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。