对案例添加事务控制之后,业务层对象,变得非常复杂,不方便管理和查看,这里通过创建Service的代理对象的工厂,来管理事务
文章目录
一、BeanFactory
/**
* 用于创建Service的代理对象的工厂
*/
@Component
public class BeanFactory {
@Autowired
private AccountService accountService;
@Autowired
private TransactionManager txManager;
/**
* 获取Service代理对象
* 这里传过来的accountService 同样是AccountServiceImpl 的实现类,符合被代理类至少实现一个接口
*/
@Bean("proxyAccountService")//将该方法的返回值存入容器
public AccountService getAccountService() {
return (AccountService) Proxy.newProxyInstance(accountService.getClass().getClassLoader(),
accountService.getClass().getInterfaces(), new InvocationHandler() {
/**
* 添加事务的支持
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object rtValue = null;
try {
//1.开启事务
txManager.beginTransaction();
//2.执行操作
rtValue = method.invoke(accountService, args);
//3.提交事务
txManager.commit();
//4.返回结果
return rtValue;
} catch (Exception e) {
//5.回滚操作
txManager.rollback();
throw new RuntimeException(e);
} finally {
//6.释放连接
txManager.release();
}
}
});
}
}