Spring IoC (ApplicationContext) 容器一般都会在启动的时候实例化所有单实例 bean 。目的:立即避免和检测所有可能的错误,而不是在运行时。比如发现命名相同的bean…
但是,有些情况下我们需要创建一个bean,而不是在应用程序上下文启动时,而是在我们请求时创建.那么这又是篇花里胡哨的文章了.
@Lazy
@Lazy注释起源于spring 4.0.x 新特性 参考文章Spring的版本变更
- 核心容器改进
- Spring现在将泛型类型作为注入Beans时限定符的形式 。例如,如果您正在使用Spring Data Repository,则现在可以轻松注入一个特定的实现: @Autowired Repository customerRepository。
- 如果您使用Spring的元注释支持,现在可以开发自定义注释来 显示源注释中的特定属性。
- bean现在可以在自动装配到列表和数组中时进行排序。无论是标注和接口的支持。 @OrderOrdered
- 该@Lazy注释现在可以在注入点使用,以及对@Bean 定义。
- 该@Description批注已经推出了使用基于Java的配置开发。
- 已经通过注释添加 了有条件地过滤bean的通用模型@Conditional。这与@Profile支持类似,但允许以编程方式开发用户定义的策略。
- 基于CGLIB的代理类不再需要默认的构造函数。支持通过提供objenesis 其重新打包库在线,并将其作为Spring框架的一部分。有了这个策略,所有的构造函数都不再被调用代理实例。
- 整个框架现在都有管理时区的支持,例如LocaleContext。
使用Configuration方式
创建Configuration配置类,并加入@Lazy
@Lazy
@Configuration
public class LazyConfig {
@Bean
public TLazy getTLazy(){
return new TLazy();
}
}
- 创建bean-TLazy
public class TLazy {
@PostConstruct
public void init(){
System.out.println("------------懒加中---------");
}
public void say(){
System.out.println("hello!! 我更帅!!!");
}
}
- 用@PostConstruct注解,在bean创建时会打印出
------------懒加中---------
- 创建test
@SpringBootTest
@RunWith(SpringRunner.class)
public class testControllerTest {
@Lazy
@Autowired
private TLazy tLazy;
@Test
public void hello() {
// tLazy.say();
System.out.println("hello");
}
}
- 运行,发现控制台只打印出hello
hello
- 放开tLazy.say(); 发现控制台打印出
------------TLazy懒加中---------
hello!! 我更帅!!!
hello
@Autowired模式
- 创建TAutoLazy
@Lazy
@Component
public class TAutoLazy {
@PostConstruct
public void init(){
System.out.println("------------TAutoLazy懒加中---------");
}
public void say(){
System.out.println("TAutoLazy!! 我更帅!!!");
}
}
- testControllerTest
@SpringBootTest
@RunWith(SpringRunner.class)
public class testControllerTest {
@Lazy
@Autowired
private TAutoLazy tAutoLazy;
@Test
public void hello() {
// tAutoLazy.say();
System.out.println("hello");
}
}
发现与上面同样效果的