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>