java Spring框架AOP(面向切面编程)

Sping框架两个重要思想是IOC和AOP,AOP全名是aspect oriented programming,即面向切面编程的意思。AOP思想允许我们在执行业务代码的前后执行另外的代码,如写日志、验证权限。其实Servlet中的Filter就体现了AOP思想。
Spring中,AOP需要继承特定的接口。这些实现了AOP接口的类被称为Interceptor(拦截器),Interceptor有多种,有方法前拦截器、方法后拦截器、around拦截器、异常拦截器。

下面是一个方法前拦截器:
MethodBeforeAdviceImpl.java:

package com.yeetrack.mavenSpring;

    import java.lang.reflect.Method;
    import java.util.Arrays;

    import org.springframework.aop.MethodBeforeAdvice;

    public class MethodBeforeAdviceImpl implements MethodBeforeAdvice
    {
        public void before(Method arg0, Object[] arg1, Object arg2)
                throws Throwable
        {
            // TODO Auto-generated method stub
            System.out.println("这是插入进来的方法,方法调用前执行---");
            System.out.println("Method: "+ arg0.getName()); //输出方法名字
            System.out.println("Args: " + Arrays.asList(arg1)); //输出方法参数列表
            System.out.println("Object: "+arg2); //输出对象
        }
    }

当我们在applicationContext.xml为某个类的方法A定义了此拦截器后,spring在执行方法A之前会调用MethodBeforeAdviceImpl类中的before方法,参数分别为方法A的方法名、参数列表和A所在的类实例。

在applicationContext.xml中配置该拦截器:

<?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="     
          http://www.springframework.org/schema/beans     
          http://www.springframework.org/schema/beans/spring-beans-3.0.xsd     
          http://www.springframework.org/schema/context     
          http://www.springframework.org/schema/context/spring-context-3.0.xsd 
          http://www.springframework.org/schema/aop     
          http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"
    default-autowire="byName">
    <!-- 拦截器对象 -->
    <bean id="methodBeforeAdviceImpl" class="com.yeetrack.mavenSpring.MethodBeforeAdviceImpl"></bean>
    <!-- 拦截器配置 -->
    <bean id="theAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
        <!-- 拦截器属性设置 -->
        <property name="advice">
            <ref local="methodBeforeAdviceImpl"/> 
        </property>
        <!-- 拦截所有方法 -->
        <property name="mappedName" value="*"></property>
    </bean>


    <!-- DAO对象 -->
    <bean id="daoImpl" class="com.yeetrack.mavenSpring.DaoImpl"></bean>

    <!-- Service对象 -->
    <bean id="serviceImpl" class="com.yeetrack.mavenSpring.ServiceImpl">
        <!-- 设置dao属性 -->
        <property name="dao" ref="daoImpl"></property>
    </bean>

    <!-- Spring代理类 -->
    <bean id="service" class="org.springframework.aop.framework.ProxyFactoryBean">
        <property name="interceptorNames" value="theAdvisor"></property><!-- 拦截器设置 -->
        <property name="target">  <!-- 被拦截的对象 -->
            <ref local="serviceImpl"/>
        </property>
    </bean>

    </beans> 

配置完之后,不用修改我们的SpringTest.java的代码,再次运行SpringTest可以看到首先执行了拦截器中的before方法,运行结果:

这是插入进来的方法,方法调用前执行---

```html
Method: sayHello
    Args: [Good Day!]
    Object: com.yeetrack.mavenSpring.ServiceImpl@67eb366
    Hello, Good Day!  

java Spring框架IOC(控制反转)
java Spring框架AOP(面向切面编程)

版权声明

本站文章、图片、视频等(除转载外),均采用知识共享署名 4.0 国际许可协议(CC BY-NC-SA 4.0),转载请注明出处、非商业性使用、并且以相同协议共享。

© 空空博客,本文链接:https://www.yeetrack.com/?p=13