JavaWeb——Spring的AOP技术

JavaWeb——Spring系列

三、AOP 技术

  • Spring AOP 技术,是 Spring 框架的另一个较为重要的特性,是核心功能之一。
  • AOP(Aspect Oriented Program),中文译为面向切面编程,与面向对象编程(OOP)一样是一种编程思想,为弥补OOP的不足而诞生的一门新的编程思想。
  • Spring AOP 的实现有 JDK 代理和 CGLIB 代理两种,由于现在 JVM 性能的提高,这两者代理性能已经没有多大区别。

1、基本术语

  • 切面是对象操作过程中的截面,切面具体就是一段程序代码,一段被植入到程序流程中的代码。
  • 连接点,对象操作过程中的某个阶段点;程序流程图上的任意一点都可以是连接点。
  • 切入点是连接点的集合;更为形象的说话就是:切面与程序流程的“交叉点”便是程序的切入点,即切面注入到程序中的位置。
  • 目标对象(Target),所有被通知的对象。
  • 织入(Weaving)是指将切面功能应用到目标对象的过程。
  • 引入(Introduction),对一个已经编译完的类(class),在运行期间,动态地向这个类中加载属性和方法。

2、AOP 简单示例

  • 在 src 目录下地适当位置编写下面三个类,
    package com.myCode.AOPCode.target;
    
    public class Target {
        //程序执行的方法
        public void execute(String name){
            System.out.println("执行 execute() 方法:"+name);
        }
    }
    
    package com.myCode.AOPCode.log;
    
    import org.aopalliance.intercept.MethodInterceptor;
    import org.aopalliance.intercept.MethodInvocation;
    
    public class LoggerExecute implements MethodInterceptor {
        @Override
        public Object invoke(MethodInvocation methodInvocation) throws Throwable {
            before();
            methodInvocation.proceed();
            return null;
        }
        private void before(){
            System.out.println("程序开始执行!");
        }
    }
    
    //IntelliJ IDEA
    //Sprin01
    //Manager
    //2020/1/14
    // Author:御承扬
    //E-mail:[email protected]
    
    package com.myCode.AOPCode.manager;
    
    import com.myCode.AOPCode.log.LoggerExecute;
    import com.myCode.AOPCode.target.Target;
    import org.springframework.aop.framework.ProxyFactory;
    
    public class Manager {
        public static void main(String[] args) {
            Target target = new Target();
            ProxyFactory proxyFactory = new ProxyFactory();
            proxyFactory.addAdvice(new LoggerExecute());
            proxyFactory.setTarget(target);
            Target proxy = (Target)proxyFactory.getProxy();
            proxy.execute("AOP 的简单实现!");
        }
    }
    
  • 运行 Manager 类,控制台输出如下:
    程序开始执行!
    执行 execute() 方法:AOP 的简单实现!
    

3、切入点

  • Spring 地切入点可分为动态切入点、静态切入点和其他切入点,不同切入点地织入位置不一样。

3.1、动态切入点

  • 动态切入点地工作原理是根据程序运行过程中传递地参数地变化来织入不同地切面,因此比静态切入点更为灵活,但是不如静态切入点性能好。

3.2、静态切入点

  • 静态切入点的织入位置一般是不变的,并且需要在配置文件中指定:
    <bean id="pointcutAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
    	<property name="advice">
    		<ref bean="MyAdvisorDemo"/>
    	</property>
    	<property name="patterns">
    		<list>
    			<value>.*getConn*.</value>	//指定以 getConn 开头的方法名都是切入点
    			<value>.*closeConn*.</value>
    		</list>
    	</property>
    </bean>
    
  • 可见静态切入点是在某个方法名上织入切面的,因此在织入之前必须判断将要进行的方法是否在静态切入点列表中,是则织入,反之则非;判断操作通过 Spring 的 boolean matches(Method,class) 方法来完成,示例如下:
    public boolean matches(Method method,Class target){
    	return(method.getName().equals("getConn"));
    }
    
  • 在实际操作中,具体用静态还是动态,Spring 通过 isRuntime() 的返回值来确定,返回 false 则用静态切入点,返回 true 则用动态切入点。

3.3、其他切入点

  • Spring 除了动态切入点和静态切入点,还有其他切入点,如下表:
    切入点实现类 说明
    org.springframework.aop.support.jdkRegexpMethodPointcut JDK 正则表达式方法切入点
    org.springframework.aop.support.NameMatchMethodPointcut 名称匹配器切入点
    org.springframework.aop.support.StaticMethodMatcherPointcut 静态方法匹配器切入点
    org.springframework.aop.support.ControlFlowPointcut 流程切入点
    org.springframework.aop.support.DynamicMethodMatcherPointcut 动态方法匹配器切入点

4、Spring 的 Advisor

  • Advisor 就是 Spring 的 Aspect。
  • Advisor 是切入点的配置器,将 Advice(通知)注入程序中切入点的位置;Advisor 支持编程实现和 XML 配置。
  • Spring 中的 Advisor 可分为 PoincutAdvisor 和 IntroductionAdvisor 两大类;前者的两个常用 Advisor 是 DeafultPointcutAdvisor 和 NameMatchMethodPointcutAdvisor。

上一篇
下一篇

发布了146 篇原创文章 · 获赞 15 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_42896653/article/details/103975612