欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring面向切面编程(AOP)三之AOP的使用及配置

程序员文章站 2022-05-24 23:44:21
...
  1. 引入必须的jar包

  2. 再配置文件里面,添加aop约束

<?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">
</beans>
  1. 创建Target,需要被增强的类,含有多个连接点(方法)
//需要被增强的对象,含有多个连接点
public class GoodsDao {
    public void save(){
        System.out.println("执行保存操作");
    }
    public void delete(){
        System.out.println("执行删除操作");
    }
}
  1. 创建一个切面类,里面拥有通知,就是需要增强的方法
//切面类,里面拥有通知,就是需要增强的方法
public class Myaspect {

    //通知aspect
    public void check(){
        System.out.println("权限校验");
    }
}
  1. 将Target与切面类都交给Spring管理
<?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">
        
    <bean id="goods" class="SpringPro2.Demo3.GoodsDao"></bean>
    <!--首先把切面类交给Spring管理-->
    <bean id="myaspect" class="SpringPro2.Demo3.Myaspect"></bean>
    
</beans>
  1. 配置AOP
    分为两步,配置切入点和配置切面
 <!--配置Aop-->
    <aop:config>
        <!--配置切入点,给哪个方法增强-->
        <aop:pointcut id="cheaksave"
                      expression="execution(* SpringPro2.Demo3.GoodsDao.save(..))"></aop:pointcut>
        <!--配置切面,增强什么方法-->
        <aop:aspect ref="myaspect">
            <aop:before method="check" pointcut-ref="cheaksave"></aop:before>
        </aop:aspect>
    </aop:config>

配置切入点,id随便起的名字,用于后面切面中的引用。expression写一个execution表达式,表明给哪个类的哪个方法增强,表达式前面的*表示返回类型为任意类型,方法后面的(…)表明方法的参数也是任意类型。
配置切面,一个参数ref,引用之前交给Spring管理的切面类的id。里面配置<aop:before><aop:after>表明通知是在方法之前还是方法之后。method表示调用切面类中的哪个方法去用于增强,注意这里method后面的方法直接写名称,不用写双括号()。pointcut-ref表明是要给哪个切入点增强,就是上面配置的切入点id。

  1. 测试
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import javax.annotation.Resource;

//注解的形式,加载工厂(配置文件)
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class AOPTest {

    //引用类型,注解形式注入
    @Resource(name = "goods")
    private GoodsDao goodsDao;

    @Test
    public void Test(){
        this.goodsDao.save();
    }
}

运行结果

权限校验
执行保存操作

Process finished with exit code 0

已经在save()方法之前添加了一个通知(增强了一个方法)。

总结:
Spring中只需要配置参数,就会自动的创建代理对象,实现动态代理,方法的增强,其中的原理就是使用JDK方法代理或者Cglib方法代理。

Spring面向切面编程(AOP)原理一之使用JDK实现动态代理

Spring面向切面编程(AOP)原理二之使用Cglib实现动态代理