美文网首页程序员
spring aop概念以及jdk的动态代理

spring aop概念以及jdk的动态代理

作者: 知识学者 | 来源:发表于2018-09-16 11:58 被阅读61次

    AOP(Aspect-Oriented Programming),又称为面向切面编程。作为一种编程思想,AOP是 OOP(Object-Oriented Programing面向对象编程)一种 补充和完善。

    AOP相关的术语

    1.0 关注点
    关注点就是所关注的与业务无关的公共服务或系统级服务,如日志记录,权限检查,事务管理等。关注点通常称为横切关注点,表示要做什么。

    2.0 连接点
    连接点就是程序执行过程中明确的阶段点,如方法的调用或异常的抛出等。其实,关注点的功能就是添加到相应的连接点。因此,连接点表示在那里做。在spring aop中,一个连接点总代表一个方法的执行。

    3.0增强
    增强就是在特定的连接点处所执行的处理逻辑,也就是面向连接点注入代码。增强通常有称为增强处理,表示具体做什么。

    3.1.0 Before Advice 前置处理,在连接点执行前处理。

    3.2.0 AfterReturning Advice后置增强,在连接点成功执行后调用。

    3.3.0 AfterThrowing Advice,异常增强,在连接点抛出异常后被调用。

    3.4.0 Around Advice 环境增强,在连接点执行前与执行后被调用。

    4.0 切入点
    切入点就是可以插入增强的连接点。

    image.png

    Jdk的动态代理
    AOP是基于代理实现的,代理分为2大类,静态代理与动态代理。静态代理是在编译时候生成的,动态代理是在运行的时候生成的。

    下面看一个jdk的动态代理的deom。
    jdk动态代理需要一个接口,以及其实现类。

    定义接口 UserService

    package dflx;
    
    public interface UserService {
        
        public void add();
        
        public void serach();
        
    }
    

    以及其实现类UserImpl,和jdk动态代理类MyJdkProxy

    public class UserImpl implements UserService {
    
        @Override
        public void add() {
        System.out.println(" add user");
        }
    
        @Override
        public void serach() {
        System.out.println("search user");
    
        }
    
    }
    
    
    
    class MyJdkProxy implements InvocationHandler{
        
        private UserService user;
        
        public MyJdkProxy(UserService user)
        {
            this.user=user;
        }
        
        public UserService createJDKProxy(){
            
            return (UserService) Proxy.newProxyInstance(user.getClass().getClassLoader(),
    user.getClass().getInterfaces(),this);
            
        }
    
        @Override
        public Object invoke(Object proxy, Method method, Object[] args)
                throws Throwable {
            if(method.getName().equals("add"))
            {
                System.out.println("记录日志");
                return method.invoke(user, args);
            }else {
                
                return method.invoke(user, args);
            }
        }
    
        
        
    }
    

    测试类 MyJdkTest 如下

    package dflx;
    
    import org.junit.Test;
    
    public class MyJdkTest {
        
        @Test
        public void test() {
            //代理对象
            UserService user=new UserImpl();
            //创建代理
            MyJdkProxy myJdkProxy=new MyJdkProxy(user);
            
            UserService proxy=myJdkProxy.createJDKProxy();
            proxy.add();  //对add方法进行了增强
            proxy.serach();
            
        }
    
    }
    
    

    对add方法,进行了增强。
    结果如下

    记录日志
     add user
    search user
    
    

    相关文章

      网友评论

        本文标题:spring aop概念以及jdk的动态代理

        本文链接:https://www.haomeiwen.com/subject/jwmegftx.html