AOP入门
1.创建WEB项目和引入JAR包
引入基本的Jar包
引入AOP的包
2.引入Spring配置文件
引入命名空间
4.完善application_context.xml文件
5.编写测试类
1.前置通知:在目标方法执行之前执行操作
带返回值的后置通知:
切点方法:
切点配置:
3.环绕通知:在目标方法执行之前和执行之后执行
可以阻止目标的方法的执行。
切点通知:
4.异常通知:在程序出现异常的时候执行
切点方法:
application_context.xml文件的配置
5.最终通知:无论代码是否有异常,这段代码都会被执行
1.创建WEB项目和引入JAR包
引入基本的Jar包
引入AOP的包
2.引入Spring配置文件
引入命名空间
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd3.创建切面类/*
* 切面类
* 存放着 前后通知的方法
*/
public class MyAspect {
public void myBefore(){
System.out.println("前置通知---------");
}
public void myAfter(){
System.out.println("后置通知---------");
}
}4.完善application_context.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管理 -->
<bean id="productDao" class="spring4_aop.ProductDaoImpl"></bean>
<!-- 将切面类交给Spring管理-->
<bean id="myAspect" class="spring4_aop.MyAspect"></bean>
<!-- 通过AOP的配置完成对目标类 产生代理 -->
<aop:config>
<!-- 配置切点 -->
<aop:pointcut expression="execution(* spring4_aop.ProductDaoImpl.add())" id="mypoint"/>
<!-- 配置切面类 -->
<aop:aspect ref="myAspect">
<aop:before method="myBefore" pointcut-ref="mypoint"/>
<aop:after method="myAfter" pointcut-ref="mypoint"/>
</aop:aspect>
</aop:config>
</beans>5.编写测试类
public class Test {
public static void main(String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext("application_context.xml");
ProductDao productDao = (ProductDao) ac.getBean("productDao");//不能使用getBean("id",Class class);
productDao.add();
}
}Spring通知的类型1.前置通知:在目标方法执行之前执行操作
<aop:aspect ref="myAspect">
<aop:before method="myBefore" pointcut-ref="mypoint"/>
</aop:aspect>2.后置通知:在目标方法执行之后执行操作不带返回值的后置通知:
<aop:aspect ref="myAspect">
<aop:after method="myAfter" pointcut-ref="mypoint"/>
</aop:aspect>带返回值的后置通知:
切点方法:
public String delete() {
System.out.println("delete 方法执行了");
return "刘波";
}切点配置:
<aop:config>
<aop:pointcut expression="execution(* spring4_aop.ProductDaoImpl.delete(..))" id="mypoint1" />
<aop:aspect ref="myAspect">
<aop:after-returning method="myAfterReturn" pointcut-ref="mypoint1" returning="result"/>
</aop:aspect>
</aop:config>后置通知方法编写:public class MyAspect {
public void myAfterReturn(Object result){
System.out.println("这是带返回值的 环绕通知------"+result);
}
}3.环绕通知:在目标方法执行之前和执行之后执行
可以阻止目标的方法的执行。
<aop:config>
<aop:pointcut expression="execution(* spring4_aop.ProductDaoImpl.find(..))" id="mypoint2"/>
<aop:aspect ref="myAspect">
<aop:around method="myAround" pointcut-ref="mypoint2"/>
</aop:aspect>
</aop:config>切点通知:
public Object myAround(ProceedingJoinPoint joinPoint) throws Throwable{
System.out.println("这是环绕前的通知--------");
// 执行目标程序
Object obj = joinPoint.proceed();
System.out.println("这是环绕后的通知--------");
return obj;
}4.异常通知:在程序出现异常的时候执行
切点方法:
public void update() {
int avg = 234/0;故意制造错误
System.out.println("update方法执行了");
}application_context.xml文件的配置
<aop:config>
<aop:pointcut expression="execution(* spring4_aop.ProductDaoImpl.update(..))" id="mypoint3"/>
<!-- 配置切面类 -->
<aop:aspect ref="myAspect">
<aop:after-throwing method="myThrowing" pointcut-ref="mypoint3" throwing="error"/>
</aop:aspect>
<!-- 配置切面类1 -->
</aop:config>5.最终通知:无论代码是否有异常,这段代码都会被执行
<?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="productDao" class="spring4_aop.ProductDaoImpl"></bean>
<!-- 将切面类交给Spring管理-->
<bean id="myAspect" class="spring4_aop.MyAspect"></bean>
<!-- 通过AOP的配置完成对目标类 产生代理 -->
<aop:config>
<aop:pointcut expression="execution(* spring4_aop.ProductDaoImpl.add())" id="mypoint" />
<aop:pointcut expression="execution(* spring4_aop.ProductDaoImpl.delete(..))" id="mypoint1" />
<aop:pointcut expression="execution(* spring4_aop.ProductDaoImpl.find(..))" id="mypoint2"/>
<aop:pointcut expression="execution(* spring4_aop.ProductDaoImpl.update(..))" id="mypoint3"/>
<!-- 配置切面类 -->
<aop:aspect ref="myAspect">
<aop:before method="myBefore" pointcut-ref="mypoint"/>
<aop:after method="myAfter" pointcut-ref="mypoint"/>
<aop:after-returning method="myAfterReturn" pointcut-ref="mypoint1" returning="result"/>
<aop:around method="myAround" pointcut-ref="mypoint2"/>
<aop:after-throwing method="myThrowing" pointcut-ref="mypoint3" throwing="error"/>
</aop:aspect>
<!-- 配置切面类1 -->
</aop:config>
</beans>
本文详细介绍如何在Spring框架中实现AOP(面向切面编程),包括创建项目、引入依赖、配置切面类及通知类型等步骤,并针对不同业务场景提供具体的配置示例。
507

被折叠的 条评论
为什么被折叠?



