Spring AOP四种实现方式
1. 经典的基于代理的AOP
1. 创建通知:定义一个接口
public interface Sleepable{
void sleep();
}
然后写一个Human类,他实现了这个接口
public Human implements Sleepable{
public void sleep(){
System.out.println("睡觉中...!");
}
}
2.编写一个SleepHelper类,它里面包含了睡觉的辅助工作,用AOP术语来说它就应该是通知
public class SleepHelper implements MethodBeforeAdvice,AfterReturningAdvice {
public void before(Method method, Object[] arguments, Object target)
throws Throwable {
System.out.println("睡觉前");
}
public void afterReturning(Object rturnValue, Method method, Object[] arguments,
Object target) throws Throwable {
System.out.println("睡觉后");
}
}
然后在spring配置文件中进行配置:
<!-- 被代理目标对象 -->
<bean></bean>
<bean></bean>
//定义切点的常用的两种方式:1)使用正则表达式 2)使用AspectJ表达式,
//这里用正则表达式
<!-- 顾问 -->
<bean>
<property ref="BeforAdvice"></property>
<property value=".*l.*g.*"></property>
</bean>
<!-- 代理对象 -->
// ProxyFactoryBean是一个代理,我们可以把它转换为
//proxyInterfaces中指定的实现该interface的代理对象
<bean>
<property ref="Human"></property>
<property value="BeforAdvisor"></property>
</bean>
代理类
public class StuTest {
public static void main(String[] args) {
//通过ClassPathXmlApplicationContext实例化Spring的上下文
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
//通过ApplicationContext的getBean()方法,根据id来获取Bean的实例
Sleepable s=(Sleepable)context.getBean("Human");
s.sleep();
}
}
3、使用AspectJ的注解
用@Aspect的注解来标识切面
@Aspect//该类为切面
public class MyAspect {
@Before(value="execution(public * *(..))")
public void mybefore(){
System.out.println("前置增强");
}
//后置增强
@AfterReturning(value="execution(public * *(..))")
public void myafterReturning(){
System.out.println("后置增强");
}
//异常增强
@AfterThrowing(value="execution(public * *(..))")
public void myafterThrowing(){
System.out.println("异常增强");
}
//环绕增强
@Around(value="execution(public * *(..))")
public void myAround(ProceedingJoinPoint jp){
System.out.println("环绕前增强");
try {
jp.proceed();
} catch (Throwable e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("环绕后增强");
}
//最终增强
@After(value="execution(public * *(..))")
public void myafterLogger(){
System.out.println("最终增强");
}
}
Spring配置文件:
<!-- 目标对象 -->
<bean></bean>
<!-- 切面: -->
<bean></bean>
<aop:aspectj-autoproxy/>
测试类