Spring中的AOP

本文总阅读量
本文最后更新于2 分钟前,文中所描述的信息可能已发生改变。

使用前提:Spring的AOP是基于JDK动态代理和CGlib代理实现的,所以目标对象必须要有父类或实现了接口才能被代理。

导入相关jar包 jar包

基于纯配置文件的方式

要使用配置文件的方式需要在applicationContext.xml文件中进行配置

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  
">
<!--只需要将目标类与切面类加入容器中就行,也可使用注解的方式-->
//切面类
<bean id="aspectAop" class="com.aop.AspectAop"/>  
//目标类
<bean id="targetAop" class="com.sercie.TargetAop"/>
//配置aop
<aop:config>  
  <!--配置切点,定义切点表达式-->
  <aop:pointcut id="pointcut1" expression="execution(* com.ecjtu.aop.TargetAop.*(..))"/>
  <!--定义切面-->
  <aop:aspect id="aspect1" ref="aspectAop">  
    <!--最终通知,无论目标方法是否有异常都会执行-->  
    <aop:after method="log" pointcut-ref="pointcut1" />  
    <!--前置通知-->  
    <aop:before method="init" pointcut-ref="pointcut1" />  
    <!--异常通知,目标方法抛出异常时执行-->
    <aop:after-throwing method="throwing" pointcut-ref="pointcut1"/>  
    <!--后置通知,目标方法抛出异常时不执行-->
    <aop:after-returning method="returning" pointcut-ref="pointcut1"/>  
    <!--环绕通知,方法中需要参数-->
    <aop:around method="around" pointcut-ref="pointcut1"/>  
  </aop:aspect>  
</aop:config>
</beans>

基于纯注解的方式

切面类与目标类都需要在Spring容器中 切面类

java
package com.aop;

@Component   
@Aspect  
public class AspectAop {  
	@Pointcut("execution(* com.ecjtu.aop.*.*(..))")  
	public void pointcut(){};  
	@After("pointcut()")  
	public void log(){  
	System.out.println("最终通知");  
	}  
	@Before("pointcut()")  
	public void init(){  
	System.out.println("前置通知");  
	}  
	@AfterThrowing("pointcut()")  
	public void throwing(){  
	System.out.println("异常通知");  
	}  
	@AfterReturning("pointcut()")  
	public void returning(){  
	System.out.println("后置通知");  
	}  
	@Around("pointcut()")  
	public Object around(ProceedingJoinPoint joinPoint) throws Throwable {  
	System.out.println("环绕通知,前置");  
	Object proceed = joinPoint.proceed(joinPoint.getArgs());  
	System.out.println("环绕通知,后置");  
	return proceed;  
	}  
}

配置类

java
@Configuration //若被导入主配置类中则可加可不加这个注解  
@ComponentScan(basePackages = {"com.aop"})//扫描目标类与切面类所在的包 
@EnableAspectJAutoProxy//开启自动代理,即注解的方式  
public class MyConfig {  
}
测试
Hello, Valaxy!
Valaxy v0.18.5 驱动 | 主题 - Yun v0.18.5
本站总访问量
本站访客数 人次
本站已运行0 天0 小时0 分0 秒后缀