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


相关推荐

  • 分享67套基于Java开发的Java毕业设计实战项目(含源码+毕业论文)【新星计划】

    分享67套基于Java开发的Java毕业设计实战项目(含源码+毕业论文)【新星计划】【新星计划】分享67套基于Java开发的Java毕业设计实战项目(含源码+毕业论文)基于Java开发的Java毕业设计实战项目本文中的所有主题都来自互联网。如果您侵犯您的权利,请及时联系Blogger,博主将及时处理。投诉邮箱:1919101926@qq.com(没事勿扰,不接单,也没时间解决难题,谢谢配合)。文章目录->建议收藏关注+点赞<-基于Java开发的Java毕业设计实战项目前言Java毕业设计所用到的开发环境Java毕业设计项目简单介绍17套基于Java开发的[互

    2022年9月1日
    5
  • 矩阵分解模型

    矩阵分解模型矩阵分解模型做如下假设:1.每个用户可描述为n个属性或特征。比如,第一个特征可以对应某个用户对动作片的喜好程度。2.每个物品可描述为n个属性或特征。比如,接上一点,第一个特征可以用对应某部电影与动作片的接近程度。3.将用户和物品对应的属性相乘后求和,该值可能很接近用户会对该物品的评级。 1.显式矩阵分解当要处理的数据是由用户所提供的自身的偏好数据时,这些数据被称作显式偏好数…

    2022年5月15日
    42
  • 浅析Werkzeug服务无缝更新「建议收藏」

    浅析Werkzeug服务无缝更新「建议收藏」一直以来对于SAE上python应用无缝更新好奇今天就来分析一下应用启动入口我用的是Flask从dev_server.py中WsgiWorker可以找到运行服务的入口:fromwerkzeug.servingimportrun_simplerun_simple(…)注意其中参数: use_reloader=True

    2022年10月6日
    2
  • linux发送邮件命令_java实现邮件发送功能

    linux发送邮件命令_java实现邮件发送功能第一步,安装mail服务检测系统是否安装了mail服务[root@centos8~]#rpm-qf/usr/bin/mailerror:file/usr/bin/mail:Nosuchfileordirectory刚开始我的系统就没有mail服务,使用“yum-yinstallmailx”安装时有一只报错,提示“Error:Failedtodownloadmetadataforrepo‘appstream’:Cannotprepareinterna

    2022年10月20日
    3
  • XSRF 的攻击与防范

    XSRF 的攻击与防范官方定义CSRF(Cross-siterequestforgery跨站请求伪造,也被称成为“oneclickattack”或者sessionriding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,并且攻击方式几乎相左。XSS利用站点内的信任用户,而XSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS

    2022年5月19日
    33
  • 运放电流检测采样电路电压采样电路

    运放电流检测采样电路电压采样电路输入输出电压检测输入输出电压通过运放LMC6482采用差分电路将输出电压按比例缩小至ADC能够采样的范围,再使用ADC采样,软件解算出输出电压。输入电压采样是通过MCU内部运放按比例缩小在送到ADC进行采样的,具体电路如图3.5.1所示。输出电压检测电路如图3.4.1所示。输出电流检测➢输出电流检测电路通过运放LMC6482采样差分放大电路实现;采样电阻放在低端,若采样电阻放在高端,会有较大的共模电压使采样电流不准确,采样电阻为10m????,由于采样电阻较小,采样电阻上的压降较小,不利于直

    2022年6月2日
    237

发表回复

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

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