Sping AOP 面向切面编程 以XML文件配置

2019-07-28 0 By admin

一、Maven POM文件添加依赖

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.0.3.RELEASE</version>
</dependency>
<!-- 这个用于解析切入点方法表达式 -->
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.8.13</version>
</dependency>

二、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:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd">
<!--配置spring的ioc ,  把service对象配置进来-->
    <bean id="accountService" class="com.chensy.service.Imp.AccountSeriveImp"></bean>
<!--spring中的基于xml的AOP  配置步骤-->
<!--1.把通知Bean Logger类也交给spring来管理-->
    <bean id="logger" class="com.chensy.Utils.Logger"></bean>
<!--2.使用aop:config标签标志开始AOP的配置-->
<!--3.使用aop:aspect标签标志配置切面;id属性: 给切面提供一个唯一标识;ref属性: 指定通知类bean的id-->
    <aop:config>
        <aop:aspect id="logAdvice" ref="logger">
            <aop:before method="printLog" pointcut="execution(public void
 com.chensy.service.Imp.AccountSeriveImp.saveAccount())"></aop:before>
        </aop:aspect>
    </aop:config>
	</beans>
<!--4.在aop:aspect标签内部使用相应的标签来配置通知的类型
    aop:before 前置通知
       method: 指定Logger类中的哪个方法是前置通知
       pointcuit: 用于指定切入点表达式, 该表达式指的是哪些方法需要增强
    切入点表达式的写法:
       execution
       表达式:
          访问符  返回值  包名.包名.......类名.方法名(参数列表)
           如:execution(public void 
com.chensy.service.Imp.AccountSeriveImp.saveAccount())
           全通配写法:* *..*.*(..)
          一般写法: * com.chensy.service.Imp.*.*(..)
             注:  1.访问修饰符可以省略
                  2.返回值可以用通配符表示
                  3.包路径用..来代替, 它表示当前包下所有的子包
                  4.类名和方法名均可以用通配符通配
                  5.方法参数列表可以: 
                    基本类型名称:                  int
                    引用类型 写包名.类名           java.lang.String
                    可以使用通配符*, 表示所有有参数的方法
                    可以使用.. 表示各种有无参数的方法-->

三、实体类接口

public interface AccountService
{
    /*
     * @Description //TODO 模拟保存账户
     **/
    void saveAccount();
    /*
     * @Description //TODO 模拟更新账户
     **/
    void updateAccount(int i);
    /*
     * @Description //TODO 模拟删除账户
     **/
    int deleteAccount();
}

四、实体类实现类

public class AccountSeriveImp implements AccountService
{
    public void saveAccount() {
        System.out.println("执行了保存");
    }
    public void updateAccount(int i) {
        System.out.println("执行了更新" + i);
    }
    public int deleteAccount() {
        System.out.println("执行了删除");
        return 0;
    }
}

五、通知类

public class Logger
{
    /*
     * @Description //TODO 打印日志, 让其在切入点方法执行之前执行
     **/
    public void printLog(){
        System.out.println("Logger[printLog] is stating.....");
    }
}

六、Test 测试

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
    public static void main(String[] args) {
            //1.获取容器
            ApplicationContext ac = new ClassPathXmlApplicationContext("Application.xml");
            //2.获取对象
            AccountService as = (AccountService) ac.getBean("accountService");
            //3.执行方法
            as.saveAccount();
            as.updateAccount(1);
            as.deleteAccount();
    }
}

七、AOP 动态代理名词解释

1、Aspect( 切面):
是切入点和通知(引介)的结合。
2、Joinpoint( 连接点):
所谓连接点是指那些被拦截到的点。在 spring 中,这些点指的是方法,因为 spring 只支持方法类型的连接点。AccountService 类中的方法。
3、Pointcut( 切入点):
所谓切入点是指我们要对哪些 Joinpoint 进行拦截的定义。AccountService类中被拦截的方法。
4、Advice( 通知/ 增强):
所谓通知是指拦截到 Joinpoint 之后所要做的事情就是通知。 Logger 类。
通知的类型:前置通知,后置通知,异常通知,最终通知,环绕通知。
5、Introduction( 引介):
引介是一种特殊的通知在不修改类代码的前提下, Introduction 可以在运行期为类动态地添加一些方法或 Field。
6、Target( 目标对象):
代理的目标对象。
7、Weaving( 织入):
是指把增强应用到目标对象来创建新的代理对象的过程。
spring 采用动态代理织入,而 AspectJ 采用编译期织入和类装载期织入。
8、Proxy (代理):
一个类被 AOP 织入增强后,就产生一个结果代理类。