码迷,mamicode.com
首页 > 编程语言 > 详细

spring学习之aop(面向切面编程)

时间:2019-07-20 17:10:19      阅读:174      评论:0      收藏:0      [点我收藏+]

标签: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();
    }

}

实验截图:

技术图片

 

 

  

spring学习之aop(面向切面编程)

标签:scl   生成   删除用户   rgs   类加载   aop   面向切面编程   cut   ble   

原文地址:https://www.cnblogs.com/2312947032zyk/p/11210389.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!