当前位置:首页 > CN2资讯 > 正文内容

Spring入门第三讲 Spring中的代理 静态代理 动态代理(JDK代理) cglib代理(字节码增强) Spring中的AOPspring的静态代理和动态代理

2天前CN2资讯
Spring中的代理

概念:代理即在访问真正的对象之前和之后所做的业务处理的对象
以事务的操作为例讲解:

静态代理

​代理对象和真实的对象需要实现同一个接口

目标对象类 public class UserDaoImpl implements IUserDao { @Override public int saveUser() { //System.out.println("--开启事务--"); System.out.println("--添加用户--"); //System.out.println("--关闭事务--"); return 0; } @Override public int delUser() { //System.out.println("--开启事务--"); System.out.println("--删除用户--"); //System.out.println("--关闭事务--"); return 0; } } 代理对象类 public class ProxyUserDaoImpl implements IUserDao{ //UserDaoImpl userDao = new UserDaoImpl(); IUserDao userDao; public ProxyUserDaoImpl(IUserDao userDao){ this.userDao = userDao; } @Override public int saveUser() { System.out.println("--开启事务--"); userDao.saveUser(); System.out.println("--关闭事务--"); return 0; } @Override public int delUser() { System.out.println("--开启事务--"); userDao.delUser(); System.out.println("--关闭事务--"); return 0; } } 测试类 @Test public void test(){ IUserDao userDao = new ProxyUserDaoImpl(new UserDaoImpl2()); userDao.delUser(); userDao.saveUser(); }

动态代理(JDK代理)

​ 在程序运行期间,动态的创建代理对象

//目标对象类与上述相同 //测试方法 @Test public void test2(){ //真实对象 IUserDao userDao = new UserDaoImpl(); //创建代理对象 //ClassLoader 加载真实对象的class文件 //Class<?>[] 真实对象所实现的所有接口 IUserDao proxy = (IUserDao) Proxy.newProxyInstance( userDao.getClass().getClassLoader(), userDao.getClass().getInterfaces(), //代理对象要做的事情 new InvocationHandler(){ //proxy 代理对象 //method 目标对象中的方法的描述方法 //args 目标对象中方法的参数 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("开启事务"); //每个要代理的方法都会执行 //通过反射机制,找到要执行的dao里面的方法 Object obj = method.invoke(userDao, args); System.out.println("关闭事务"); return obj; } } ); proxy.delUser(); proxy.saveUser(); }

问题:必须要有接口

cglib代理(字节码增强)

导入jar,只需要提供要代理的类即可
jar:asm.jar cglib.jar或者使用Spring-core.jar(其中包含的有)

目标对象类 public class UserDaoImpl2 { public int saveUser() { //System.out.println("--开启事务--"); System.out.println("--添加用户2--"); //System.out.println("--关闭事务--"); return 0; } public int delUser() { //System.out.println("--开启事务--"); System.out.println("--删除用户2--"); //System.out.println("--关闭事务--"); return 0; } } 测试类 @Test public void tests3(){ //创建目标对象 UserDaoImpl2 userDaoImpl2 = new UserDaoImpl2(); //创建Enhancer设置相关属性及创建代理对象--cglib Enhancer enhancer = new Enhancer(); //指定要代理的对象 enhancer.setSuperclass(UserDaoImpl2.class); //设置回调函数处理代理方法 enhancer.setCallback(new MethodInterceptor(){ public Object intercept(Object proxy,Method method,Object[] args,MethodProxy methodProxy){ System.out.println("开启事务"); Object obj = method.invoke(userDaoImpl2,args); //methodProxy.invokeSuper(proxy,args); System.out.println("关闭事务"); return obj; } }); //创建代理对象 UserDaoImpl2 proxy = (UserDaoImpl2)enhancer.create(); proxy.delUser(); proxy.saveUser(); } Spring中的AOP

1、面向切面编程:采用横向抽取的方式,在程序运行的过程中,动态的向目标对象中织入要增强的代码。底层采用动态代理方式(JDK代理和cglib代理)

2、应用场景

事务管理、日志、性能监控等…

3、术语解释

target:目标对象

advice:通知(增强代码)

joinpoint:连接点,可能要添加增强代码的方法

pointcut:切入点,要添加增强代码的方法

weaving:织入,将增强代码添加到切入点的过程

aspect:切面,切入点和增强代码之间形成的虚拟的面

4、案例–给删除方法添加事务管理,使用aspectj框架而非Spring aop

步骤:

a)创建项目,导入jar。

​ 4+1 core context bean spel jcl

​ spring-aop.jar 基于aspectj实现的

​ spring-aspects.jar aspectj的规则

​ aspectjweaver.jar 织入的技术

​ aopalliance.jar 设置通知的规则

b)创建目标类和通知类

public class UserServiceImpl implements UserService{ @Override public int saveUser() { userDao.saveUser(); return 0; } @Override public int delUser() { userDao.delUser(); return 0; } } public class MyAdvice{ //JoinPoint用于获取目标对象中的相关信息 public void before(JoinPoint joinPoint){ System.out.println("添加事务"); } public void after(){ System.out.println("关闭事务"); } public void afterReturning(){ System.out.println("后置通知"); } public void afterThrowing(){ System.out.println("异常通知"); } //环绕通知,必须手动调用目标对象的方法 public void around(ProceedingJoinPoint joinPoint){ try{ System.out.println("前置"); joinPoint.proceed(); System.out.println("返回"); }catch(){ System.out.println("异常"); }finally{ System.out.println("后置通知"); } } } <!--创建目标对象--> <bean id="userService" ></bean> <!--创建增强类对象--> <bean id="myAdvice" ></bean> <!--将通知织入到目标对象上 aop:config属性 proxy-target- true代表强制使用cglib --> <aop:config> <!--切入点:配置要向什么地方添加增强代码 expression:execution(返回值类型 包名 类名 方法名(参数,...)) * service..*(..) --> <aop:pointcut expression="execution(* service..*(..))" id="myPointcut"/> <!--切面:添加什么,如何添加--> <aop:aspect ref="myAdvice"> <!--前置通知--> <!--<aop:before method="before" pointcut-ref="myPointcut"/>--> <!--后置通知--> <!--<aop:after method="after" pointcut-ref="myPointcut"/>--> <!--返回通知--> <!--<aop:after-returning method="afterReturning" pointcut-ref="myPointcut"/>--> <!--异常通知--> <!--<aop:after-throwing method="afterThrowing" pointcut-ref="myPointcut"/>--> <!--环绕通知--> <aop:around method="around" pointcut-ref="myPointcut"/> </aop:aspect> </aop:config> //测试类 @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations="classpath:applicationContext.xml") public class AopTest{ @Autowired UserService userService; @Test public void test(){ userService.saveUser(); userService.delUser(); } }
    你可能想看:

    扫描二维码推送至手机访问。

    版权声明:本文由皇冠云发布,如需转载请注明出处。

    本文链接:https://www.idchg.com/info/24270.html

    分享给朋友:

    “Spring入门第三讲 Spring中的代理 静态代理 动态代理(JDK代理) cglib代理(字节码增强) Spring中的AOPspring的静态代理和动态代理” 的相关文章

    Hostwinds LLC:卓越的网络托管服务与高性价比优势

    Hostwinds LLC成立于2010年,位于美国西雅图。这家公司一直专注于提供多种网络托管服务,包括虚拟主机、虚拟专用服务器(VPS)和独立服务器。在这个竞争激烈的市场中,Hostwinds凭借其独特的优势和不断升级的服务赢得了客户的信赖。我个人认为,Hostwinds的历史反映了它对客户需求的...

    Lightlayer在菲律宾的应用与优势:智能光电解决方案

    光电技术的迅速发展让我们有机会迎接许多新概念和新技术,其中Lightlayer便是一个值得关注的例子。在我第一次听到“Lightlayer”这个词时,它似乎蕴含了科技的无限可能。Lightlayer简单来说是一个光电解决方案,能够通过创新的方式来管理和优化光源。它不仅在设计上追求完美,更在功能上实现...

    搬瓦工机场优惠:享受稳定快速网络服务的最佳选择

    在了解搬瓦工机场之前,我认为确实有必要先对这个服务进行全面的认识。搬瓦工机场(Just My Socks)是由加拿大著名VPS服务提供商搬瓦工(BandwagonHost)于2018年推出的一项机场服务。这个项目的目标是为用户提供更为便捷、快速的网络连接方式,尤其是在某些地区的网络受限时显得尤为重要...

    2023年美国服务器市场分析与未来展望

    在美国,服务器市场一直以来都具有举足轻重的地位。到了2023年,这个市场依旧保持着强劲的增长势头。根据IDC的分析报告,2023年第一季度,美国的服务器市场规模达到了2212亿美元,相比去年增长了2%。这不仅显示了市场的健康发展,也奠定了美国在全球服务器市场的领导地位,全球市场份额约为30%。 随着...

    OVH云服务概述:高性价比的VPS与专用服务器解决方案

    OVH概述 谈到云服务提供商,OVH无疑是一个引人注意的名字。这家成立于1999年的法国公司,总部位于鲁贝,已经从当初的小公司发展成为全球领先的云服务平台。OVH不仅为个人和企业提供各种云计算解决方案,还持续推动技术创新,满足越来越多用户的需求。 OVH拥有广泛的服务网络,分布在北美、欧洲、亚洲和非...

    如何安全地开放所有端口并规避网络风险

    我第一次接触网络配置的时候,看到“开放所有端口”这个词,心里有些忐忑。其实,开放端口是网络通信中非常基础的概念。简单来说,端口就像是网络中的开口,允许不同的应用程序和服务进行数据交换。每个端口都有其独特的号码,从1到65535不等,其中小于1024的端口通常用于系统服务,而大于1024的端口就属于应...