一.注解AOP
步骤:
引入Jar文件
配置AOP命名空间
创建目标对象类
创建切面
在配置文件中配置切面
创建入口类进行测试
可以这么理解:可以在Student的print方法前后甚至整个过程都横切一个printMethod()方法进去。print()前的叫printBeforeAdvice(),放在返回后的叫printAfterAdvice,方法执行后的叫finallyAdvice,整个过程都有一个拦截器printAroundAdvice(ProceedingJoinPoint pjp, String name)随时捕捉print()执行的name参数,并可以根据name参数是否干掉这个print方法。
待横切类Student类的print(String name)方法:
public class Student {
publi**重点内容**c String print(String name){
System.out.println("print() method:" + name);
return "hello";
}
}
横切类方法:
@Aspect
public class StuInterceptor {
/**
* 打印方法AOP
*/
@Pointcut("execution(* com.jike.spring.chapter09.aop.aspect.Student.print(..))")
// @Pointcut("execution(* com.jike.spring.chapter09.aop.aspect.Student.*(..))")
public void printMethod() {
System.out.println("1");
}
@Before("printMethod()")
public void printBeforeAdvice() {
System.out.println("printBeforeAdvice()!");
}
@AfterReturning(pointcut = "printMethod()", returning = "flag")
public void printAfterAdvice(String flag) {
System.out.println("printAfterAdvice()! " + flag);
}
@After("printMethod()")
public void finallyAdvice() {
System.out.println("finallyAdvice()!");
}
@Around("printMethod() && args(name)")
public Object printAroundAdvice(ProceedingJoinPoint pjp, String name)
throws Throwable {
Object result = null;
if (name.equals("whc"))
pjp.proceed();
else
System.out.println("print()方法以及被拦截...");
return result;
}
}
XML配置:
<aop:aspectj-autoproxy />
<bean id="stuInterceptor" class="com.jike.spring.chapter09.aop.aspect.StuInterceptor"></bean>
<bean id="stu" class="com.jike.spring.chapter09.aop.aspect.Student"></bean>
测试类:
public class Main {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("conf/conf-aspect.xml");
Student stu = (Student)ctx.getBean("stu");
stu.print("hc");
}
}
二.XML AOP
步骤:
引入Jar文件
配置AOP命名空间
创建目标对象类
创建切面
在配置文件中配置
创建入口类进行测试
基于XML的只要把注解删掉,Bean还是原样配置,然后 配置好前前后后要放的切片代码即可
<aop:config>
<aop:aspect id="stuInterceptor" ref="interceptor">
<aop:before
pointcut="execution(* com.jike.spring.chapter09.aop.xml.Student.print(..))"
method="printBeforeAdvice" />
<aop:after-returning
pointcut="execution(* com.jike.spring.chapter09.aop.xml.Student.print(..))"
method="printAfterAdvice" />
<aop:after
pointcut="execution(* com.jike.spring.chapter09.aop.xml.Student.print(..))"
method="finallyAdvice" />
<aop:around
pointcut="execution(* com.jike.spring.chapter09.aop.xml.Student.print(..)) and args(name)"
method="printAroundAdvice" />
</aop:aspect>
</aop:config>