美文网首页
Spring aop 开篇(1)2018-08-12

Spring aop 开篇(1)2018-08-12

作者: Seetheworl_6675 | 来源:发表于2018-08-12 21:47 被阅读0次

    AOP(Aspect Oriented Programming):面向切面编程
    核心思想:动态的添加和删除切面上的逻辑而不影响原来的执行代码

    AOP相关概念:

    1、连接点(Joinpoint)

    连接点是指在程序执行过程中某个特定的点,比如某方法调用的时候或者处理异常的时候;

    2、切点(Pointcut)

    AOP通过切点定位特定连接点。连接点和切点不是一一对应的关系,一个切点可以匹配多个连接点。

    3、通知(Advice)

    通知是织入到目标类连接点上的一段程序代码,有以下分类:

    ·前置通知(Before):在目标方法或者说连接点被调用前执行的通知;
    ·后置通知(After):指在某个连接点完成后执行的通知;
    ·返回通知(After-returning):指在某个连接点成功执行之后执行的通知;
    ·异常通知(After-throwing):指在方法抛出异常后执行的通知;
    ·环绕通知(Around):指包围一个连接点通知,在被通知的方法调用之前和之后执行自定义的方法。

    4、目标对象(Target Object)

    增强逻辑的织入目标类。

    5、引介(Introduction):

    引介是一种特殊的增强,它为类添加一些属性和方法。这样,即使一个业务类原本没有实现某个接口,通过AOP的引介功能,我们可以动态的为该事务添加接口的实现逻辑,让业务类成为这个接口的实现类。

    6、织入(Wearving)

    织入是将增强添加对目标类具体连接点上的过程,AOP象一台织布机,将目标类增强或引介AOP这台织布机天衣无缝的编织在一起。

    7、切面(Aspect)

    切面由切点和通知组成,它既包括了横切逻辑的定义,也包括了连接点的定义,SpringAOP就是负责实施切面的框架,它将切面所定义的横切逻辑织入到切面所指定的链接点中。

    第一个实例:

    定义Target

    //定义一个Target 接口
    public interface ProxyService {
        /**
         * 测试方法
         */
        void testProxy();
    }
    //提供实现类
    public class ProxyServiceImpl implements ProxyService {
        @Override
        public void testProxy() {
            System.out.println("我是ProxyService中的测试方法......");
        }
    }
    

    aop配置类:

    @Aspect
    public class AopAdviceConfig {
        @Before("execution(* study.chenji.spring.aop..*.*(..))")
        public void beforeAdvice(JoinPoint joinPoint) {
            System.out.println(joinPoint.getThis());
            System.out.println("我是前置通知....");
        }
    
        @After("execution(* study.chenji.spring.aop..*.*(..))")
        public void afterAdvice(JoinPoint joinPoint) {
            System.out.println(joinPoint.getThis());
            System.out.println("我是后置通知....");
        }
    }
    

    测试:

    public class TestAop {
        public static void main(String[] args) {
            //手工创建一个实例(Target)
            ProxyService aspectJService = new ProxyServiceImpl();
            //使用AspectJ语法 自动创建代理对象
            AspectJProxyFactory aspectJProxyFactory = new AspectJProxyFactory(aspectJService);
            //添加切面和通知类
            aspectJProxyFactory.addAspect(AopAdviceConfig.class);
            //创建代理对象
            ProxyService proxyService = aspectJProxyFactory.getProxy();
            //进行方法调用
            proxyService.testProxy();
        }
    }
    

    测试结果:

    aop.ProxyServiceImpl@50ad3bc1
    我是前置通知....
    我是ProxyService中的测试方法......
    aop.ProxyServiceImpl@50ad3bc1
    我是后置通知....
    

     从上面的输出结果来看,我们的AOP拦截功能是生效了。但是对于这样的操作是不是很奇怪?上面的AspectJProxyFactory这个类又是什么鬼?怎么只调用了一下addAspect方法,然后调用getProxy方法生成代理对象,这样就能进行AOP拦截了?

    后面的篇章我们持续的去理解它。。。。

    相关文章

      网友评论

          本文标题:Spring aop 开篇(1)2018-08-12

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