@Configuration public class AppConfig { @Bean public MyBean getMyBean() { MyBean myBean = new MyBean(); myBean.setName("Example"); return myBean; } // 其他的@Bean方法... }
上述是一个配置类,里面有个@Bean注解修饰,@Configuration
注解的类里面的方法在Spring容器启动时并不会立即执行,而是在需要获取被@Bean
注解标记的Bean实例时才会被调用。这样可以实现懒加载,只有在需要使用某个Bean时才去创建它。
如何获取到这个类呢
第一种:
@Autowired private MyBean myBean;
第二种:
@Autowired private ApplicationContext applicationContext;
public void someMethod() {
AppConfig appConfig= applicationContext.getBean(AppConfig.class);
MyBean myBean = appConfig.getMyBean();
// 使用获得的 MyBean 对象
}
需要注意的是默认情况下会注入同一个对象实例。这是因为被 @Bean
注解标记的方法的返回值默认是单例的,也就是说在整个应用程序的生命周期中,都会共享同一个对象实例。不管在哪个类里面调用,也都是同一个对象,
如果在任何地方重新对该对象 进行赋值,那么所有使用到这个对象的地方都会受到影响,因为它们引用的都是同一个对象实例
问题来了,当时多线程的时候,就会出现线程安全问题,对于这种线程安全问题,可以采取以下几种策略