再多学一点Spring之Spring AOP

什么是AOP?

        AOP全拼Aspect Oriented Programming。中文翻译为面向切面编程。是对面向对象编程的

AOP中的概念

        切面(Aspect):是对横切关注点的抽象。(切点+通知)

        连接点(Join Point):程序运行的一个节点,方法的运行获取异常的处理。

        切点(Pointcut):指定通知的目标方法。下面示例的AopLearn的print方法。

        通知(Advice):定义了对目标的增强功能,通知指定两个信息:指定什么时候执行,执行什么。下方示例的AopHandler类。

                通知的织入时机分为:方法调用前、方法调用后、方法抛出异常后、围绕着方法执行、方法返回结果之后。

        目标对象(Target):将要被增强的对象。自从Spring AOP使用动态代理来实现之后,目标对象通常是代理对象。

        织入(Weaving):将切面和其他对象连接起来,并创建通知对象的过程。

Spring AOP使用示例

        Spring AOP有四个通知接口可以实现:

                MethodBeforeAdvice:执行前通知。

                AfterReturningAdvice:返回结果后通知。

                MethodInterceptor:环绕通知。

                ThrowsAdvice:异常通知。

AopHandler.java

public class AopHandler implements MethodBeforeAdvice, AfterReturningAdvice, MethodInterceptor {

    @Override
    public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
        System.out.println("aop-afterReturn");
    }

    @Override
    public void before(Method method, Object[] args, Object target) throws Throwable {
        System.out.println("aop-before");
    }

    @Override
    public Object invoke(MethodInvocation invocation) throws Throwable {
        System.out.println("aop-around-before");
        Object resultVal = invocation.proceed();
        System.out.println("aop-around-after");
        return resultVal;
    }
}

AopLearn.java

public class AopLearn {
    public void print() {
        System.out.println("AopLearn-print");
    }
}

xml文件



    
    
    
        
        
    

    
        
        

        
        
    

    
        
        
            
                aopLearn
            
        

        
        
            
                aopHandler
            
        
    

输出结果

再多学一点Spring之Spring AOP_第1张图片

AspectJ使用示例

AopHandler.java

public class AopHandler {

    public void before() {
        System.out.println("aop-before");
    }

    public void after() {
        System.out.println("aop-after");
    }

    public void afterReturn() {
        System.out.println("aop-afterReturn");
    }

    public void afterThrowing() {
        System.out.println("aop-afterThrowing");
    }

    public Object around(ProceedingJoinPoint point) throws Throwable {
        System.out.println("aop-around-before");
        Object obj = point.proceed();
        System.out.println("aop-around-after");
        return obj;
    }
}

AopLearn.java

public class AopLearn {
    public void print() {
        System.out.println("AopLearn-print");
    }
}

xml文件



    
    

    
        
            
            
            
            
            
            
        
    

输出结果

再多学一点Spring之Spring AOP_第2张图片

AspectJ与Spring AOP

        Spring AOP是依附于IOC实现的,实现了简单的AOP功能,可以满足程序员用于解决日常问题的需求。而AspectJ完整的实现了AOP功能。

        因为Spring AOP是基于IOC实现的,所以Spring AOP只能作用在bean对象上。而且通过示例,我发现从使用的角度来说,Spring AOP要更加难用一些,甚至ThrowsAdvice需要自己按照规范定义方法。

        Spring AOP是基于代理的AOP框架,可以通过cglib代理和jdk动态代理两种方式来实现,所以Spring AOP的切面是运行时织入的。而AspectJ在编译器就完成了织入。

你可能感兴趣的:(多些了解Spring,spring,java,后端)