定义切面类
```
@Component
@Aspect
public class LogAspect {
/* @Pointcut("execution(* com.neuedu.aop.business.*.*(..))")
public void anyMethod()
{
}
@Before("execution(* com.neuedu.aop.business.*.*(..))")
public void before()
{
System.out.println("方法开始了");
}
@After("execution(* com.neuedu.aop.business.*.*(..))")
public void after()
{
System.out.println("方法结束了");
}
@AfterThrowing(pointcut="anyMethod()",throwing="ex")
public void exception(Exception ex)
{
System.out.println("方法抛出异常了");
//记录在日志文件。
ex.printStackTrace();
}
@AfterReturning(pointcut="anyMethod()",returning="str")
public void afterreturnning(String str)
{
System.out.println(str);
System.out.println("方法正常结束");
}*/
@Around("execution(* com.neuedu.aop.business.*.*(..))")
public void round(ProceedingJoinPoint jp)
{
//before通知
//1. 获得当前时间
Date d1 = new Date();
System.out.println(jp.getSignature().getName()+"开始了");
try
{
jp.proceed();//执行目标方法
}
catch(Throwable e)
{
//记日志 after throwing
System.out.println(e.getMessage());
}
//after
System.out.println(jp.getSignature().getName()+"结束了");
//2. 获得当前时间
Date d2 = new Date();
System.out.println("方法运行,耗时:"+ (d2.getTime() - d1.getTime()));
}
}
```
applicationContext.xml
```
<!-- 启用注解方式的aop -->
<!-- 默认值:proxy-target-class="false" 使用jdk的代理模式, 特殊注意:如果没有实现接口,自动调用cglib的方式-->
<!-- proxy-target-class="true" 使用cglib增强模式,有没有接口都支持 -->
<aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>
<context:component-scan base-package="com.neuedu.aop"></context:component-scan>
```
测试类的实现:
```
@Test
public void testAOP1()
{
//启动ioc容器
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
//
TestAspect testAspect = ctx.getBean(TestAspect.class);
testAspect.test();
//spring aop的实现基于动态代理的设计模式
//1。被代理类需要实现一个接口(TestAspect implements ITestAspect)-> JDK自带功能(调用相应的类,方法,就可以自己写这种动态代理)
//2.被代理类不需要实现接口,aop生成目标类的子类。-》 JDK不支持,第三方工具cglib支持(调用相应的类,方法,就可以自己写这种动态代理)。
//3. aspectj静态织入,直接修改目标类的class文件,更灵活
//spring引入aspectj,目的是使用aspectj注解语法(aspect,before),内部机制仍然是动态代理, 即第一种和第二种。
}
```