花里胡哨的@Lazy注解

在这里插入图片描述

Spring IoC (ApplicationContext) 容器一般都会在启动的时候实例化所有单实例 bean 。目的:立即避免和检测所有可能的错误,而不是在运行时。比如发现命名相同的bean…
但是,有些情况下我们需要创建一个bean,而不是在应用程序上下文启动时,而是在我们请求时创建.那么这又是篇花里胡哨的文章了.

@Lazy

@Lazy注释起源于spring 4.0.x 新特性 参考文章Spring的版本变更

  • 核心容器改进
  1. Spring现在将泛型类型作为注入Beans时限定符的形式 。例如,如果您正在使用Spring Data Repository,则现在可以轻松注入一个特定的实现: @Autowired Repository customerRepository。
  2. 如果您使用Spring的元注释支持,现在可以开发自定义注释来 显示源注释中的特定属性。
  3. bean现在可以在自动装配到列表和数组中时进行排序。无论是标注和接口的支持。 @OrderOrdered
  4. 该@Lazy注释现在可以在注入点使用,以及对@Bean 定义。
  5. 该@Description批注已经推出了使用基于Java的配置开发。
  6. 已经通过注释添加 了有条件地过滤bean的通用模型@Conditional。这与@Profile支持类似,但允许以编程方式开发用户定义的策略。
  7. 基于CGLIB的代理类不再需要默认的构造函数。支持通过提供objenesis 其重新打包库在线,并将其作为Spring框架的一部分。有了这个策略,所有的构造函数都不再被调用代理实例。
  8. 整个框架现在都有管理时区的支持,例如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");
    }
}

发现与上面同样效果的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章