跨模块的bean配置如何spring bean的初始化化

在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
点击阅读原文
Spring4.x常用配置(三):Bean的初始化和销毁
日 发布,来源:
在我们进行实际开发的时候,经常遇到在Bean之前使用之前或者之后做些必要的操作,Spring对Bean的生命周期的操作提供了支持。在使用Java配置和注解配置下提供如下两种方式:
1. Java配置方式:使用@Bean的initMethod和destroyMethod(相当于xml配置的init-method和destory-method)。
2. 注解方式:利用JSR-250的@PostConstruct和@PreDestroy
1. 增加JSR250支持
&dependency&
&groupId&javax.annotation&/groupId&
&artifactId&jsr250-api&/artifactId&
&version&1.0&/version&
&/dependency&
2. 使用@Bean形式的Bean
package org.light4j.sping4.usually.
public class BeanWayService {
public void init(){
System.out.println("@Bean-init-method");
public BeanWayService() {
System.out.println("初始化构造函数-BeanWayService");
public void destroy(){
System.out.println("@Bean-destory-method");
3.使用JSR250形式的Bean
package org.light4j.sping4.usually.
import javax.annotation.PostC
import javax.annotation.PreD
public class JSR250WayService {
@PostConstruct //①
public void init(){
System.out.println("jsr250-init-method");
public JSR250WayService() {
System.out.println("初始化构造函数-JSR250WayService");
@PreDestroy //②
public void destroy(){
System.out.println("jsr250-destory-method");
① @PostConstruct,在构造函数执行完之后执行。
② @PreDestroy,在Bean销毁之前执行。
package org.light4j.sping4.usually.
import org.springframework.context.annotation.B
import org.springframework.context.annotation.ComponentS
import org.springframework.context.annotation.C
@Configuration
@ComponentScan("org.light4j.sping4.usually.prepost")
public class PrePostConfig {
@Bean(initMethod="init",destroyMethod="destroy") //①
BeanWayService beanWayService(){
return new BeanWayService();
JSR250WayService jsr250WayService(){
return new JSR250WayService();
代码解释:
① initMethod和destroyMethod指定BeanWayService类的init和destroy方法在构造函数之后,Bean销毁之前执行。
package org.light4j.sping4.usually.
import org.springframework.context.annotation.AnnotationConfigApplicationC
public class Main {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(PrePostConfig.class);
BeanWayService beanWayService = context.getBean(BeanWayService.class);
JSR250WayService jsr250WayService = context.getBean(JSR250WayService.class);
context.close();
运行结果如下图所示:
6. 源代码示例:
github地址:
码云地址:
微信扫一扫,打赏作者吧~
欢迎关注人生设计师的微信公众账号
未经允许不得转载: >>
我要该,理由是:
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)下次自动登录
现在的位置:
& 综合 & 正文
Spring容器中的Bean几种初始化方法和销毁方法的先后顺序
,Spring 允许 Bean 在初始化完成后以及销毁前执行特定的操作。下面是常用的三种指定特定操作的方法:
通过实现InitializingBean/DisposableBean 接口来定制初始化之后/销毁之前的操作方法;
通过&bean& 元素的 init-method/destroy-method属性指定初始化之后 /销毁之前调用的操作方法;
在指定方法上加上@PostConstruct或@PreDestroy注解来制定该方法是在初始化之后还是销毁之前调用。
这几种配置方式,执行顺序是怎样的呢?我们通过例子来研究下:
Spring配置文件:
运行InitAndDestroySeqBean的main方法,结果如下:
从执行结果可以看出:
Bean在实例化的过程中:Constructor & @PostConstruct &InitializingBean & init-method
Bean在销毁的过程中:@PreDestroy & DisposableBean & destroy-method
【上篇】【下篇】Spring中bean的初始化和销毁之前的方法XML和注解的两种形式_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
享专业文档下载特权
&赠共享文档下载特权
&10W篇文档免费专享
&每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
Spring中bean的初始化和销毁之前的方法XML和注解的两种形式
你可能喜欢spring两种初始化bean的方法
最近工作需要得到sping中的每个事物需要执行的sql,称机会简单研究了一下spring的事务,项目中管理事务比较简单,用TransactionTemplate,就直接以TransactionTemplate为入口开始学习。TransactionTemplate的源码如下:public class TransactionTemplate extends DefaultTransactionDefinition
implements TransactionOperations, InitializingBean{
}TransactionTemplate继承了DefaultTransactionDefinition,实现了TransactionOperations,InitializingBean接口。先研究InitializingBean接口InitializingBean接口为bean提供了初始化方法的方式,它只包括afterPropertiesSet方法,凡是继承该接口的类,在初始化bean的时候会执行该方法。测试程序如下:import org.springframework.beans.factory.InitializingBpublic class TestInitializingBean implements InitializingBean{
public void afterPropertiesSet() throws Exception {
System.out.println("ceshi InitializingBean");
public void testInit(){
System.out.println("ceshi init-method");
}}配置文件如下:&?xml version="1.0" encoding="UTF-8"?&&beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"&
&bean id="testInitializingBean" class="com.TestInitializingBean" &&/bean&&/beans&Main主程序如下:public class Main {
public static void main(String[] args){
ApplicationContext context = new FileSystemXmlApplicationContext("/src/main/java/com/beans.xml");
}}运行Main程序,打印如下结果:ceshi InitializingBean
这说明在spring初始化bean的时候,如果bean实现了InitializingBean接口,会自动调用afterPropertiesSet方法。问题:实现InitializingBean接口与在配置文件中指定init-method有什么不同?修改配置文件,加上init-method配置,修改如下:&?xml version="1.0" encoding="UTF-8"?&&beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"&
&bean id="testInitializingBean" class="com.TestInitializingBean" init-method="testInit"&&/bean&&/beans&在配置文件中加入init-method="testInit"。运行Main程序,打印如下结果:ceshi InitializingBeanceshi init-method由结果可看出,在spring初始化bean的时候,如果该bean是实现了InitializingBean接口,并且同时在配置文件中指定了init- method,系统则是先调用afterPropertiesSet方法,然后在调用init-method中指定的方法。这方式在spring中是怎么实现的?通过查看spring的加载bean的源码类(AbstractAutowireCapableBeanFactory)可看出其中奥妙AbstractAutowireCapableBeanFactory类中的invokeInitMethods讲解的非常清楚,源码如下:protected void invokeInitMethods(String beanName, final Object bean, RootBeanDefinition mbd)
throws Throwable {//判断该bean是否实现了实现了InitializingBean接口,如果实现了InitializingBean接口,则只掉调用bean的afterPropertiesSet方法
boolean isInitializingBean = (bean instanceof InitializingBean);
if (isInitializingBean && (mbd == null || !mbd.isExternallyManagedInitMethod("afterPropertiesSet")))
if (logger.isDebugEnabled()) {
logger.debug("Invoking afterPropertiesSet() on bean with name '" + beanName + "'");
if (System.getSecurityManager() != null) {
AccessController.doPrivileged(new PrivilegedExceptionAction&Object&() {
public Object run() throws Exception {
//直接调用afterPropertiesSet
((InitializingBean) bean).afterPropertiesSet();
},getAccessControlContext());
} catch (PrivilegedActionException pae) {
throw pae.getException();
//直接调用afterPropertiesSet
((InitializingBean) bean).afterPropertiesSet();
if (mbd != null) {
String initMethodName = mbd.getInitMethodName();
//判断是否指定了init-method方法,如果指定了init-method方法,则再调用制定的init-method
if (initMethodName != null && !(isInitializingBean && "afterPropertiesSet".equals(initMethodName))
!mbd.isExternallyManagedInitMethod(initMethodName)) {
//进一步查看该方法的源码,可以发现init-method方法中指定的方法是通过反射实现
invokeCustomInitMethod(beanName, bean, mbd);
}总结:1:spring为bean提供了两种初始化bean的方式,实现InitializingBean接口,实现afterPropertiesSet方法,或者在配置文件中同过init-method指定,两种方式可以同时使用2:实现InitializingBean接口是直接调用afterPropertiesSet方法,比通过反射调用init-method指定的方法效率相对来说要高点。但是init-method方式消除了对spring的依赖3:如果调用afterPropertiesSet方法时出错,则不调用init-method指定的方法。4:TransactionTemplate实现InitializingBean接口,主要是判断transactionManager是否已经初始化,如果没有则抛出异常。源码如下:
public void afterPropertiesSet() {
if (this.transactionManager == null) {
throw new IllegalArgumentException("Property 'transactionManager' is required");
java:运用spring的初始化接口InitializingBean实现在项目启动时修改数据库
Spring bean初始化原理详解
Spring注解配置初始化对象(&bean&)
Spring框架下类的初始化顺序
Spring Bean初始化之后执行指定方法
没有更多推荐了,

我要回帖

更多关于 springbean初始化时机 的文章

 

随机推荐