懒加载Bean(Lazy-initialized Beans)的概念其实很简单,就是通过设置,Spring IoC容器在初始化的过程中不对单例Bean进行实例化,而默认情况下会。
默认情况下Spring IoC容器初始化的过程中会创建所有的单例Bean,“创建”的步骤包括实例化、以及实例化之后的属性填充,以及其他可能的前置后置操作(各种beanpostprocessor),都会被调用。
一般情况下这种提前实例化也是必要的,因为提前实例化可以在系统启动的过程中执行,可以提前暴露实例创建以及依赖注入的错误。而懒加载则不同,这类错误需要在Bean被调用的时候才能暴露,而Bean被调用很可能是在系统启动之后的某一时刻,很可能是在系统升级上线的几天之后了。
懒加载可以通过xml配置文件指定:
也可以通过@Lazy注解指定。
我们对前面的用例简单修改验证一下懒加载。首先修改DependencyB,增加无参构造器,打印一句话:
public DependencyB(){
System.out.println("This is DependencyB constructor running...");
}
同样,DependencyA也增加构造器:
public DependencyA(){
System.out.println("This is DependencyA constructor running...");
}
然后修改启动类,只初始化Spring,不获取Bean:
public class App {
public static void main(String[] args) {
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MyConfiguration.class);
System.out.println("I am Ok...");
}
执行启动类:
This is DependencyB constructor running...
This is DependencyA constructor running...
I am Ok...
虽然没有从Spring IoC容器获取Bean,但是可以看到DependencyB和DependencyA都被实例化了。
下面首先修改DependencyA,懒加载:
@Service
@Primary
@Scope("prototype")
@Lazy
public class DependencyA implements IDependencyA {
@Override
public void test(){
System.out.println("I am DependencyA test...");
}
public DependencyA(){
System.out.println("This is DependencyA constructor running...");
}
}
执行启动类:
This is DependencyB constructor running...
This is DependencyA constructor running...
I am Ok...
居然没有起作用???
再修改DependencyB试试:
I am Ok...
修改DependencyB为懒加载后,生效了,执行启动类后发现DependencyB和DependencyA都没有被实例化。
以上DependencyA懒加载设置无效的原因:懒加载和依赖关系有关,如果一个懒加载的BeanA被另外一个非懒加载的单例BeanB依赖的话,那么BeanA的懒加载设置会失效,因为BeanB作为单例Bean在Spring IoC初始化的过程中会被实例化,他所依赖的对象BeanA也必须被实例化以确保BeanB的可用性。
个人觉得懒加载的实用性不太强,一般情况下我们使用Spring的默认设置就好。
上一篇 Spring FrameWork从入门到NB -Bean Scopes
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
🐊🐊🐊🐊🐊好多小鳄鱼 一、关于串口通信: Qt的确有自己的串口通信类,就是QSerialPort,但是我们在使用过程中因为要更加定制化的使用串口通信类减小开发的难度,所以我们会提供一个串口通信类,也就是这个SerialPortHelper类。 首先我们要知道什…