Spring_day02_9(Spring中AOP的入门)

AOP入门
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.xsd
3.创建切面类
/*
 * 切面类
 * 存放着 前后通知的方法
 */
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>


猜你喜欢

转载自blog.csdn.net/strawberry_uncle/article/details/80645940