Spring扫描bean时我们通常使用@Component和@Configuration注解声明Spring Bean
如图:
@Component
第一段代码在执行new SimpleBeanConsumer(simpleBean()) 时simpleBean()会直接调用simpleBean()方法获取一个全新的SimpleBean对象实例。所以全局会有多个SimpleBean对象的实例。
@Configuration
第二段代码中使用@Bean标记的方法会被CGLIB动态代理,其工作原理是:如果方法是首次被调用那么原始的方法被执行并且结果对象会被注册到Spring ioc容器中,之后所有的对该方法的调用仅仅只是从Spring ioc容器中取回该对象返回给调用者。
解决@Component全局对象不一致的问题
在上面的第一段代码中,new SimpleBeanConsumer(simpleBean())只是纯Java方式的调用,多次调用该方法返回的是不同的对象实例。要修正第一段代码中的问题,可以使用@Autowired如下所示:
参考地址: