Spring基于接口的动态代理和统一事务处理

Spring基于接口的动态代理和统一事务处理Spring基于接口的动态代理和统一事务处理

大家好,又见面了,我是你们的朋友全栈君。

接口的动态代理

  • 事务
    两种结果:提交 回滚
    提交:发生在return
    回滚:全回滚 / 回滚到定义的保存点
    在这里插入图片描述接口:
public class UserServiceImpl implements UserService { 
   
    public void addUser() { 
   
        System.out.println("addUser");
    }
}

测试类:

 @Test
    public void t3(){ 
   
        final UserServiceImpl userService=new UserServiceImpl();
        /* * ClassLoader loader, 一般调用当前类的类加载器 * Class<?>[] interfaces, * InvocationHandler h * */
        InvocationHandler handler= new InvocationHandler() { 
   
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 
   
                System.out.println("开启事务");
                Object object=  method.invoke(userService,args);
                System.out.println("关闭事务");
                return object;
            }

        };
        UserService userServiceProxy= (UserService) Proxy.newProxyInstance(Test01.class.getClassLoader(),
                UserServiceImpl.class.getInterfaces(),handler );
        userServiceProxy.addUser();

    }

统一事务处理

统一事务处理类:

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/* * 重写了 BeanPostProcessor * 配置的方法非常简单,只要配置给容器就可以了 * */
public class MyBeanPostProcess implements BeanPostProcessor{ 
   
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { 
   
        System.out.println("Before-Initialization");
        System.out.println(bean);
        System.out.println(beanName);
        return bean;
    }
    public Object postProcessAfterInitialization(final Object bean, String beanName) throws BeansException { 
   
        System.out.println("After-Initialization");
        if(beanName.equals("userService" )){ 
   
            InvocationHandler handler= new InvocationHandler() { 
   
                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 
   
                    System.out.println("开启事务");
                    Object object=  method.invoke(bean,args);
                    System.out.println("关闭事务");
                    return object;
                }
            };
            // BeanPostProcessor全局生效 需要使用名称进行过滤
            return Proxy.newProxyInstance(MyBeanPostProcess.class.getClassLoader(),
                    bean.getClass().getInterfaces(),handler);
        }else { 
   
            return bean;
        }
    }
}

applicationContext.xml配置;

<bean class="com.xbj.dao.impl.UserServiceImpl" id="userService" />
<bean class="com.xbj.dao.MyBeanPostProcess" />
 <!--配置BeanPostProcess 全局生效-->

userService:

public interface UserService { 
   
    void addUser();
}

UserServiceImpl:

public class UserServiceImpl implements UserService { 
   
    public void addUser() { 
   
        System.out.println("addUser");
    }
}

测试类:

    private ClassPathXmlApplicationContext context;
    @Before
    public void t1(){ 
   
        context= new ClassPathXmlApplicationContext("applicationContext.xml");
    }
    @Test
    public void t2(){ 
   
        UserService userService=context.getBean("userService",UserService.class);
        userService.addUser();
        context.close();
    }
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/106642.html原文链接:https://javaforall.net

(0)
上一篇 2022年4月22日 下午4:40
下一篇 2022年4月22日 下午4:40


相关推荐

  • C++学习之路—— C++异常处理机制

    C++学习之路—— C++异常处理机制例题:1.设计一个程序,根据输入的三边求三角形面积。2.要求设置异常处理机制,对不符合三角形条件提示错误信息,不做计算;对输入非正数的边提示错误,并重新输入。代码如下:class S{public: double s; S(double x, double y, double z) { a = x; b = y; c = z; } void TryS();pr…

    2022年8月18日
    16
  • Java数组初始化的内存分配

    Java数组初始化的内存分配1 Java 数组是静态的 Java 是静态语言 所以 Java 的数组也是静态的 即 数组被初始化后 长度不可变静态初始化 显式指定每个数组元素的初始值 系统决定数组长度 String books newString 疯狂 Java 讲义 ThinkinginJa Java 核心技术卷 String names newString 张三 李四

    2026年3月17日
    3
  • Throw和Throws的区别

    Throw和Throws的区别Throw 作用在方法内 表示抛出具体异常 由方法体内的语句处理 具体向外抛出的动作 所以它抛出的是一个异常实体类 若执行了 Throw 一定是抛出了某种异常 Throws 作用在方法的声明上 表示如果抛出异常 则由该方法的调用者来进行异常处理 主要的声明这个方法会抛出会抛出某种类型的异常 让它的使用者知道捕获异常的类型 出现异常是一种可能性 但不一定会发生异常 实例 vo

    2026年3月19日
    2
  • 影刀自动化工作流RPA采集教程

    影刀自动化工作流RPA采集教程

    2026年3月19日
    4
  • Zabbix常用监控项整理

    Zabbix常用监控项整理https://blog.51cto.com/ttxsgoto/1771752最近整理了一份常用Zabbix监控项说明,主要包括常见Windows&Linux监控,如下:Windons系统:项目 items items说明内存 vm.memory.size[free] 系统可用内存量vm.memory.size[total] 系统总共内存量swap空间 system.swa…

    2022年6月12日
    54
  • 06-SNAP处理Sentinel-1 IW SLC数据(极化SAR预处理)

    06-SNAP处理Sentinel-1 IW SLC数据(极化SAR预处理)前言网上有一些关于 SNAP 处理 Sentinel 1A 数据的例子 但是处理的数据基本是都是 GRDH 级的数据 不是 SLC 级的数据 现阶段多数人处理 Sentinel 系列数据大都是利用 ENVI 软件进行的 然而 ENVI 等处理软件都是商业软件 尽管可以使用激活成功教程版或免费申请使用 但是总是有点限制 或是功能受限或是时长受限 总之 使用起来也是不便 本篇文章是为了填补这个空白而创作 一方面是为了促进 SNAP 软件

    2026年3月16日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号