标签:scl 生成 删除用户 rgs 类加载 aop 面向切面编程 cut ble
AOP术语学习:
Aspect:切面,封装用于横向插入系统功能(事务,日志)的类
Joinpoint:连接点,在程序执行过程中的某个阶段点
Pointcut:切入点,切面与程序流程的交叉点,即那些需要处理的连接点。
Advice:在定义好的切入点所要执行的程序代码,可以理解为切面类中的方法。
Target Object:通知的对象,如果aop采用的是动态aop实现,该对象就是一个被代理对象。
Proxy:代理,将通知应用到目标对象之后,被动态创建的对象。
Weaving:织入,将切面代码插入到目标对象上,从而生成代理对象的过程。
要导入的包:
jdk代理:
UserDao.java
1 package com.itheima.jdk; 2 3 public interface UserDao { 4 public void addUser(); 5 public void deleteUser() ; 6 }
UserDaoImpl.java
1 package com.itheima.jdk; 2 3 import org.springframework.stereotype.Repository; 4 5 /* aop jdk代理*/ 6 @Repository("userDao") 7 public class UserDaoImpl implements UserDao { 8 9 @Override 10 public void addUser() { 11 // TODO Auto-generated method stub 12 System.out.println("添加用户"); 13 } 14 15 @Override 16 public void deleteUser() { 17 // TODO Auto-generated method stub 18 System.out.println("删除用户"); 19 } 20 21 }
JdkProxy.java
1 package com.itheima.jdk; 2 3 import java.lang.reflect.InvocationHandler; 4 import java.lang.reflect.Method; 5 import java.lang.reflect.Proxy; 6 7 import com.itheima.aspect.MyAspect; 8 9 public class JdkProxy implements InvocationHandler { 10 11 /* 声明目标类接口 */ 12 private UserDao userDao; 13 14 15 /* 创建代理方法 */ 16 public Object creatProxy(UserDao userDao) { 17 this.userDao=userDao; 18 /* 类加载器 */ 19 ClassLoader classLoader=JdkProxy.class.getClassLoader(); 20 //被代理对象实现的所有接口 21 Class<?>[] interfacesClasses=userDao.getClass().getInterfaces(); 22 //使用代理类进行增强,返回的是代理后的对象 23 return Proxy.newProxyInstance(classLoader, interfacesClasses, this); 24 } 25 26 /* 所有动态代理类的方法调用都交由invok方法处理 27 * arg0 被代理后的对象 28 * arg1 将要被执行的方法信息 29 * arg2 执行方法需要的参数 30 * */ 31 32 @Override 33 public Object invoke(Object arg0, Method arg1, Object[] arg2) throws Throwable { 34 // TODO Auto-generated method stub 35 36 //声明切面 37 MyAspect myAspect=new MyAspect(); 38 //前增强 39 myAspect.check_Permission(); 40 //在目标类上调用方法,传入参数 41 Object object=arg1.invoke(userDao, arg2); 42 //后增强 43 myAspect.log(); 44 return object; 45 } 46 47 }
MyAspect.java
1 package com.itheima.aspect; 2 3 4 /*jdk代理 5 切面类:可以存在多个通知Advice(增强的方法)*/ 6 public class MyAspect { 7 public void check_Permission() { 8 System.out.println("模拟检查权限"); 9 } 10 11 public void log() { 12 System.out.println("模拟创建日志"); 13 } 14 }
JdkTest.java
package com.itheima.jdk; //jdk动态代理测试 public class JdkTest { public static void main(String[] args) { // TODO Auto-generated method stub //创建代理对象 JdkProxy jdkProxy=new JdkProxy(); //创建目标对象 UserDao userDao=new UserDaoImpl(); //从代理对象中获取增强后的目标对象 UserDao useaoDao1=(UserDao)jdkProxy.creatProxy(userDao); useaoDao1.addUser(); useaoDao1.deleteUser(); } }
实验截图:
标签:scl 生成 删除用户 rgs 类加载 aop 面向切面编程 cut ble
原文地址:https://www.cnblogs.com/2312947032zyk/p/11210389.html