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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • golang环境搭建_linux开发环境的搭建

    golang环境搭建_linux开发环境的搭建『Golang』(Go语言,以下简称Go)是Google开发的一种编译型、可并行化、并具有垃圾回收功能的编程语言。罗布·派克(RobPike)、罗伯特·格瑞史莫(RobertGriesemer)、及肯·汤普逊于2007年9月开始设计Go,随后IanLanceTaylor、RussCox加入项目中。Go是基于Inferno操作系统所开发的。Go于2009

    2022年10月11日
    1
  • 一张图看懂字节跳动8年创业史,太励志了吧

    点击上方“全栈程序员社区”,星标公众号 重磅干货,第一时间送达 转载自| BAT(id:batfun) 字节跳动可以说是这两年 最受关注的互联网公司之一 2020年3月12日 字节…

    2021年6月27日
    372
  • dti是什么意思_happygame是哪个应用

    dti是什么意思_happygame是哪个应用2018.10.24-dtij-2636-262144(game)

    2022年4月20日
    58
  • STUN协议解释[通俗易懂]

    STUN协议解释[通俗易懂]最近工作中要用到stun,故学习了一下stun协议的知识。中文的文档没找到讲的比较好的,所以只能自己翻译了,官方文档太长就找了个谷歌排名第一的文章翻译一下。机翻+人翻,原文地址如下,在学习过程中还发现了原文作者的一个错误。。。应该是他错了。https://www.3cx.com/blog/voip-howto/stun-details/https://www.ietf.org/rfc/rf…

    2022年7月17日
    21
  • 谈谈内存映射文件[通俗易懂]

    谈谈内存映射文件[通俗易懂]http://blog.csdn.net/ithzhang/article/details/7001650内存映射文件允许开发人员预订一块地址空间并为该区域调拨物理存储器,与虚拟内存不同的是,内存映射文件的物理存储器来自磁盘中的文件,而非系统的页交换文件。将文件映射到内存中后,我们就可以在内存中操作他们了,就像他们被载入内存中一样。内存映射文件主要有三方面的用途:1:系

    2022年6月17日
    32
  • Java版本历史「建议收藏」

    Java版本历史「建议收藏」Java语言自JDK1.0版本以来经历了许多次更新,也在基本程序库中增加了大量的类别和包。从J2SE1.4开始,Java语言的变动由JavaCommunityProcess(JCP)管理,JCP使用Java规范请求(JavaSpecificationRequests,JSRs)来建议和定义对Java平台内容的新增和修改。Java语言由Java语言规范(JavaLanguageSpecification,JLS)定义,对JLS的更改则根据JSR901(页面存档备份,存于互联网档案馆)管理。

    2022年7月9日
    19

发表回复

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

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