BeanNameAutoProxyCreator总结并测试事务异常
2008年04月25日 星期五 15:36
-----------------------------------------------------------------------------------------------------------
不处于事务控制下
无论是否发生导常
都 不提交记录
-----------------------------------------------------------------------------------------------------------
处于事务控制下
发生导常
不提交记录
-----------------------------------------------------------------------------------------------------------
配置文件最好分开
<prop key="hibernate.show_sql">true</prop>
-----------------------------------------------------------------------------------------------------------
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);
-----------------------------------------------------------------------------------------------------------
用BeanNameAutoProxyCreator测试事务异常
BeanNameAutoProxyCreator总结
配置文件分开
-----------------------------------------------------------------------------------------------------------
先添加Spring Capabilities
再添加Hibernate Capabilities
-----------------------------------------------------------------------------------------------------------
package service;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class ServiceFactory {
public static ApplicationContext ctx;
public static ApplicationContext getApplicationContext() {
if (ctx == null) {
ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
}
return ctx;
}
}
-----------------------------------------------------------------------------------------------------------
package service;
import db.Customers;
public interface CustomersService {
public void save(Customers c);
}
-----------------------------------------------------------------------------------------------------------
package service;
import javax.sql.DataSource;
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 db.Customers;
import db.CustomersDAO;
public class CustomersServiceImpl extends HibernateDaoSupport implements
CustomersService {
private TransactionTemplate transactionTemplate;
public void setTransactionManager(
PlatformTransactionManager transactionManager) {
this.transactionTemplate = new TransactionTemplate(transactionManager);
}
public void save(Customers c) {
CustomersDAO dao = (CustomersDAO) ServiceFactory
.getApplicationContext().getBean("CustomersDAO");
dao.save(c);
// 下面两行代码没有实际意义,仅仅为了引发数据库异常
//DataSource ds = null;
//DataSourceUtils.getConnection(ds);
}
}
-----------------------------------------------------------------------------------------------------------
package test;
import service.CustomersService;
import service.ServiceFactory;
import db.Customers;
public class Demo {
public static void main(String[] args) {
CustomersService service = (CustomersService) ServiceFactory
.getApplicationContext().getBean("CustomersServiceImpl");
Customers c = new Customers();
c.setId(1l);
c.setName("xiong");
service.save(c);
System.out.println("END");
}
}
-----------------------------------------------------------------------------------------------------------
<?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="file:src/hibernate.cfg.xml">
</property>
</bean>
<bean >
<property >
<ref bean="localSessionFactory" />
</property>
</bean>
<bean >
<property >
<ref bean="localSessionFactory" />
</property>
</bean>
<bean >
<property >
<ref bean="localSessionFactory" />
</property>
</bean>
<!-- 定义事务管理器,使用适用于Hibernte的事务管理器-->
<bean
>
<property >
<ref bean="localSessionFactory" />
</property>
</bean>
<!-- 配置事务拦截器-->
<bean
>
<!-- 事务拦截器bean需要依赖注入一个事务管理器 -->
<property ref="transactionManager" />
<property >
<!-- 下面定义事务传播属性-->
<props>
<!-- <prop key="save">PROPAGATION_REQUIRED</prop> -->
<prop key="save*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
<!-- 定义BeanNameAutoProxyCreator,该bean是个bean后处理器,无需被引用,因此没有id属性
这个bean后处理器,根据事务拦截器为目标bean自动创建事务代理
<bean >
指定对满足哪些bean name的bean自动生成业务代理 -->
<bean
>
<property >
<!-- 下面是所有需要自动创建事务代理的bean-->
<list>
<!-- <value>CustomersServiceImpl</value>-->
<value>CustomersServiceImpl</value>
</list>
<!-- 此处可增加其他需要自动创建事务代理的bean-->
</property>
<!-- 下面定义BeanNameAutoProxyCreator所需的事务拦截器-->
<property >
<list>
<value>transactionInterceptor</value>
<!-- 此处可增加其他新的Interceptor -->
</list>
</property>
</bean>
</beans>
-----------------------------------------------------------------------------------------------------------
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<!-- Generated by MyEclipse Hibernate Tools. -->
<hibernate-configuration>
<session-factory>
<property >root</property>
<property >
jdbc:mysql://localhost:3306/sampledb
</property>
<property >
org.hibernate.dialect.MySQLDialect
</property>
<property >
local_mysql
</property>
<property >
com.mysql.jdbc.Driver
</property>
<property >true</property>
<mapping resource="db/Orders.hbm.xml" />
<mapping resource="db/Customers.hbm.xml" />
</session-factory>
</hibernate-configuration>
-----------------------------------------------------------------------------------------------------------
本篇日志被作者设置为禁止发表新评论
相关推荐
总结,`BeanNameAutoProxyCreator`是Spring AOP中一个重要的工具,它允许我们基于bean名称来选择性地创建代理,从而实现特定功能的拦截。理解并熟练运用`BeanNameAutoProxyCreator`,可以帮助我们更好地利用Spring ...
- **描述**:总是创建新的事务,如果当前存在事务,则挂起当前事务并创建一个新的事务。 - **适用场景**:适用于需要在新事务中独立完成的操作,即使它被包含在一个更大的事务中。 ##### 5. PROPAGATION_NOT_...
当Spring容器启动时,`BeanNameAutoProxyCreator`会查找所有匹配的bean,并为它们创建事务代理。当调用这些bean的方法时,实际上是调用了事务拦截器,后者根据配置的事务属性来决定是否开启新的事务、事务何时提交或...
本篇文章将详细解析Spring中的六种事务配置方法,帮助开发者深入理解并掌握Spring事务的运用。 1. **基于XML的事务配置** Spring支持通过XML配置来管理事务,这是最基础的配置方式。在`spring`的配置文件中,我们...
当调用代理方法时,代理会拦截调用并自动开启、提交或回滚事务,从而实现事务的管理。 #### 配置步骤 1. **定义数据源**:首先,需要在Spring配置文件中定义数据源。数据源是所有数据库交互的基础,这里使用`...
在上面的代码中,我们定义了一个代理bean,这个bean使用BeanNameAutoProxyCreator来代理事务的操作。这个bean需要一个beanNames的列表,这个列表将被用来指定需要代理的bean。同时,我们还需要指定一个...
--定义DAO Bean ,由于BeanNameAutoProxyCreator自动生成事务代理--> class="com.service.impl.UserManagerImpl"> singleton="false"> </beans>
其中,@Aspect 声明的 AOP 是通过 AnnotationAwareAspectJAutoProxyCreator 进行代理的,而声明式事务是 BeanNameAutoProxyCreator 方式进行代理的。由于这两种代理方式的拦截顺序不同,会导致拦截顺序问题。 解决...
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 了解注解 7.2.2 一个简单的注解类 ...
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 了解注解 7.2.2 一个简单的注解类 ...
当Spring容器启动并初始化`BeanNameAutoProxyCreator`时,它会扫描配置的bean名字列表,找到匹配的bean并创建代理。代理对象在执行方法时,会首先调用拦截器,然后才调用实际的目标方法。 三、使用示例 在`spring...
- 尽管 Spring 源代码公开,但它并不属于任何官方的标准或规范的一部分。 - 开发者可以根据自己的需求修改和扩展 Spring 框架,这为定制化应用提供了可能。 ##### 二、Spring 的优点 1. **采用 J2EE 开发存在的...
为了使事务拦截器能够应用于业务层的方法调用,我们需要使用`BeanNameAutoProxyCreator`来创建AOP代理: ```xml class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> <!-- ... --...
- 提供了JDBC、ORM(如Hibernate)、事务管理和数据访问异常层次等支持。 **3.3 Web** - 支持MVC框架,以及远程调用等功能。 **3.4 AOP** - 提供面向切面编程的能力,帮助开发者更方便地处理横切关注点。 **3.5 ...
这里使用的是Hibernate事务管理器`HibernateTransactionManager`,并通过`SessionFactory`来管理事务。 此外,还可以使用JDBC事务管理器`DataSourceTransactionManager`来实现简单的事务管理。 ##### 4. AOP配置 ...
BeanNameAutoProxyCreator 7.9.1.2. DefaultAdvisorAutoProxyCreator 7.9.1.3. AbstractAdvisorAutoProxyCreator 7.9.2. 使用元数据驱动的自动代理 7.10. 使用TargetSources 7.10.1. 热交换目标源 7.10.2. 池化目标...
- 方案二:使用`TransactionInterceptor`和`BeanNameAutoProxyCreator`简化配置,适用于大多数情况。 #### 四、总结 SSH框架的配置涉及多个步骤,包括创建项目、添加框架支持、配置视图与业务逻辑、以及整合框架...
为了实现事务管理,我们可以使用Spring的`DataSourceTransactionManager`,为每个数据源配置一个事务管理器,并通过AOP代理(例如`BeanNameAutoProxyCreator`)指定事务拦截器: ```xml ...