- 浏览: 95948 次
- 性别:
- 来自: 北京
文章分类
最新评论
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource"> <ref local="dataSource"></ref> </property> </bean> <bean id="baseTransactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="transactionManager"> <ref local="transactionManager" /> </property> <property name="transactionAttributes"> <props> <prop key="update">PROPAGATION_REQUIRED</prop> </props> </property> </bean> <bean id="service" parent="baseTransactionProxy"> <property name="target"> <ref local="service_target" /> </property> </bean> <bean id="service_target" class="test.spring.transaction.TestService" />
以上是spring声明式事务的一种方式。
当调用context.getBean("service"),代理的生成过程是怎样的?
TransactionProxyFactoryBean的父类AbstractSingletonProxyFactoryBean中有个方法afterPropertiesSet,在这个方法中(afterPropertiesSet方法是spring在初始化bean的的过程中,会调用该方法,通过实现该方法,为bean提供一些特定的行为。),会产生一个代理。
public void afterPropertiesSet() { if (this.target == null) { throw new IllegalArgumentException("Property 'target' is required"); } if (this.target instanceof String) { throw new IllegalArgumentException("'target' needs to be a bean reference, not a bean name as value"); } if (this.proxyClassLoader == null) { this.proxyClassLoader = ClassUtils.getDefaultClassLoader(); } ProxyFactory proxyFactory = new ProxyFactory(); if (this.preInterceptors != null) { for (Object interceptor : this.preInterceptors) { proxyFactory.addAdvisor(this.advisorAdapterRegistry.wrap(interceptor)); } } // Add the main interceptor (typically an Advisor). proxyFactory.addAdvisor(this.advisorAdapterRegistry.wrap(createMainInterceptor())); if (this.postInterceptors != null) { for (Object interceptor : this.postInterceptors) { proxyFactory.addAdvisor(this.advisorAdapterRegistry.wrap(interceptor)); } } proxyFactory.copyFrom(this); TargetSource targetSource = createTargetSource(this.target); proxyFactory.setTargetSource(targetSource); if (this.proxyInterfaces != null) { proxyFactory.setInterfaces(this.proxyInterfaces); } else if (!isProxyTargetClass()) { // Rely on AOP infrastructure to tell us what interfaces to proxy. proxyFactory.setInterfaces( ClassUtils.getAllInterfacesForClass(targetSource.getTargetClass(), this.proxyClassLoader)); } this.proxy = proxyFactory.getProxy(this.proxyClassLoader); }
spring 在bean生成之后,判断bean是否为FactoryBean,具体在AbstractBeanFactory的
getObjectForBeanInstance中。
如果是FactoryBean,将使用FactoryBeanRegistrySupport类(DetautListableFactory的父类)中的doGetObjectFromFactoryBean方法
private Object doGetObjectFromFactoryBean( final FactoryBean factory, final String beanName, final boolean shouldPostProcess) throws BeanCreationException { Object object; try { if (System.getSecurityManager() != null) { AccessControlContext acc = getAccessControlContext(); try { object = AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() { public Object run() throws Exception { return factory.getObject(); } }, acc); } catch (PrivilegedActionException pae) { throw pae.getException(); } } else { object = factory.getObject(); } } catch (FactoryBeanNotInitializedException ex) { throw new BeanCurrentlyInCreationException(beanName, ex.toString()); } catch (Throwable ex) { throw new BeanCreationException(beanName, "FactoryBean threw exception on object creation", ex); } // Do not accept a null value for a FactoryBean that's not fully // initialized yet: Many FactoryBeans just return null then. if (object == null && isSingletonCurrentlyInCreation(beanName)) { throw new BeanCurrentlyInCreationException( beanName, "FactoryBean which is currently in creation returned null from getObject"); } if (object != null && shouldPostProcess) { try { object = postProcessObjectFromFactoryBean(object, beanName); } catch (Throwable ex) { throw new BeanCreationException(beanName, "Post-processing of the FactoryBean's object failed", ex); } } return object; }
可以看到该方法中
object = factory.getObject();
调用了FactoryBean的getObjcet。
那么从AbstractSingletonProxyFactoryBean(TransactionProxyFactoryBean的父类)中的getObject方法中看到
public Object getObject() { if (this.proxy == null) { throw new FactoryBeanNotInitializedException(); } return this.proxy; }
方法返回了上面(afterPropertiesSet方法中生成的代理)产生的代理类。
因此getBean获取的是一个代理(jdk代理或cgLib代理)。
发表评论
-
context:component-scan探析
2011-05-12 12:06 3829个人网站:爱码社 spring的applicationCon ... -
spring解析context:annotation-config时所对应的处理类
2011-05-11 17:41 1868spring配置中的响应的处理类 context:compon ... -
Spring的循环依赖
2011-05-10 18:28 5764在Teradata的一次Java面试,说到了一个spring的 ... -
@Resource mapped-name is required
2011-03-22 11:13 2257使用Spring的注解方式,在JBoss下出现mapped-n ... -
Spring Framework 开发参考手册
2010-08-04 18:24 1149Spring Framework 开发参考手册 versio ... -
ServletContextAware接口
2010-08-04 18:06 13090在Spring中,凡是实现ServletContextAwar ... -
Spring创建一个Bean 耗时
2010-08-04 14:05 1784applicationContext中只有一个bean &l ... -
System.currentTimeMillis()
2010-08-04 13:47 4706System.currentTimeMillis(); 产生一 ... -
Spring源码阅读:XmlWebApplicationContext
2010-08-04 10:10 1687XmlWebApplicationContext是spring ... -
Spring源码阅读:ContextLoaderListener
2010-08-04 09:45 2922spring在web中的启动是由ContextLoaderLi ...
相关推荐
TransactionProxyFactoryBean是Spring提供的一种工具,用于创建带有事务策略的对象代理,它是基于动态代理实现的,能够帮助我们将事务管理逻辑与业务代码分离,提高代码的可维护性和可测试性。 首先,让我们了解...
在这个例子中,我们将聚焦于Spring的声明式事务管理,特别是通过`TransactionProxyFactoryBean`代理机制以及`@Transactional`注解与AOP(面向切面编程)的结合使用。 首先,`TransactionProxyFactoryBean`是Spring...
`TransactionProxyFactoryBean` 是Spring提供的一种工具,用于创建带有事务管理功能的代理对象,使得业务逻辑对象能够透明地参与到事务处理中。本示例将详细解析如何使用`TransactionProxyFactoryBean`进行声明式...
3. **配置TransactionProxyFactoryBean**:接下来,定义`TransactionProxyFactoryBean`实例,将其目标对象设置为目标服务Bean。此外,还需要配置事务管理器(通常是`DataSourceTransactionManager`),它负责具体的...
* 基于TransactionProxyFactoryBean的方式.(很少使用) * 需要为每个进行事务管理的类,配置一个TransactionProxyFactoryBean进行增强. * 基于AspectJ的XML方式.(经常使用) * 一旦配置好之后,类上不需要添加任何...
在给定的部分内容中,我们看到了Spring配置文件的一部分,展示了如何定义数据源、事务管理器以及使用`TransactionProxyFactoryBean`创建代理对象的过程。例如,`userDAOProxy`的`transactionAttributes`属性配置了`...
本文将深入探讨如何基于AOP(面向切面编程)来实现Spring的事务管理,特别是通过TransactionProxyFactoryBean。让我们一起探索这个主题。 首先,了解什么是AOP。AOP是Spring框架的核心特性,它允许我们在不修改业务...
TransactionProxyFactoryBean 是一个 FactoryBean,它可以创建一个代理对象,该代理对象可以拦截业务方法的调用,并对事务进行管理。这个代理对象使用 TransactionInterceptor 来实现事务处理,...
声明式事务管理的核心组件包括`PlatformTransactionManager`、`TransactionProxyFactoryBean`以及事务属性等。 ##### PlatformTransactionManager `PlatformTransactionManager`接口定义了平台特定的事务管理器,...
以下是关于Spring声明式事务配置方法的详细解释。 首先,Spring声明式事务管理主要依赖于AOP(面向切面编程)实现。通过在配置文件中定义事务的规则,Spring可以在特定的方法执行前后自动地进行事务的开启、提交、...
通过使用`TransactionProxyFactoryBean` 和合适的事务传播属性,我们可以将事务管理逻辑与业务代码解耦,实现事务的挂起和恢复,这对于处理分布式环境中的事务一致性至关重要。结合JTA,Spring能够作为一个强大的...
基于TransactionProxyFactoryBean的方式.(很少使用) 需要为每个进行事务管理的类,配置一个TransactionProxyFactoryBean进行增强. 基于AspectJ的XML方式.(经常使用) 一旦配置好之后,类上不需要添加任何东西 基于注解...
`TransactionProxyFactoryBean`允许我们为特定的DAO或服务类定义事务规则,如事务传播行为、隔离级别和超时设置。例如: ```xml <bean id="userDao" class="org.springframework.transaction.interceptor....
这是最常见的一种方式,通过`TransactionProxyFactoryBean`来创建一个事务代理。如示例代码所示,首先定义了一个`transactionManager`的bean,它是事务管理器,负责实际的事务控制。然后创建`fundServiceDAOProxy`...
1. **基于接口的事务代理(TransactionProxyFactoryBean)** 在第一种配置方式中,每个Bean都有一个单独的代理。首先,我们配置DataSource(如SessionFactory)和TransactionManager(如...
1. **事务管理**:OpenSessionInViewFilter并不负责事务的开启和提交,通常需要配合Spring的TransactionProxyFactoryBean或者@Transactional注解来管理事务。 2. **性能影响**:由于延长了Session的生命周期,可能...
1. **基于XML的TransactionProxyFactoryBean**:每个业务服务类都会有一个代理Bean,这个代理Bean通过`TransactionProxyFactoryBean`创建,并配置相应的事务管理器和目标业务Bean。例如: ```xml ...
4. **TransactionProxyFactoryBean**:这是一种使用代理模式的声明式事务配置方法,为DAO层的方法提供事务支持。 ```xml <bean id="userDao" class="org.springframework.transaction.interceptor....