Spring基础学习5——spring AOP基本使用
Spring增强
1、导入AOP相关的包
2、在context中引入对应的约束
<?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 definitions here -->
</beans>
3、创建切面对象和对应的增强对象
// 创建接口和实现类
public interface TestAopInterface {
public void save();
public void update();
}
public class TestAopImpl implements TestAopInterface {
@Override
public void save() {
System.out.println("save");
}
@Override
public void update() {
System.out.println("update");
}
}
// 创建增强类
public class MyAspectXML {
public void checkPri(){
System.out.println("aop 权限校验");
}
}
<!--配置目标对象-->
<bean id="testAop" class="com.hhh.spring.demo.inter.TestAopImpl"></bean>
<!--将切面对象交给Spring管理-->
<bean id="myAspect" class="com.hhh.spring.demo.aop.MyAspectXML"></bean>
<!--拖过AOP配置完成对目标类产生代理-->
<aop:config>
<!--expression:表达式配置哪些类的那些方法需要进行增强 *:任意返回值 ..:任意参数 -->
<aop:pointcut id="pointcut1" expression="execution(* com.hhh.spring.demo.inter.TestAopImpl.save(..))"/>
<!--配置切面-->
<aop:aspect ref="myAspect">
<aop:before method="checkPri" pointcut-ref="pointcut1"/>
</aop:aspect>
</aop:config>
4、创建接口和实现对象
@RunWith(SpringJUnit4ClassRunner.class) // 单元测试注解
@ContextConfiguration( "classpath:applicationContext.xml") // 直接注入context
public class SpringDemo1 {
@Resource(name = "testAop") // 引入contex中id为testAop的bean的接口方法
private TestAopInterface mTestAopInterface; // 注意!!!这里只能是接口类,不然报错
@Test
public void demo1(){
mTestAopInterface.save();
mTestAopInterface.update();
}
}
Spring通知
通知类型:有一些像try catch 结构
前置通知
方法执行前调用
后置通知
方法执行后调用
环绕通知
在方法执行之前和之后进行操作
异常跑出通知
在程序异常的时候进行操作
最终通知
无论代码是否异常总会执行
<!--拖过AOP配置完成对目标类产生代理-->
<aop:config>
<!--expression:表达式配置哪些类的那些方法需要进行增强 *:任意返回值 ..:任意参数 -->
<aop:pointcut id="pointcut1" expression="execution(* com.hhh.spring.demo.inter.TestAopImpl.save(..))"/>
<!--配置切面-->
<aop:aspect ref="myAspect">
<!-- 前置通知-->
<aop:before method="before" pointcut-ref="pointcut1"/> <!--前置通知-->
<aop:after-returning method="around" pointcut-ref="pointcut1"/> <!--后置通知-->
<aop:after-around method="after" pointcut-ref="pointcut1"/> <!--环绕通知-->
<aop:after-throwing method="afterThrowing" pointcut-ref="pointcut1"/> <!--异常抛出通知-->
<aop:after method="finallyDo" pointcut-ref="pointcut1"/> <!--最终通知-->
</aop:aspect>
</aop:config>