文章目录
1、关于@Configuration 和 @Bean
大家都知道spring中的配置类需要加@Configuration,里面的方法需要加@Bean,如下
测试输出一下这几个 bean
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ConfigBean2.class);
输出结果
bean名称:configBean,别名:[],bean对象:com.test.demo.ConfigBean$$EnhancerBySpringCGLIB$$ddr45479@565r171k
bean名称:user1,别名:[],bean对象:com.test.demo.User@2d313f4l
bean名称:user2Bean,别名:[],bean对象:com.test.demo.User@7d20d0l
bean名称:user3Bean,别名:[user3BeanAlias2, user3BeanAlias1],bean对象:com.test.demo.User@p4f1bal7
可以发现:
1、被@Configuration修饰的类,也被注册到spring容器中了
2、最后三个是被bean注解的
1.1、可以有@Bean没有@Configuration吗?
可以。那和有@Configuration有什么区别?
- 没有@Configuration,只有@Bean也可以自动注入到spring中
- @Configuration注解修饰的类,会被spring通过cglib生成一个代理对象,从而是单例模式的
- 因为@Bean在@Configuration注解修饰的类里面需要代理,所以@Bean方法一定不要定义成final、private、static的,虽然不会报错,但是没法生成代理就不是单例的了
1.2、其他如:@Component、@Repository、@Service等里面能写@Bean吗?
可以。那有什么区别?
@Configuration、@Component、@Repository、@Service、@Controller里面都可以有@Bean
区别就是和没写@Configuration一样。
1.3、可以有@Configuration没有@Bean吗?
没有@Bean就不会被自动注入,因为有@Configuration类是被自动注入了的,所以可以自动注入类,然后通过类名.方法名。