Spring面向切面编程(AOP)三之AOP的使用及配置
程序员文章站
2022-05-24 23:44:21
...
-
引入必须的jar包
-
再配置文件里面,添加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>
- 创建Target,需要被增强的类,含有多个连接点(方法)
//需要被增强的对象,含有多个连接点
public class GoodsDao {
public void save(){
System.out.println("执行保存操作");
}
public void delete(){
System.out.println("执行删除操作");
}
}
- 创建一个切面类,里面拥有通知,就是需要增强的方法
//切面类,里面拥有通知,就是需要增强的方法
public class Myaspect {
//通知aspect
public void check(){
System.out.println("权限校验");
}
}
- 将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>
- 配置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。
- 测试
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
下一篇: Spring学习之使用XML配置AOP