最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

环球热消息:【一句话】@Configuration和@Component的区别

来源:博客园

首先一句话:

@Configuration修饰的类会被Cglib动态代理,@Component不会。

详细:


【资料图】

Cglib动态代理生成当前对象的子类Class,并对方法拦截,多次调用@Bean方法时直接从BeanFactory之中获取,得到同一个对象。

即使用@Configuration时

@Autowired自动注入的对象和直接调用@Bean修饰的方法及多次调用@Bean修饰的方法拿到的是同一个对象。

当然,多个@Autowired自动注入的对象不管使用哪个注解拿到的都是同一个对象哈,因为默认是单例的嘛

看个例子就好理解了:

@Configuration// @Componentpublic class Test {    @Bean    public A a(){        A a = new A();        a.setB1(b());        a.setB2(b());        return a;    }    @Bean    public B b(){        B b = new B ();        return b;    }}
@RunWith(SpringRunner.class)@SpringBootTest(classes = DemoApplication.class)public class OnlyTest {    @Autowired    private A a;    @Autowired    private B b3;    @Autowired    private B b4;    @Test    public void testCompare() {        System.out.println(a.getB1 == b3? "同一个b" : "不同的b");        System.out.println(b3 == b4? "同一个b" : "不同的b");        System.out.println(a.getB1() == a.getB2() ? "同一个b" : "不同的b");    }}

运行结果:

使用@Configuration时:

同一个b

同一个b

同一个b

使用@Component时:

不同的b

同一个b

不同的b

解释一 下:

第一个判断,判断的是@AutoWired自动注入和直接调用@Bean方法获得的对象是不是同一个,结论:使用@Component时不是同一个,使用@Configuration时是同一个

第二个判断,判断的是两个被@AutoWired自动注入的变量是不是同一个,结论:不管使用的是@Component还是@Configuration,都是同一个,因为默认是单例的,其实这种情况跟本次讨论的@Component和@Configuration的对比没关系,放这里是怕理解出现混淆

第三个判断,判断的是多次调用@Bean方法,返回的对象是不是一个,结论:使用@Component时不是同一个,使用@Configuration时是同一个

关键词: 这种情况 使用的是