易学笔记--第2章:spring中的Bean/2.4 延迟初始化

第2章:spring中的Bean/2.4 延迟初始化/2.4.1  概念

  1. 针对作用域是singleton的Bean
    1. 默认情况下Bean的创建时在spring容器的启动阶段完成的,这样的好处是:
      1. 以后需要用到Bean的时候可以随时从容器中获取,而不需要再次创建
      2. 坏处是初始化阶段需要占用一定的资源,特别是那些比较复杂的bean更加会耗时,结果是会拖累spring容器的启动时间
  2. 针对作用域是prototype总是延迟初始化,也就是在需要的时候再初始化
  3. 延迟初始化
    1. 概念:正是为了解决一些特定Ben的初始化问题,让这些bean再需要用到的时候再初始化
    2. 操作:通过引用该bean或者显式调用查找bean工作(也就是getBean操作)

第2章:spring中的Bean/2.4 延迟初始化/2.4.2  延迟操作实现/2.4.2.1 XML方式

  1. 设置全部的Bean都延迟
    1. XML文件:设置延迟初始化标志,true表示为延迟,false表示为不延迟

      <beans xmlns="http://www.springframework.org/schema/beans"

           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"

           default-lazy-init="true">

    2. 调用结果:初始化操作在spring容器启动完成后

      ==============容器加载完成之后================

      AccountDaoInMemoryImpl类初始化

      AccountServiceImpl类初始化

  2. 设置某个Bean延迟
    1. XML文件:设置延迟初始化标志,true表示为延迟,false表示为不延迟

      <beans xmlns="http://www.springframework.org/schema/beans"

           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"

           default-lazy-init="true">

    2. 设置某个Bean不延迟

      <!-- 被依赖的bean的定义 -->

           <bean id="accountDao" class="com.wiley.beginningspring.ch2.AccountDaoInMemoryImpl" lazy-init="false">

           </bean>

    3. 调用结果:初始化操作在spring容器启动完成后

      AccountDaoInMemoryImpl类初始化

      ==============容器加载完成之后================

      AccountServiceImpl类初始化


第2章:spring中的Bean/2.4 延迟初始化/2.4.2  延迟操作实现/2.4.2.2 JAVA配置方式

  1. 使用@Lazy注解,其中true表示延迟,false表示不延迟
  2. 举例:
    1. 配置类定义:

      @Bean

           //true:延迟初始化

           @Lazy(true)

           public AccountService accountService() {

                 System.out.println("accountService方法被调用");

                 AccountServiceImpl bean = new AccountServiceImpl();

                 bean.setAccountDao(accountDao());

                 return bean;

           }

           

           @Bean

           //false:不延迟初始化,默认就是不延迟初始化

           @Lazy(false)

           public AccountDao accountDao() {

                 System.out.println("AccountDao方法被调用");

                 AccountDao bean = new AccountDaoInMemoryImpl();

                 //depedencies of accountDao bean will be injected here...

                 return bean;

           }

    2. 调用结果:

      AccountDao方法被调用

      ==============容器加载完成之后================

      accountService方法被调用


第2章:spring中的Bean/2.4 延迟初始化/2.4.2  延迟操作实现/2.4.2.3 注解方式

  1. 在注解类上面也是使用@Lazy注解进行标识
  2. 举例:
    1. 注解类:
      1. 延迟

        @Service

        //延迟初始化

        @Lazy(true)

        public class AccountServiceImpl implements AccountService {

             private AccountDao accountDao;

             AccountServiceImpl(){

                System.out.println("AccountServiceImpl类初始化");

          }

      2. 不延迟

        @Repository("accountDao")

        //不延迟初始化,默认也是不延迟初始化,而且要求作用域范围是singleton

        @Lazy(false)

        public class AccountDaoInMemoryImpl implements AccountDao {

             

             AccountDaoInMemoryImpl(){

                System.out.println("AccountDaoInMemoryImpl类初始化");

          }

    2. 调用结果:

      AccountDaoInMemoryImpl类初始化

      ==============容器加载完成之后================

      AccountServiceImpl类初始化


第2章:spring中的Bean/2.4 延迟初始化/2.4.3  被依赖的Bean:延迟不生效

  1. 如果某个Bean(比如A)被其它的Bean依赖,如果其它Bean在spring容器启动时被初始化,那么某个Bean(比如A)的延迟机制不会生效
  2. 举例:
    1. 依赖的Bean,不设置了延迟机制

           <bean id="accountService" class="com.wiley.beginningspring.ch2.AccountServiceImpl"  lazy-init="false">

                 <!-- bean中某个属性的定义:它的初始化值为另外的一个bean -->

                 <property name="accountDaoDao" ref="accountDao" />

           </bean>

    2. 被依赖的Bean,设置了延迟机制

      <!-- 被依赖的bean的定义 -->

           <bean id="accountDao" class="com.wiley.beginningspring.ch2.AccountDaoInMemoryImpl" lazy-init="true">

           </bean>

    3. 调用结果:被依赖的Bean也被初始化了

      AccountServiceImpl类初始化

      AccountDaoInMemoryImpl类初始化

      ==============容器加载完成之后================

猜你喜欢

转载自blog.csdn.net/u011830122/article/details/83901843
今日推荐