spring中基于Java容器配置注解的区别及使用场景
转载自百家号作者:有趣的代码
@Component、@Service、@Controller、@Repository;@Configuration、@Bean区别,使用场景
从spring3.0开始,基于javaconfig的项目,支持使用java来定义bean,而不是传统的xml文件。@Component是一个通用的stereotype,可以用于任何受容器管理的bean。而@Service、@Controller、@Repository是用于特殊形式的@Component,注解在类型上,但本质是一样的。
在@Configuration中配合@ComponentScan使用,spring 自动检测stereotype类,然后在application context注册相应的bean definition。在运行时会生成CGLIB的子类,在调用父类方法前,子类会先查找缓存。从spring3.2开始,CGLIB已经被包含在spring中。
CGLIB的限制:
1、@Configuration注解的类不能是final;
2、从4.3开始,任何构造函数都允许在配置类上使用,包括使用@Autowired或用于默认注入的单个非默认构造函数声明。
3、若不想要CGLIB对bean的限制,则可以使用@Component作为配置类,跨方法的调用不会被拦截,因此你必须使用构造函数或方法级别的依赖注入。
@Bean注解在方法上,用于实现工厂方法。与@Configuration搭配使用,不同的方法(只new一次)代表相同的实例,可以用于内部bean的依赖只需要调用另一个bean相应的方法;而与@Component搭配使用,不同的方法(只new一次)代表不同的实例,即不能用于内部bean的依赖。
若是第三方服务想由spring容器管理,则需要使用@Bean注解提供工厂方法。若是自己的服务则可以注解@Component(@Service、@Controller、@Repository),由容器自动扫描。
为了让学习变得轻松、高效,今天给大家免费分享一套Java教学资源。帮助大家在成为Java架构师的道路上披荆斩棘。需要资料的欢迎加入学习交流群:9285,05736