`

关于TransactionProxyFactoryBean

阅读更多
       	   <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代理)。
分享到:
评论

相关推荐

    Spring使用TransactionProxyFactoryBean声明式事务配置实例

    TransactionProxyFactoryBean是Spring提供的一种工具,用于创建带有事务策略的对象代理,它是基于动态代理实现的,能够帮助我们将事务管理逻辑与业务代码分离,提高代码的可维护性和可测试性。 首先,让我们了解...

    spring 事务管理例子(TransactionProxyFactoryBean代理机制 和 tx/aop)

    在这个例子中,我们将聚焦于Spring的声明式事务管理,特别是通过`TransactionProxyFactoryBean`代理机制以及`@Transactional`注解与AOP(面向切面编程)的结合使用。 首先,`TransactionProxyFactoryBean`是Spring...

    Spring实战之使用TransactionProxyFactoryBean实现声明式事务操作示例

    `TransactionProxyFactoryBean` 是Spring提供的一种工具,用于创建带有事务管理功能的代理对象,使得业务逻辑对象能够透明地参与到事务处理中。本示例将详细解析如何使用`TransactionProxyFactoryBean`进行声明式...

    spring 事务代理配置

    3. **配置TransactionProxyFactoryBean**:接下来,定义`TransactionProxyFactoryBean`实例,将其目标对象设置为目标服务Bean。此外,还需要配置事务管理器(通常是`DataSourceTransactionManager`),它负责具体的...

    Spring+Hibernate事务管理

    * 基于TransactionProxyFactoryBean的方式.(很少使用) * 需要为每个进行事务管理的类,配置一个TransactionProxyFactoryBean进行增强. * 基于AspectJ的XML方式.(经常使用) * 一旦配置好之后,类上不需要添加任何...

    spring + hibernate 数据话持久层

    在给定的部分内容中,我们看到了Spring配置文件的一部分,展示了如何定义数据源、事务管理器以及使用`TransactionProxyFactoryBean`创建代理对象的过程。例如,`userDAOProxy`的`transactionAttributes`属性配置了`...

    spring基于AOP实现事务

    本文将深入探讨如何基于AOP(面向切面编程)来实现Spring的事务管理,特别是通过TransactionProxyFactoryBean。让我们一起探索这个主题。 首先,了解什么是AOP。AOP是Spring框架的核心特性,它允许我们在不修改业务...

    Spring源代码解析(六):Spring声明式事务处理.doc

    TransactionProxyFactoryBean 是一个 FactoryBean,它可以创建一个代理对象,该代理对象可以拦截业务方法的调用,并对事务进行管理。这个代理对象使用 TransactionInterceptor 来实现事务处理,...

    Spring配置事务在DAO层和业务逻辑层

    声明式事务管理的核心组件包括`PlatformTransactionManager`、`TransactionProxyFactoryBean`以及事务属性等。 ##### PlatformTransactionManager `PlatformTransactionManager`接口定义了平台特定的事务管理器,...

    spring声明式事务配置方法.docx

    以下是关于Spring声明式事务配置方法的详细解释。 首先,Spring声明式事务管理主要依赖于AOP(面向切面编程)实现。通过在配置文件中定义事务的规则,Spring可以在特定的方法执行前后自动地进行事务的开启、提交、...

    Implementing Transaction Suspension in Spring

    通过使用`TransactionProxyFactoryBean` 和合适的事务传播属性,我们可以将事务管理逻辑与业务代码解耦,实现事务的挂起和恢复,这对于处理分布式环境中的事务一致性至关重要。结合JTA,Spring能够作为一个强大的...

    spring-transaction

    基于TransactionProxyFactoryBean的方式.(很少使用) 需要为每个进行事务管理的类,配置一个TransactionProxyFactoryBean进行增强. 基于AspectJ的XML方式.(经常使用) 一旦配置好之后,类上不需要添加任何东西 基于注解...

    Spring的五种事务配置方式[参照].pdf

    `TransactionProxyFactoryBean`允许我们为特定的DAO或服务类定义事务规则,如事务传播行为、隔离级别和超时设置。例如: ```xml &lt;bean id="userDao" class="org.springframework.transaction.interceptor....

    Spring中的四种声明式事务的配置

    这是最常见的一种方式,通过`TransactionProxyFactoryBean`来创建一个事务代理。如示例代码所示,首先定义了一个`transactionManager`的bean,它是事务管理器,负责实际的事务控制。然后创建`fundServiceDAOProxy`...

    Spring事务配置的五种方式

    1. **基于接口的事务代理(TransactionProxyFactoryBean)** 在第一种配置方式中,每个Bean都有一个单独的代理。首先,我们配置DataSource(如SessionFactory)和TransactionManager(如...

    关于OpenSessionInViewFilter的学习

    1. **事务管理**:OpenSessionInViewFilter并不负责事务的开启和提交,通常需要配合Spring的TransactionProxyFactoryBean或者@Transactional注解来管理事务。 2. **性能影响**:由于延长了Session的生命周期,可能...

    spring事务配置详解

    1. **基于XML的TransactionProxyFactoryBean**:每个业务服务类都会有一个代理Bean,这个代理Bean通过`TransactionProxyFactoryBean`创建,并配置相应的事务管理器和目标业务Bean。例如: ```xml ...

    spring声明式事务配置

    4. **TransactionProxyFactoryBean**:这是一种使用代理模式的声明式事务配置方法,为DAO层的方法提供事务支持。 ```xml &lt;bean id="userDao" class="org.springframework.transaction.interceptor....

Global site tag (gtag.js) - Google Analytics