使用动态代理+自定义注解控制数据库事务
来源:互联网 发布:淘宝移动官方旗舰店 编辑:程序博客网 时间:2024/05/16 18:29
一:创建一个能对所有类实例进行动态代理的代理工具类
/* * 创建一个能对所有类实例进行动态代理的代理工具类, 这里的泛型类型T 必须是接口类型 */public class DynamicProxy2<T> implements InvocationHandler {private T target; // 被代理对象/* * 构造方法 传递一个被代理对象 */public DynamicProxy2(T target) {this.target = target;}/* * 获得代理对象 */public T getProxy() {Object o = Proxy.newProxyInstance(DynamicProxy2.class.getClassLoader(), target.getClass().getInterfaces(), this);return (T) o;}/* * 复写invoke方法 */@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {if (!method.isAnnotationPresent(Transaction.class)) { // 如果接口方法中不存在事务注解, 则不开启事务return method.invoke(target, args);} else { // 如果接口方法中存在事务注解, 则开启事务Connection connection = null;Object obj = null;try {connection = DataSourceUtils.getConnection();connection.setAutoCommit(false);obj = method.invoke(target, args);connection.commit();} catch (Exception e) {connection.rollback();throw new Exception(e);} finally {connection.close();}return obj;}}}二:创建控制事务是否开启的注解
/* * 控制事务是否开启的注解 */@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public @interface Transaction {}
三:使用
public interface IUserService {@Transaction // 开始事务void save() throws Exception;Role getRole() throws Exception;}
public class UserServiceImpl implements IUserService {UserDao1 userDao1 = new UserDao1();UserDao2 userDao2 = new UserDao2();@Overridepublic void save() throws Exception {userDao1.save();userDao2.save();}@Overridepublic Role getRole() throws Exception {return userDao2.getRole();}public static void main(String[] args) {IUserService userService = new UserServiceImpl();IUserService userService2 = new DynamicProxy2<IUserService>(userService).getProxy();// try {// userService2.save(); // 这个是否开启事务// System.out.println("保存成功!");// } catch (Exception e) {// System.out.println("保存失败!");// }try {userService2.getRole(); // 这个方法不需要开启事务System.out.println("获得成功!");} catch (Exception e) {System.out.println("获得失败!");}}}
0 0
- 使用动态代理+自定义注解控制数据库事务
- 使用DBUtils、动态代理以及注解实现事务控制
- 解析动态代理模式与跟自定义注解配合使用以及事务注解原理
- 通过使用反射+动态代理+注解来实现对事务的控制
- 使用注解完成事务控制
- JAVAWEB开发之Servlet3.0新特性的使用以及注解的详细使用和自定义注解的方法、动态代理的使用、利用动态代理实现细粒度的权限控制以及类加载和泛型反射
- 通过JDK动态代理和自定义注解来控制方法级别的权限访问
- 使用Spring中的 @Transactional注解控制事务
- 【反射+注解+动态代理在事务中的应用service层】
- Java事务(五) - 使用动态代理改造
- 自定义struts(二)--FakeStruts实现@Transaction 注解事务控制
- JDK动态代理和CGLIB动态代理,实现Spring注解管理事务区别。
- 【Java基础】动态代理实现AOP之控制事务
- 注解+动态代理实现bookstore的权限控制
- Spring 中使用@Aspect 控制自定义注解
- 动态代理封装事务
- Java 使用动态代理来动态修改注解值
- 使用动态代理实现自定义连接池
- 256色调色板的匹配处理
- js获取网页的高度,宽度
- MMX版本的Alpha Blend算法实现
- logcat命令
- 【半平面交】 POJ 3384 Feng Shui
- 使用动态代理+自定义注解控制数据库事务
- supporting Multipe Screen Important
- glDrawArrays、glDrawElements区别
- 纹理映射坐标[OpenGL]
- C++ 初始化列表
- glCullFace和glFrontFace
- Texture Wrapping Mode
- 拾取操作的实现[OpenGL]
- Activity and Task Design Guidelines