关于spring:Spring-FrameWork从入门到NB-Lazyinitialized-Beans

42次阅读

共计 1753 个字符,预计需要花费 5 分钟才能阅读完成。

懒加载 Bean(Lazy-initialized Beans)的概念其实很简略,就是通过设置,Spring IoC 容器在初始化的过程中不对单例 Bean 进行实例化,而默认状况下会。

默认状况下 Spring IoC 容器初始化的过程中会创立所有的单例 Bean,“创立”的步骤包含实例化、以及实例化之后的属性填充,以及其余可能的前置后置操作(各种 beanpostprocessor),都会被调用。

个别状况下这种提前实例化也是必要的,因为提前实例化能够在系统启动的过程中执行,能够提前裸露实例创立以及依赖注入的谬误。而懒加载则不同,这类谬误须要在 Bean 被调用的时候能力裸露,而 Bean 被调用很可能是在系统启动之后的某一时刻,很可能是在系统升级上线的几天之后了。

懒加载能够通过 xml 配置文件指定:

<bean id="lazy" class="com.something.ExpensiveToCreateBean" lazy-init="true"/>
<bean name="not.lazy" class="com.something.AnotherBean"/>

也能够通过 @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

正文完
 0