第2章:spring中的Bean/2.4 延迟初始化/2.4.1 概念
- 概念
- 针对作用域是singleton的Bean
- 默认情况下Bean的创建时在spring容器的启动阶段完成的,这样的好处是:
- 以后需要用到Bean的时候可以随时从容器中获取,而不需要再次创建
- 坏处是初始化阶段需要占用一定的资源,特别是那些比较复杂的bean更加会耗时,结果是会拖累spring容器的启动时间
- 默认情况下Bean的创建时在spring容器的启动阶段完成的,这样的好处是:
- 针对作用域是prototype总是延迟初始化,也就是在需要的时候再初始化
- 延迟初始化
- 概念:正是为了解决一些特定Ben的初始化问题,让这些bean再需要用到的时候再初始化
- 操作:通过引用该bean或者显式调用查找bean工作(也就是getBean操作)
第2章:spring中的Bean/2.4 延迟初始化/2.4.2 延迟操作实现/2.4.2.1 XML方式
- XML方式
- 设置全部的Bean都延迟
- 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">
- 调用结果:初始化操作在spring容器启动完成后
==============容器加载完成之后================
AccountDaoInMemoryImpl类初始化
AccountServiceImpl类初始化
- XML文件:设置延迟初始化标志,true表示为延迟,false表示为不延迟
- 设置某个Bean延迟
- 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">
- 设置某个Bean不延迟
<!-- 被依赖的bean的定义 -->
<bean id="accountDao" class="com.wiley.beginningspring.ch2.AccountDaoInMemoryImpl" lazy-init="false">
</bean>
- 调用结果:初始化操作在spring容器启动完成后
AccountDaoInMemoryImpl类初始化
==============容器加载完成之后================
AccountServiceImpl类初始化
- XML文件:设置延迟初始化标志,true表示为延迟,false表示为不延迟
第2章:spring中的Bean/2.4 延迟初始化/2.4.2 延迟操作实现/2.4.2.2 JAVA配置方式
- JAVA配置方式
- 使用@Lazy注解,其中true表示延迟,false表示不延迟
- 举例:
- 配置类定义:
@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;
}
- 调用结果:
AccountDao方法被调用
==============容器加载完成之后================
accountService方法被调用
- 配置类定义:
第2章:spring中的Bean/2.4 延迟初始化/2.4.2 延迟操作实现/2.4.2.3 注解方式
- 注解方式
- 在注解类上面也是使用@Lazy注解进行标识
- 举例:
- 注解类:
- 延迟
@Service
//延迟初始化
@Lazy(true)
public class AccountServiceImpl implements AccountService {
private AccountDao accountDao;
AccountServiceImpl(){
System.out.println("AccountServiceImpl类初始化");
}
- 不延迟
@Repository("accountDao")
//不延迟初始化,默认也是不延迟初始化,而且要求作用域范围是singleton
@Lazy(false)
public class AccountDaoInMemoryImpl implements AccountDao {
AccountDaoInMemoryImpl(){
System.out.println("AccountDaoInMemoryImpl类初始化");
}
- 延迟
- 调用结果:
AccountDaoInMemoryImpl类初始化
==============容器加载完成之后================
AccountServiceImpl类初始化
- 注解类:
第2章:spring中的Bean/2.4 延迟初始化/2.4.3 被依赖的Bean:延迟不生效
- 被依赖的Bean:延迟不生效
- 如果某个Bean(比如A)被其它的Bean依赖,如果其它Bean在spring容器启动时被初始化,那么某个Bean(比如A)的延迟机制不会生效
- 举例:
- 依赖的Bean,不设置了延迟机制
<bean id="accountService" class="com.wiley.beginningspring.ch2.AccountServiceImpl" lazy-init="false">
<!-- bean中某个属性的定义:它的初始化值为另外的一个bean -->
<property name="accountDaoDao" ref="accountDao" />
</bean>
- 被依赖的Bean,设置了延迟机制
<!-- 被依赖的bean的定义 -->
<bean id="accountDao" class="com.wiley.beginningspring.ch2.AccountDaoInMemoryImpl" lazy-init="true">
</bean>
- 调用结果:被依赖的Bean也被初始化了
AccountServiceImpl类初始化
AccountDaoInMemoryImpl类初始化
==============容器加载完成之后================
- 依赖的Bean,不设置了延迟机制