配置文件或者配置类
@Configuration
@ComponentScan(basePackages ={"day506AOP"})
@EnableAspectJAutoProxy(proxyTargetClass =true)
public class CofigAop {
}
<?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:context="http://www.springframework.org/schema/context"
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/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<!--开启注解扫描-->
<context:component-scan base-package="day506AOP"></context:component-scan>
<!--开启aspect生成代理对象-->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans>
实体类
@Component
public class Stu {
public void add(){
System.out.println("add....");
}
}
stuProxy
@Component
@Aspect
@Order(2)
public class StuProxy {
//相同切入点抽取
@Pointcut(value ="execution(* day506AOP.anno.Stu.add(..))")
public void pointCut(){
}
//公共切入点使用
@Before(value = "pointCut()")
public void before(){
System.out.println("before....");
}
//在方法执行之后执行 不管有没有异常都执行也可以叫做最终通知
@After(value = "execution(* day506AOP.anno.Stu.add(..))")
public void after(){
System.out.println("after....");
}
//在方法返回结果之后执行 晚于after 抛异常就不执行
@AfterReturning(value = "execution(* day506AOP.anno.Stu.add(..))")
public void afterReturning(){
System.out.println("afterReturning....");
}
//异常通知也是在after之后执行
@AfterThrowing(value = "execution(* day506AOP.anno.Stu.add(..))")
public void afterThrowing(){
System.out.println("afterThrowing....");
}
//环绕通知抛异常后不执行环绕之后但是执行环绕之前
@Around(value = "execution(* day506AOP.anno.Stu.add(..))")
public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{
System.out.println("环绕之前....");
proceedingJoinPoint.proceed();
System.out.println("环绕之后....");
}
}
stuProxy2
@Component
@Aspect
@Order(1)
public class StuProxy2 {
@Before(value = "execution(* day506AOP.anno.Stu.add(..))")
public void before(){
System.out.println("before 先执行......");
}
@After(value = "execution(* day506AOP.anno.Stu.add(..))")
public void after(){
System.out.println("after 后执行......");
}
}
测试类:
public class AOPIntro {
@Test
public void testAnno(){
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("506bean8.xml");
Stu stu = context.getBean("stu", Stu.class);
stu.add();
}
//完全注解
@Test
public void testCompleteAnno(){
ApplicationContext context=new AnnotationConfigApplicationContext(CofigAop.class);
Stu stu = context.getBean("stu", Stu.class);
stu.add();
}
}
测试结果:
before 先执行......
环绕之前....
before....
add....
环绕之后....
after....
afterReturning....
after 后执行......
Process finished with exit code 0