用DefaultAdvisorAutoProxyCreator自动创建事务代理
2008年04月25日 星期五 09:36
-----------------------------------------------------------------------------------------------------------
Spring编程式事务管理
用DefaultAdvisorAutoProxyCreator自动创建事务代理
-----------------------------------------------------------------------------------------------------------
drop TABLE sampledb.orders;
CREATE TABLE sampledb.orders(
`ID` BIGINT NOT NULL,
`ORDER_NUMBER` VARCHAR(15),
`CUSTOMER_ID` BIGINT,
PRIMARY KEY(`ID`)
)
ENGINE = InnoDB;
drop TABLE `sampledb`.`customers`;
CREATE TABLE `sampledb`.`customers` (
`ID` BIGINT NOT NULL,
`NAME` VARCHAR(45),
PRIMARY KEY(`ID`)
)
ENGINE = InnoDB;
alter table sampledb.orders
add constraint constraint_constraint_fk
foreign key (CUSTOMER_ID)
references sampledb.customers(ID);
-----------------------------------------------------------------------------------------------------------
applicationContext.xml
-----------------------------------------------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
<bean
>
<property
value="com.mysql.jdbc.Driver">
</property>
<property
value="jdbc:mysql://localhost:3306/sampledb">
</property>
<property value="root"></property>
</bean>
<bean
>
<property >
<ref bean="localMysql" />
</property>
<property >
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
<property >
<list>
<value>db/Orders.hbm.xml</value>
<value>db/Customers.hbm.xml</value>
</list>
</property>
</bean>
<!-- 定义事务管理器,使用适用于Hibernte的事务管理器-->
<bean
>
<!-- HibernateTransactionManager bean需要依赖注入一个SessionFactory bean的引用-->
<property >
<ref local="localSessionFactory" />
</property>
</bean>
<!-- 配置事务拦截器-->
<bean
>
<!-- 事务拦截器bean需要依赖注入一个事务管理器 -->
<property ref="transactionManager" />
<property >
<!-- 下面定义事务传播属性-->
<props>
<prop key="insert*">PROPAGATION_REQUIRED</prop>
<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
<!-- 定义事务Advisor-->
<bean
>
<!-- 定义advisor时,必须传入Interceptor-->
<property
ref="transactionInterceptor" />
</bean>
<!-- DefaultAdvisorAutoProxyCreator搜索容器中的 advisor,并为每个bean创建代理 -->
<bean
/>
<!--定义DAO Bean ,由于BeanNameAutoProxyCreator自动生成事务代理-->
<bean >
<property >
<ref local="localSessionFactory" />
</property>
</bean>
</beans>
-----------------------------------------------------------------------------------------------------------
Demo.java
-----------------------------------------------------------------------------------------------------------
package test;
/**
* 用DefaultAdvisorAutoProxyCreator自动创建事务代理
*/
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import db.Customers;
public class Demo {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext(
"applicationContext.xml");
test.IUserDAO dao = (test.IUserDAO) ctx.getBean("userDAOTarget");
Customers c = new Customers();
c.setId(3l);
c.setName("xxx");
dao.insertUser(c);
System.out.println("END");
}
}
-----------------------------------------------------------------------------------------------------------
package db;
import java.util.List;
import javax.sql.DataSource;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.LockMode;
import org.springframework.context.ApplicationContext;
import org.springframework.jdbc.datasource.DataSourceUtils;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.support.TransactionTemplate;
import test.IUserDAO;
public class CustomersDAO extends HibernateDaoSupport implements IUserDAO {
private static final Log log = LogFactory.getLog(CustomersDAO.class);
protected void initDao() {
// do nothing
}
private TransactionTemplate transactionTemplate;
public void setTransactionManager(
PlatformTransactionManager transactionManager) {
this.transactionTemplate = new TransactionTemplate(transactionManager);
}
public void insertUser(Customers transientInstance) {
getHibernateTemplate().saveOrUpdate(transientInstance);
// 下面两行代码没有实际意义,仅仅为了引发数据库异常
//DataSource ds = null;
//DataSourceUtils.getConnection(ds);
}
public void save(Customers transientInstance) {
log.debug("saving Customers instance");
try {
getHibernateTemplate().save(transientInstance);
log.debug("save successful");
} catch (RuntimeException re) {
log.error("save failed", re);
throw re;
}
}
}
-----------------------------------------------------------------------------------------------------------
package test;
import db.Customers;
public interface IUserDAO {
public void insertUser(Customers c);
}
-----------------------------------------------------------------------------------------------------------
相关推荐
`DefaultAdvisorAutoProxyCreator`是Spring AOP中用于实现自动代理创建的核心类,它根据配置的顾问来决定哪些bean需要被代理以及如何代理。下面我们将深入探讨`DefaultAdvisorAutoProxyCreator`的工作原理及其在实际...
- Spring通过`DefaultAdvisorAutoProxyCreator`组件自动创建代理。当它检测到容器中有Advisor或Aspect对象时,会为匹配的bean创建代理。 - `@EnableAspectJAutoProxy`注解可以启用基于AspectJ的自动代理,使Spring...
`DefaultAdvisorAutoProxyCreator` 是 Spring 自动代理实现的核心类,它负责根据Advisor创建代理对象。 在提供的配置中,我们看到以下几个关键组件: 1. **Bean `person`** - 这是一个名为 `PersonCon` 的类的实例...
`DefaultAdvisorAutoProxyCreator`是Spring AOP中用于自动创建代理的组件,它会寻找所有`Advisor`(包括事务增强`Advisor`),并将它们应用到相关的bean上。这样,我们可以通过定义`Pointcut`来决定哪些方法需要...
2. **使用BeanNameAutoProxyCreator**:根据Bean名称自动创建事务代理,这需要对Spring AOP有更深入的理解。 3. **使用DefaultAdvisorAutoProxyCreator**:与`BeanNameAutoProxyCreator`类似,但其配置的可读性可能...
`DefaultAdvisorAutoProxyCreator`是Spring中最常用的自动代理创建者,它会自动将所有符合条件的advisor应用到所有的bean上。与`BeanNameAutoProxyCreator`不同,它不依赖于bean名称,而是依赖于advisor的pointcut...
Spring的`DefaultAdvisorAutoProxyCreator`会根据配置的Advisor自动创建代理,而`Advised`接口提供了对代理设置和获取各种配置信息的能力,如拦截器链。 4. **底层实现原理**: - **JDK代理**:JDK动态代理使用...
3. 根据 Advisor 的匹配机制自动创建代理,实现类 DefaultAdvisorAutoProxyCreator 其中,@Aspect 声明的 AOP 是通过 AnnotationAwareAspectJAutoProxyCreator 进行代理的,而声明式事务是 ...
- Spring AOP提供了`DefaultAdvisorAutoProxyCreator`,它可以自动为匹配的Bean创建JDK代理。 - 切面(Aspect)是Spring AOP的核心,它封装了通知(Advice),通知定义了切面的逻辑。例如,我们可以创建一个`...
- **自动模式**:指的是Spring AOP的自动代理创建功能,即不需要手动指定代理对象,而是通过配置自动创建。 - **AbstractAutoProxyCreator**:一个抽象类,它实现了自动创建代理对象的逻辑。 - **...
- **DefaultAdvisorAutoProxyCreator**:自动代理创建器,它会扫描所有的Advisor并为匹配的bean创建代理。 - **AbstractAutoProxyCreator**:自动代理创建器的抽象基类,提供了创建代理的基本逻辑。 - **...
9.9.1. 对一个特定的 DataSource 使用错误的事务管理器 9.10. 更多的资源 10. DAO支持 10.1. 简介 10.2. 一致的异常层次 10.3. 一致的DAO支持抽象类 11. 使用JDBC进行数据访问 11.1. 简介 11.1.1. Spring JDBC包结构...
- 通过指定 Bean 的名称来自动创建代理对象。 2. **DefaultAdvisorAutoProxyCreator**: - 自动为所有的 Advisor 创建代理。 #### 第四章 Spring 对持久层的支持 ##### 一、Spring 对持久层支持采用的策略 - *...
6.5 自动创建代理 6.5.1 实现类介绍 6.5.2 BeanNameAutoProxyCreator 6.5.3 DefaultAdvisorAutoProxyCreator 6.6 小结 第7章 基于@AspectJ和Schema的AOP 7.1 Spring对AOP的支持 7.2 JDK 5.0注解知识快速进阶 7.2.1 ...
14.4.用事务进行资源同步 14.4.1.高层次方法 14.4.2.低层次方法 14.5.声明式事务管理 14.5.1.理解Spring.NET声明式事务管理的实现 14.5.2.第一个例子 14.5.3.Transaction特性的设置 14.5.4.通过AutoProxyCreator使用...
6.5 自动创建代理 6.5.1 实现类介绍 6.5.2 BeanNameAutoProxyCreator 6.5.3 DefaultAdvisorAutoProxyCreator 6.6 小结 第7章 基于@AspectJ和Schema的AOP 7.1 Spring对AOP的支持 7.2 JDK 5.0注解知识快速进阶 7.2.1 ...
在spring-aop.jar中,`org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator`类负责自动创建代理并织入切面。 三、Spring AOP的使用 在实际应用中,我们可以利用Spring AOP进行日志记录、...
- **DefaultAdvisorAutoProxyCreator**:根据Advisor自动创建代理。 #### 八、Spring对持久层的支持 **8.1 Spring对持久层支持采用的策略** - Spring通过提供多种数据访问抽象层,简化了与数据库交互的过程。 **...