- 浏览: 188342 次
- 性别:
- 来自: 上海
文章分类
最新评论
ApplicationContext实现的默认行为就是在启动时将所有singleton bean提前进行实例化。提前实例化意味着作为初始化过程的一部分,ApplicationContext实例会创建并配置所有的singleton bean。通常情况下这是件好事,因为这样在配置中的任何错误就会即刻被发现(否则的话可能要花几个小时甚至几天)。
有时候这种默认处理可能并不是你想要的。如果你不想让一个singleton bean在ApplicationContext实现在初始化时被提前实例化,那么可以将bean设置为延迟实例化。一个延迟初始化bean将告诉IoC 容器是在启动时还是在第一次被用到时实例化。
在XML配置文件中,延迟初始化将通过<bean/>元素中的lazy-init属性来进行控制。例如:
<bean id="lazy" class="com.foo.ExpensiveToCreateBean" lazy-init="true">
<!-- various properties here... -->
</bean>
<bean name="not.lazy" class="com.foo.AnotherBean">
<!-- various properties here... -->
</bean>当ApplicationContext实现加载上述配置时,设置为lazy的bean将不会在ApplicationContext启动时提前被实例化,而not.lazy却会被提前实例化。
需要说明的是,如果一个bean被设置为延迟初始化,而另一个非延迟初始化的singleton bean依赖于它,那么当ApplicationContext提前实例化singleton bean时,它必须也确保所有上述singleton 依赖bean也被预先初始化,当然也包括设置为延迟实例化的bean。因此,如果Ioc容器在启动的时候创建了那些设置为延迟实例化的bean的实例,你也不要觉得奇怪,因为那些延迟初始化的bean可能在配置的某个地方被注入到了一个非延迟初始化singleton bean里面。
在容器层次中通过在<beans/>元素上使用'default-lazy-init'属性来控制延迟初始化也是可能的。如下面的配置:
<beans default-lazy-init="true">
<!-- no beans will be eagerly pre-instantiated... -->
</beans>
1、init-method方法,初始化bean的时候执行,可以针对某个具体的bean进行配置。init-method需要在applicationContext.xml配置文档中bean的定义里头写明。例如:
这样,当TestBean在初始化的时候会执行TestBean中定义的init方法。
2、afterPropertiesSet方法,初始化bean的时候执行,可以针对某个具体的bean进行配置。afterPropertiesSet 必须实现 InitializingBean接口。实现 InitializingBean接口必须实现afterPropertiesSet方法。
3、BeanPostProcessor,针对所有Spring上下文中所有的bean,可以在配置文档applicationContext.xml中配置一个BeanPostProcessor,然后对所有的bean进行一个初始化之前和之后的代理。BeanPostProcessor接口中有两个方法: postProcessBeforeInitialization和postProcessAfterInitialization。 postProcessBeforeInitialization方法在bean初始化之前执行, postProcessAfterInitialization方法在bean初始化之后执行。
总之,afterPropertiesSet 和init-method之间的执行顺序是afterPropertiesSet 先执行,init-method 后执行。从BeanPostProcessor的作用,可以看出最先执行的是postProcessBeforeInitialization,然后是afterPropertiesSet,然后是init-method,然后是postProcessAfterInitialization。
some mark from http://mojianpo.iteye.com/blog/803707
有时候这种默认处理可能并不是你想要的。如果你不想让一个singleton bean在ApplicationContext实现在初始化时被提前实例化,那么可以将bean设置为延迟实例化。一个延迟初始化bean将告诉IoC 容器是在启动时还是在第一次被用到时实例化。
在XML配置文件中,延迟初始化将通过<bean/>元素中的lazy-init属性来进行控制。例如:
<bean id="lazy" class="com.foo.ExpensiveToCreateBean" lazy-init="true">
<!-- various properties here... -->
</bean>
<bean name="not.lazy" class="com.foo.AnotherBean">
<!-- various properties here... -->
</bean>当ApplicationContext实现加载上述配置时,设置为lazy的bean将不会在ApplicationContext启动时提前被实例化,而not.lazy却会被提前实例化。
需要说明的是,如果一个bean被设置为延迟初始化,而另一个非延迟初始化的singleton bean依赖于它,那么当ApplicationContext提前实例化singleton bean时,它必须也确保所有上述singleton 依赖bean也被预先初始化,当然也包括设置为延迟实例化的bean。因此,如果Ioc容器在启动的时候创建了那些设置为延迟实例化的bean的实例,你也不要觉得奇怪,因为那些延迟初始化的bean可能在配置的某个地方被注入到了一个非延迟初始化singleton bean里面。
在容器层次中通过在<beans/>元素上使用'default-lazy-init'属性来控制延迟初始化也是可能的。如下面的配置:
<beans default-lazy-init="true">
<!-- no beans will be eagerly pre-instantiated... -->
</beans>
1、init-method方法,初始化bean的时候执行,可以针对某个具体的bean进行配置。init-method需要在applicationContext.xml配置文档中bean的定义里头写明。例如:
这样,当TestBean在初始化的时候会执行TestBean中定义的init方法。
2、afterPropertiesSet方法,初始化bean的时候执行,可以针对某个具体的bean进行配置。afterPropertiesSet 必须实现 InitializingBean接口。实现 InitializingBean接口必须实现afterPropertiesSet方法。
3、BeanPostProcessor,针对所有Spring上下文中所有的bean,可以在配置文档applicationContext.xml中配置一个BeanPostProcessor,然后对所有的bean进行一个初始化之前和之后的代理。BeanPostProcessor接口中有两个方法: postProcessBeforeInitialization和postProcessAfterInitialization。 postProcessBeforeInitialization方法在bean初始化之前执行, postProcessAfterInitialization方法在bean初始化之后执行。
总之,afterPropertiesSet 和init-method之间的执行顺序是afterPropertiesSet 先执行,init-method 后执行。从BeanPostProcessor的作用,可以看出最先执行的是postProcessBeforeInitialization,然后是afterPropertiesSet,然后是init-method,然后是postProcessAfterInitialization。
some mark from http://mojianpo.iteye.com/blog/803707
发表评论
文章已被作者锁定,不允许评论。
-
spring boot
2017-11-22 14:12 0spring boot service mesh spring ... -
spring 线程池
2016-07-10 10:26 511一、初始化 1,直接调用 [java] view plai ... -
Reactor、Disruptor
2016-04-27 12:55 1074Reactor 主要用于帮助开发者创建基于JVM的异步应用程序 ... -
mybatis 帮助文档
2016-04-22 11:01 494http://www.mybatis.org/mybatis- ... -
spring mybatis
2016-03-25 15:43 539org.mybatis.spring.SqlSessionTe ... -
mybatis深入
2016-03-21 13:59 482-------Mybatis数据源与连 ... -
关于 mybatis 传参
2016-03-18 10:46 550基本数据类型:包含int,String,Date等。基本数据类 ... -
spring 加载配置文件 xml 和properties
2016-03-17 17:12 2933Spring配置文件是集成了Spring框架的项目的核心,引擎 ... -
spring 事务 提交
2016-03-07 15:16 780如果你不启用事务,默认是自动提交的,不需要设置autoComm ... -
mybatis 、jdbc 、 spring事务模板
2016-03-04 16:22 850mybatis深入: http://b ... -
mybatis 转义字符
2015-11-28 16:23 20521、在xml的sql语句中,不能直接用大于号、小于号要用转义字 ... -
mybatis jdbc 字段映射类型
2015-09-29 14:38 2107mybatis常用jdbcType数据类型 MyBati ... -
org.springframework.jdbc.support.lob.DefaultLobHandler
2015-06-04 10:51 604http://www.ibm.com/developerwor ... -
spring bean 继承与 java 继承异同
2015-01-08 10:36 795bean的定义中可能会包含 ... -
Spring MethodInterceptor
2015-01-05 18:23 794我们知道在Spring中一共提供了四种Advice用来支持对方 ... -
Spring BeanNameAutoProxyCreator 与 ProxyFactoryBean
2015-01-05 18:10 817一般我们可以使用ProxyBeanFactory,并配置pro ... -
Spring aop 原理及各种应用场景
2015-01-05 17:16 8160AOP是Aspect Oriented Programing的 ... -
ibatis逻辑分页与物理分页
2014-12-31 14:26 581一 直以来ibatis的分页都是通过滚动ResultSet实现 ... -
iBATIS mybatis 配置 说明
2014-12-30 17:27 1448SqlMapClientFactoryBean的主要的几个属性 ... -
mysql 中mybatis 传参与返回参数
2014-12-26 11:11 2018传入参数必须与配置文件中标明的参数一致 如 <selec ...
相关推荐
Spring 框架生命周期和 Bean 实例化过程 Spring 框架是一个非常流行的 Java Web 应用...同时,init-method 和 destroy-method 属性、BeanPostProcessor 接口也是非常重要的概念,它们可以用来动态扩展和修改 Bean。
前者是Spring提供的用于Bean定义加载和处理的类,后者则是支持自动装配功能的BeanFactory的默认实现,这个类实现了Spring框架核心的Bean生命周期方法。 在实际开发过程中,了解和掌握Bean的生命周期有助于我们更好...
如果Bean定义了初始化回调方法,如`init-method`属性指定的方法,Spring会在初始化后执行这个方法。 9. **Bean的销毁**: 对于Singleton Bean,Spring在容器关闭时会调用`@PreDestroy`注解的方法和实现...
BeanFactory是Spring的基本容器,采用延迟加载策略,只有在调用`getBean`方法时才会初始化Bean。而ApplicationContext不仅包含了BeanFactory的所有功能,还支持国际化、事件广播、资源加载等功能,并且在启动时就...
例如,我们可以创建一个`ApplicationContext`实例,如`ClassPathXmlApplicationContext`,并传入包含配置信息的XML文件路径,如`"spring.xml"`和`"spring1.xml"`,来启动容器并加载Bean的定义。 Spring提供了多种...
此外,Spring提供了BeanPostProcessor接口,允许我们在Bean初始化前后进行自定义处理。通过实现`postProcessBeforeInitialization()`和`postProcessAfterInitialization()`方法,可以在Bean实例化和初始化之后进行...
Spring bean 加载执行顺序实例解析 在 Spring 框架中,Bean 的加载和执行顺序是一个非常重要的...通过这个示例,我们可以看到 Spring Bean 的加载和执行顺序,并了解了 InitializingBean 和 init-method 的使用方法。
3. **初始化**:在属性注入完成后,Spring会执行Bean实现的初始化回调方法,这些方法可以通过实现`InitializingBean`接口的`afterPropertiesSet()`方法或者使用`init-method`属性来指定。此外,还可以通过配置`@...
Spring允许我们为Bean定义初始化方法(init-method)和销毁方法(destroy-method)。在Bean实例化后,Spring会调用指定的初始化方法进行进一步的配置或准备。同样,在容器关闭前,如果Bean声明了销毁方法,Spring会...
在Spring 3.0之前,初始化主要通过实现InitializingBean接口的afterPropertiesSet方法或在XML配置文件中指定init-method属性来完成。从Spring 3.0开始,推荐使用Java配置类中的@Bean注解来指定初始化方法。 4. 销毁...
使用注解的方式,可以在配置类中通过`@Bean(initMethod="init", destroyMethod="destroy")`来指定。对于单例bean,Spring会在容器关闭时调用销毁方法;而对于多例bean,Spring只负责初始化,不管理其销毁。 其次,...
- 或者,如果在配置中指定了 `init-method`,Spring 也会调用相应的自定义初始化方法。 - `BeanPostProcessor` 的 `postProcessAfterInitialization` 方法在 Bean 初始化之后运行,进一步增强 Bean。 - **Bean ...
Spring的BeanDefinition是用来存储Bean的配置信息,包括Bean的类名、作用域、属性值、依赖的其他Bean、是否为单例、是否延迟加载等。这些信息在容器启动时解析并转化为BeanDefinition对象,后续的Bean实例化和管理都...
而ApplicationContext是BeanFactory的子接口,除了继承BeanFactory的所有功能外,还提供了一些企业级的支持,例如消息源、资源加载和国际化支持。 16、SpringIoC的实现机制。 Spring IoC容器通过依赖注入模式实现了...
- `@Bean`中的`initMethod`属性:指定初始化方法。 - **销毁**: - `DisposableBean`接口:实现该接口的类会在bean销毁前调用`destroy()`方法。 - `@PreDestroy`:用于标记在销毁前执行的方法。 - `@Bean`中的`...
Bean可以通过实现InitializingBean接口并覆盖`afterPropertiesSet()`方法,或者定义一个`init-method`属性指定初始化方法。此外,如果Bean实现了ApplicationContextAware接口,Spring会在初始化时注入...
2. **BeanPostProcessor接口**:实现这个接口的类可以定义两个方法`postProcessBeforeInitialization()`和`postProcessAfterInitialization()`,分别在Bean初始化前和后进行处理。 3. **@PostConstruct注解**:在...
此外,还可以通过实现`InitializingBean`接口的`afterPropertiesSet()`方法或指定`init-method`属性来定义初始化方法。 在示例中,`Car`类被标记为`@Component`,因此Spring会自动管理和初始化这个Bean。`@...
此外,如果Bean实现了`InitializingBean`接口,Spring会调用`afterPropertiesSet()`方法。另外,还可以通过`init-method`属性指定一个非注解的方法作为初始化方法。 2. **依赖注入**:Spring会根据Bean定义中的属性...