spring的事务的TransactionTemplate,其源码如下:
public class TransactionTemplate extends DefaultTransactionDefinition implements TransactionOperations, InitializingBean{ ... }
TransactionTemplate继承了DefaultTransactionDefinition,实现了TransactionOperations,InitializingBean接口。先研究InitializingBean接口,InitializingBean接口为bean提供了初始化方法的方式,它只包括afterPropertiesSet方法,凡是继承该接口的类,在初始化bean的时候会执行该方法。
测试实例如下:
package com.bijian.spring.initializingbean; import org.springframework.beans.factory.InitializingBean; public class TestInitializingBean implements InitializingBean{ @Override 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"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <bean id="testInitializingBean" class="com.bijian.spring.initializingbean.TestInitializingBean"></bean> </beans>
Main主程序如下:
package com.bijian.spring.initializingbean; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Main { public static void main(String[] args){ ApplicationContext context = new ClassPathXmlApplicationContext("initializingBeanConfigure.xml"); } }
运行Main程序,打印如下结果:
ceshi InitializingBean
这说明在spring初始化bean的时候,如果bean实现了InitializingBean接口,会自动调用afterPropertiesSet方法。
问题:实现InitializingBean接口与在配置文件中指定init-method有什么不同?
修改配置文件,加上init-method配置,修改如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <bean id="testInitializingBean" class="com.bijian.spring.initializingbean.TestInitializingBean" init-method="testInit"></bean> </beans>
在配置文件中加入init-method="testInit"。
运行Main程序,打印如下结果:
ceshi InitializingBean ceshi 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) { try { AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() { public Object run() throws Exception { //直接调用afterPropertiesSet ((InitializingBean) bean).afterPropertiesSet(); return null; } },getAccessControlContext()); } catch (PrivilegedActionException pae) { throw pae.getException(); } } else { //直接调用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"); } }
相关推荐
Spring中的InitializingBean接口的使用 在Spring框架中,InitializingBean接口是一个重要的接口,它提供了对bean的初始化方法。InitializingBean接口只有一个方法,即afterPropertiesSet方法,该方法将在bean的所有...
在Spring框架中,`org.springframework.beans.factory.InitializingBean`接口是一个非常重要的概念,它用于标记那些需要在初始化完成后执行特定逻辑的bean。这个接口只包含一个方法:`afterPropertiesSet()`,当bean...
本文将深入探讨Spring中的`InitializingBean`接口和`init-method`属性,这两个特性都与bean的初始化过程密切相关。 `InitializingBean`是Spring框架提供的一种回调机制,用于在bean实例化后进行额外的初始化工作。...
本篇文章将深入探讨Spring中与Bean相关的接口,以及它们如何帮助我们更好地理解和操作Bean。 首先,我们要了解`BeanFactory`接口。它是Spring中最基本的Bean容器,负责创建、配置和管理Bean。`BeanFactory`提供了一...
在Spring 3.0之前,初始化主要通过实现InitializingBean接口的afterPropertiesSet方法或在XML配置文件中指定init-method属性来完成。从Spring 3.0开始,推荐使用Java配置类中的@Bean注解来指定初始化方法。 4. 销毁...
1. **InitializingBean接口**: `InitializingBean`接口包含一个`afterPropertiesSet()`方法,它会在Bean的所有属性被设置好之后被调用,用于执行初始化任务。这与在配置文件中通过`init-method`指定的方法类似,但...
- 开发者可以通过实现InitializingBean接口或定义init-method属性来定义初始化方法,通过 DisposableBean接口或destroy-method属性来定义销毁方法。 5. **Spring的AOP代理**: - Spring通过两种类型的代理实现AOP...
如果一个Bean实现了Spring的InitializingBean接口,那么它必须重写`afterPropertiesSet()`方法。此方法会在所有属性设置完成后被调用,通常是在依赖注入完成后。 3. **XML配置或@Bean注解指定初始化方法** 在XML...
- 开发者可以通过实现InitializingBean接口的afterPropertiesSet()方法或使用@PostConstruct注解定义初始化逻辑,通过DisposableBean接口的destroy()方法或@PreDestroy注解定义销毁逻辑。 4. **IoC容器** - IoC...
`InitializingBean`和`DisposableBean`接口,以及`@PostConstruct`和`@PreDestroy`注解,是用来控制生命周期的方法。 8. **事件驱动**:Spring框架允许应用在特定事件(如bean的初始化或销毁)发生时进行响应。`...
在源码中,`org.springframework.beans.factory.config`包包含了许多关于生命周期的接口和类,如InitializingBean、DisposableBean以及BeanFactoryPostProcessor等。 6. **事件驱动模型**:Spring提供了基于...
5. **InitializingBean接口**:如果Bean实现了`InitializingBean`接口,Spring会在所有必需的属性设置后调用`afterPropertiesSet()`方法。这个接口的方法调用时机晚于`@PostConstruct`注解的方法,因此实例化顺序会...
在 BeanPostProcessor 的前置处理完成后,Spring 框架会执行 InitializingBean 接口。InitializingBean 是一种特殊的接口,用于在 Bean 对象创建完成后对其进行初始化。例如,可以使用 InitializingBean 来执行 Bean...
源码中,BeanLifeCycle接口和InitializingBean接口定义了这些生命周期方法。 四、Spring MVC Spring MVC是Spring提供的Web MVC框架,实现了Model-View-Controller模式。DispatcherServlet是核心组件,负责请求分发...
spring配置对象实例化后执行的方法,两种实现比对,通过InitializingBean接口,并实现arterPropertiesSet()方法;或者通过applicationContext.xml配置init-method属性
- **初始化**:Spring支持通过`init-method`属性指定初始化方法,也可以通过实现`InitializingBean`接口并覆盖`afterPropertiesSet()`方法来实现。这两种方式都可以确保在对象创建完成后立即执行特定的操作。 - **...
Spring没有内置的接口注入机制,但可以通过实现`InitializingBean`或`DisposableBean`接口来自定义初始化和销毁逻辑。例如: ```java public class UserService implements InitializingBean { private ...
- 实现了InitializingBean接口的Bean,可以自定义afterPropertiesSet方法来进行初始化操作。 - 实现了DisposableBean接口的Bean,可以自定义destroy方法来定义销毁行为。 除此之外,还可以通过XML配置文件或者注解...
Spring提供接口和注解来定制Bean的生命周期行为,例如`InitializingBean`和`DisposableBean`接口,以及`@PostConstruct`和`@PreDestroy`注解。反射使得Spring可以无侵入地调用这些生命周期方法。 3. **依赖注入(DI...