Spring中基于AspectJ的AOP切面编程介绍及实现

简介:

  1. AOP Aspect Oriented Programing 面向切面编程
  2. AOP采取==横向抽取==机制,取代了传统==纵向继承==体系重复性代码(性能监视、事务管理、安全检查、缓存)
  3. Spring中的Aop是纯Java来实现的,使用==动态代理==的方式增强代码
  4. AOP不是由Spring提出来的,是由AOP联盟定义的

专业术语:

  1. Joinpoint(连接点) :委托类中可以被增强的方法
  2. ==Pointcut(切入点) :切点 ,要被增强的方法==
  3. ==Advice(通知/增强) :增强的代码==
  4. Target(目标对象) :委托对象
  5. Weaving(织入) :把增强应用切点的过程
  6. Proxy(代理): 一个类被AOP织入增强后,就产生一个结果代理类
  7. ==Aspect(切面): 是切点通知的结合==

Aspect的增强类型:

  1. @Before 前置通知
  2. @AfterReturning 后置通知
  3. @Around 环绕通知
  4. @AfterThrowing抛出通知
  5. @After 最终final通知

实现:

1.引入pom依赖

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>4.3.10.RELEASE</version>
</dependency>


<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
</dependency>

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>4.3.10.RELEASE</version>
</dependency>

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aspects</artifactId>
    <version>4.3.10.RELEASE</version>
</dependency>

2.配置自动代理和注解扫描器

<?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: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.xsd
                           http://www.springframework.org/schema/context
                           http://www.springframework.org/schema/context/spring-context.xsd
                           http://www.springframework.org/schema/aop
                           http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">
    <!--配置注解扫描器-->
    <context:component-scan base-package="com.it.bigdata"/>

    <!--开启aop自动代理-->
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans>

3.编写dao(委托类)

package com.it.bigdata;
import com.sun.xml.internal.bind.v2.model.core.ID;
import org.springframework.stereotype.Repository;
@Repository
public class UserDao {
    public void addUser(User user) {
        System.out.println("添加用户.." + user);
    }

    public void deleteUser(Integer id) {
        System.out.println("删除用户" + id);
    }

    public void findUser(Integer id) {
        System.out.println("查询用户" + id);
    }

    public void updateUser(Integer id) {
        System.out.println("修改用户" + id);
    }
}

4.编写切面

package com.it.bigdata;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

/**
 * 切面 = 切点(切点表达式) + 通知(要增强的代码,方法)
 */
@Aspect
@Component
public class MyAspect {
    /**
     * 通知
     */
    @Before("execution( * com.it.bigdata.UserDao.delete*(..))")
    public void advice1() {
        System.out.println("通知1");
    }
}

5.调用dao的方法

userDao.deleteUser(12);

猜你喜欢

转载自blog.csdn.net/Chenlele710147/article/details/84800424