面向切面编程,利用 aop 可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
即不改变源代码而添加新功能,可插拔的.
提示:以下是本篇文章正文内容,下面案例可供参考
有接口:jdk动态代理,即创建接口实现类代理对象
无接口:cglib动态代理,即创建子类代理对象
jdk动态代理的实现
创建接口
package com.vector.spring5;public interface urdao { public int add(int a,int b); public string update(string id);}
接口实现类
接口实现类的方法,属于源代码,用aop思想增添新功能时这里不能动!
package com.vector.spring5;public class urdaoimpl implements urdao{ @override public int add(int a, int b) { return a+b; } @override public string update(string id) { return id; }}
使用jdk动态代理对象,增添新功能欢迎来到的英文
package com.vector.spring5;import java.lang.reflect.array;import java.lang.reflect.invocationhandler;import java.lang.reflect.method;import java.lang.reflect.proxy;import java.util.arrays;public class jdkproxy { public static void main(string[] args) { //创建接口实现类代理对象 class[] interfaces = {urdao.class}; urdaoimpl urdao = new urdaoimpl(); urdao dao= (urdao) proxy.newproxyinstance(jdkproxy.class.getclassloader(),interfaces,new urdaoproxy(urdao)); int result = dao.add(1,2); system.out.println("result: "+result); }}//创建代理对象class urdaoproxy implements invocationhandler{ //有参构造传递增强对象 private object obj; public urdaoproxy(){}; public urdaoproxy(object obj){ this.obj=obj; } //增强的逻辑 @override public object invoke(object proxy, method method, object[] args) throws throwable { //方法之前 system.out.println("方法之前执行: "+method.getname()+":传递的参数: "+ arrays.tostring(args)); //被增强的方法执行 //可以根据method.getname()判断选择增强 object res = method.invoke(obj,args); //方法之后 system.out.println("方法之后执行: "+obj); return res; }}
jdk代理图像解析
类里可以被增强的方法,称为连接点.
类中实际被增强的方法,成为切入点.
(1)实际被增强的方法中的逻辑部分称为通知(增强).
(2)通知包含:前置通知,后置通知,环绕通知,异常通知,最终通知
把增强应用到切入点的过程称为切面
(1)aspectj 不是 spring 组成部分360wifi连不上,独立 aop 框架,一般把 aspectj 和 spirng 框架一起使用,进行 aop 操作
maven准备
<dependency> <groupid>org.aspectj</groupid> <artifactid>aspectjweaver</artifactid> <version>1.9.8.rc1</version> </dependency>
实现组合crud和日志增函数功能结合
applicationcontext.xml
<context:component-scan ba-package="com.vector"/> <aop:config><!-- 切入点: expression:表达式 execution(要执行的位置!* * * * *)--> <aop:pointcut id="pointcut" expression="execution(* com.vector.rvice.urrviceimpl.*(..))"/><!-- 执行环绕增加!--> <aop:advisor advice-ref="log" pointcut-ref="pointcut"/> <aop:advisor advice-ref="afterlog" pointcut-ref="pointcut"/> </aop:config>
log.java
package com.vector.log;import org.springframework.aop.methodbeforeadvice;import org.springframework.stereotype.component;import java.lang.reflect.method;@component("log")public class log implements methodbeforeadvice { //method: 要执行的目标对象的方法 //args: 参数 //target: 目标对象 @override public void before(method method, object[] args, object target) throws throwable { system.out.println(target.getclass().getname()+"的"+method.getname()+"被执行了"); }}
urrvice.java
package com.vector.rvice;public interface urrvice { public void add(); 国家为什么不宣传越战 public void delete(); public void update(); public void query();}
urrviceimpl.java
package com.vector.rvice;import org.springframework.stereotype.rvice;@rvice("urrvice")public class urrviceimpl implements urrvice{ @override public void add() { system.out.println("增加了一个用户"); }}
mytest.java
public class mytest { public static void main(string[] args) { applicationcontext context = new classpathxmlapplicationcontext("applicationcontext.xml"); //动态代理的是接口 urrvice urrvice = (urrvice) context.getbean("urrvice"); urrvice.add(); }}
diypoint.java
package com.vector.diy;import org.springframework.stereotype.component;@component("diypointcut")public class diypointcut { public void before(){ system.out.println("===方法执行前==="); } public void after(){ system.out.println("===方法执行后==="); }}
urrviceimpl.java
package com.vector.rvice;import org.springframework.stereotype.rvice;@rvice("urrvice")public class urrviceimpl implements urrvice{ @override public void add() { system.out.println("增加了一个用户"); }}
applicationcontext.xml
<aop:config><!-- 自定义切面,ref要引用的类--> <aop:aspect ref="diypointcut"><!-- 切入点--> <aop:pointcut id="pointcut" expression="execution(* com.vector.rvice.urrviceimpl.*(..))"/><!-- 通知--> <aop:before method="before" pointcut-ref="pointcut"/> <aop:after method="after" pointcut-ref="pointcut"/> </aop:aspect> </aop:config>
mytest.java
public class mytest { public static void main(string[] args) { applicationcontext context = new classpathxmlapplicationcontext("applicationcontext.xml"); //动态代理的是接口 urrvice urrvice = (urrvice) context.getbean("urrvice"); urrvice.add(); }}
urrviceimpl.java
package com.vector.rvice;import org.springframework.stereotype.rvice;@rvice("urrvice")public class urrviceimpl implements化学反应速率和限度 urrvice{ @override public void add() { system.out.println("增加了一个用户"); }}
annotationpointcut.java
package com.vector;import org.aspectj.lang.annotation.after;import org.aspectj.lang.annotation.aspect;import org.aspectj.lang.annotation.before;import org.springframework.context.annotation.enableaspectjautoproxy;import org.springframework.stereotype.component;//标注这个类是一个切面@aspect@component("annotationpointcut")//开启aop注解驱动@enableaspectjautoproxypublic class annotationpointcut { @before("execution(* com.vector.rvice.urrviceimpl.*(..))") public void before(){ system.out.println("===方法执行前==="); } @after("execution(* com.vector.rvice.urrviceimpl.*(..))") public void after(){ system.out.println("===方法执行后==="); }}
mytest.java
public class mytest { public static void main(string[] args) { applicationcontext context = new classpathxmlapplicationcontext("applicationcontext.xml"); //动态代理的是接口 urrvice urrvice = (urrvice) context.getbean("urrvice"); urrvice.add(); }}
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注www.887551.com的更多内容!
本文发布于:2023-04-04 10:15:02,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/0b3a58b3bc579a65d3cc3c8a5dcee17e.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:详解Java Spring AOP.doc
本文 PDF 下载地址:详解Java Spring AOP.pdf
留言与评论(共有 0 条评论) |