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/106641.html原文链接:https://javaforall.net

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


相关推荐

  • OpenClaw 2026.3.2 默认关闭 Agent 工具权限:原因分析与修复方法

    OpenClaw 2026.3.2 默认关闭 Agent 工具权限:原因分析与修复方法

    2026年3月13日
    3
  • oracle视图如何创建索引,ORACLE 创建视图索引序列[通俗易懂]

    oracle视图如何创建索引,ORACLE 创建视图索引序列[通俗易懂]/*视图View视图是从若干基本表和(或)其他视图构造出来的表视图存放的都是查询语句,并没有真实的数据虚表作用限制对数据的操作复杂查询变简单提供相同数据的不同显示UNIONALL直接添加到一起UNION添加到一起并去重*/–赋予scott用户创建视图的权限sqlplus/assysdba;GRANTCREATEVIEWTOSCOTT;–创建视图CREATEORREPLACE…

    2022年7月22日
    28
  • java除法保留两位小数_JAVA除法保留小数点后两位的两种方法

    java除法保留两位小数_JAVA除法保留小数点后两位的两种方法1.利用Math.round()的方法:两个int型的数相除,结果保留小数点后两位:inta=1188;intb=93;doublec;c=(double)(Math.round(a*100/b)/100.0);//这样为保持2位打印结果:c=0.12c=newDouble(Math.round(a*1000/b)/1000.0);//这样为保持3位打印结果:c=0.0122.另一种办法i…

    2022年5月10日
    41
  • jsonarray方法_getJSONArray

    jsonarray方法_getJSONArray[//JSONArray {“id”:”123″,”courseID”:”huangt-test”,”title”:”提交作业”}, {“content”:null,”beginTime”:1398873600000″endTime”}]//普通对象varperson={name:”bella”,age:18};没…

    2025年7月6日
    7
  • 2021年电厂锅炉考试题及答案_电厂锅炉考试题及答案

    2021年电厂锅炉考试题及答案_电厂锅炉考试题及答案题库来源:安全生产模拟考试一点通公众号小程序2022G2电站锅炉司炉考试试题系G2电站锅炉司炉考试题模拟预测卷!2022G2电站锅炉司炉操作证考试题库及在线模拟考试根据G2电站锅炉司炉新考试大纲。G2电站锅炉司炉复审模拟考试通过安全生产模拟考试一点通上章节练习。1、【多选题】固体未完全燃烧热损失与下列哪些因素有关()。(ABCD)A、燃煤品质B、燃烧方式C、燃料与空气混合的程度D、炉膛温度2、【多选题】循环流床锅炉影响物料回送量的因素较多,主要有()。(BCD…

    2025年9月2日
    8
  • lnmp动静分离[通俗易懂]

    lnmp动静分离[通俗易懂]试验环境:ip服务概括192.168.1.61mysql,nginx,php,博客分离mysql,php到其他服务器192.168.1.62mysql代替1.61的mysql192.168.1.63php代替1.61的php思路:将1.61中的mysql,php,分离到其他服务器,分离后能够正常访问到1.61上的博客即可。一.分离MySQL数据库到1.621.在1.62服务器安装mysql[root@mysqld~]#rpm-ivhhtt

    2022年5月25日
    68

发表回复

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

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