男和男做那个视频网站好,免费咨询承诺书,深圳网站界面设计,无锡市建设局网站了解了Spring AOP执行过程#xff0c;再看Spring事务源码其实非常简单。 首先从简单使用开始, 演示Spring事务使用过程 Xml配置#xff1a;
?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema…了解了Spring AOP执行过程再看Spring事务源码其实非常简单。 首先从简单使用开始, 演示Spring事务使用过程 Xml配置
?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:aophttp://www.springframework.org/schema/aopxmlns:txhttp://www.springframework.org/schema/txxsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd!-- 数据库连接池 --bean iddataSource classcom.alibaba.druid.pool.DruidDataSource destroy-methodcloseproperty nameurl valuejdbc:mysql:///custom_db /property nameusername valueroot /property namepassword value123456 /property namedriverClassName valuecom.mysql.jdbc.Driver //bean!-- JdbcTemplate 对象 --bean idjdbcTemplate classorg.springframework.jdbc.core.JdbcTemplateproperty namedataSource refdataSource/property/bean!-- transactionManager 对象 --bean idtransactionManager classorg.springframework.jdbc.datasource.DataSourceTransactionManagerproperty namedataSource refdataSource/property/beantx:advice idtxAdvice transaction-managertransactionManagertx:attributestx:method name* propagationREQUIRED//tx:attributes/tx:adviceaop:configaop:advisor advice-reftxAdvice pointcutexecution(* org.spring.tx.dao.*.*(..))/aop:advisor/aop:configbean iduserDao classorg.spring.tx.dao.UserDaoImplconstructor-arg index0 refjdbcTemplate/constructor-arg/bean/beans
实体类
package org.spring.tx.dto;public class UserDto {private Long id;private String UserName;public Long getId() {return id;}public void setId(Long id) {this.id id;}public String getUserName() {return UserName;}public void setUserName(String userName) {UserName userName;}
}
业务Dao类
package org.spring.tx.dao;import org.spring.tx.dto.UserDto;public interface UserDao {void insert(UserDto userDto);
}
package org.spring.tx.dao;import org.spring.tx.dto.UserDto;
import org.springframework.jdbc.core.JdbcTemplate;public class UserDaoImpl implements UserDao {//注入 JdbcTemplateprivate JdbcTemplate jdbcTemplate;public UserDaoImpl(JdbcTemplate jdbcTemplate) {this.jdbcTemplate jdbcTemplate;}Overridepublic void insert(UserDto userDto) {//创建 sql 语句String sql insert into user (username)values(?);//调用方法实现Object[] args {userDto.getUserName()};//返回影响行数int update jdbcTemplate.update(sql,args);System.out.println(user新增条数 update);//throw new RuntimeException(业务出错了!!!);}
}
测试代码
package org.spring.tx;import org.spring.tx.dao.UserDao;
import org.spring.tx.dto.UserDto;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class MainTest {public static void main(String[] args) {ClassPathXmlApplicationContext applicationContext new ClassPathXmlApplicationContext(spring-tx.xml);applicationContext.start();UserDao userDao applicationContext.getBean(UserDao.class);UserDto userDto new UserDto();userDto.setUserName(zhangsan);userDao.insert(userDto);applicationContext.stop();}
}
执行结果 从源码角度简单分析一下 根据Spring AOP过程(参考Spring AOP源码篇二之 代理工厂ProxyFactory学习-CSDN博客 Spring AOP源码篇三之 xml配置-CSDN博客)增强工作由Advice完成而事务的Advice对应的是TransactionInterceptor.
public class TransactionInterceptor extends TransactionAspectSupport implements MethodInterceptor, Serializable {public TransactionInterceptor() {}public TransactionInterceptor(PlatformTransactionManager ptm, Properties attributes) {setTransactionManager(ptm);setTransactionAttributes(attributes);}public TransactionInterceptor(PlatformTransactionManager ptm, TransactionAttributeSource tas) {setTransactionManager(ptm);setTransactionAttributeSource(tas);}//TransactionInterceptor实现了Advice(MethodInterceptor)接口增强工作由该方法完成//核心代码方法调用入口public Object invoke(final MethodInvocation invocation) throws Throwable {Class? targetClass (invocation.getThis() ! null ? AopUtils.getTargetClass(invocation.getThis()) : null);// 父类TransactionAspectSupport中方法return invokeWithinTransaction(invocation.getMethod(), targetClass, new InvocationCallback() {public Object proceedWithInvocation() throws Throwable {return invocation.proceed();}});}//---------------------------------------------------------------------// Serialization support//---------------------------------------------------------------------private void writeObject(ObjectOutputStream oos) throws IOException {// Rely on default serialization, although this class itself doesnt carry state anyway...oos.defaultWriteObject();// Deserialize superclass fields.oos.writeObject(getTransactionManagerBeanName());oos.writeObject(getTransactionManager());oos.writeObject(getTransactionAttributeSource());oos.writeObject(getBeanFactory());}private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {// Rely on default serialization, although this class itself doesnt carry state anyway...ois.defaultReadObject();// Serialize all relevant superclass fields.// Superclass cant implement Serializable because it also serves as base class// for AspectJ aspects (which are not allowed to implement Serializable)!setTransactionManagerBeanName((String) ois.readObject());setTransactionManager((PlatformTransactionManager) ois.readObject());setTransactionAttributeSource((TransactionAttributeSource) ois.readObject());setBeanFactory((BeanFactory) ois.readObject());}}