1.AspectJ是什么?
AspectJ是一个基于Java语言的AOP框架,Spring2.0开始,Spring AOP引入对AspectJ的支持,AspectJ扩展了Java语言,提供了一个专门的编译器,在编译时提供横向代码的织入。
AspectJ是一个面向切面的框架,它扩展了Java语言,定义了AOP 语法,能够在编译期提供代码的织入
@AspectJ是AspectJ 5新增的功能,使用JDK 5.0 注解技术和正规的AspectJ切点表达式语言描述切面
Spring通过集成AspectJ实现了以注解的方式定义增强类,大大减少了配置文件中的工作量
使用@AspectJ,首先要保证所用的JDK 是5.0或以上版本
将Spring的asm 模块添加到类路径中,以处理@AspectJ中所描述的方法参数名
2.使用AspectJ注解增强
定义增强类 实体类加@Aspect就变为增强类
注解一共有五种:
1)@Before 前置增强
2)@AfterReturning 后置增强
3)@Around 环绕增强
4)@AfterThrowing 异常增强
5)@After 最终增强 不管怎么样 都会执行一次
@Aspect
public class aspectAdvice {
/* //前置增强
@Before("execution(* DemoAspect.*.doSome(..))")
public void myBefore(){
System.out.println("===before===");
}
//后置增强
@AfterReturning("execution(* DemoAspect.*.doGet(..))")
public void myAfter(){
System.out.println("===end===");
}*/
//环绕增强
@Around("execution(* DemoAspect.*.sayhi(..))")
public void myArpund(ProceedingJoinPoint point) throws Throwable {
System.out.println("我在上边");
point.proceed();
System.out.println("我在下边");
}
//异常增强
@AfterThrowing("execution(* DemoAspect.*.doSome(..))")
public void MyThrowing(){
System.out.println("异常出现了!");
}
//最终增强
@After("execution(* DemoAspect.*.Ends(..))")
public void MyEnd(){
System.out.println("我是最终增强");
}
}
配置aspet自动代理: xml文件中加入aop节点
<!--目标类型-->
<bean id="service" class="DemoAspect.SomeBeforeImpl"></bean>
<!--增强通知-->
<bean id="beforeadvice" class="DemoAspect.aspectAdvice"></bean>
<!--aspectJ自动代理-->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
书写测试类:
//AspectJ注解 前置 后置 环绕 异常 最终 增强
@Test
public void Test03(){
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContextdayaspect.xml") ;
DemoAspect.SomeBefore service = (DemoAspect.SomeBefore)context.getBean("service");
service.Ends();
}
3.AspectJ使用XML
步骤:
1)定义一个普通类,类可以不用实现任何接口
2)书写增强的方法
//AspectJ注解 前置 后置 环绕 异常 最终 增强
@Test
public void Test03(){
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContextdayaspect.xml") ;
DemoAspect.SomeBefore service = (DemoAspect.SomeBefore)context.getBean("service");
service.Ends();
}
3)配置XML文件
<!--目标类型-->
<bean id="service" class="DamoAspectXml.SomeBeforeImpl"></bean>
<!--增强通知-->
<bean id="beforeadvice" class="DamoAspectXml.AspectAdvice"></bean>
<!--aspect xml 版本-->
<aop:config>
<aop:pointcut id="mypoint" expression="execution(* DamoAspectXml.*.*(..))"></aop:pointcut>
<aop:aspect ref="beforeadvice">
<aop:before method="myBefore" pointcut-ref="mypoint"></aop:before>
<!--<aop:after-returning method="afterReturing" pointcut-ref="mypoint"></aop:after-returning>-->
</aop:aspect>
</aop:config>
4)测试类代码:
//aspectJ xml版本
@Test
public void Test04(){
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContextdayaspectxml.xml") ;
DamoAspectXml.SomeBefore service = (DamoAspectXml.SomeBefore)context.getBean("service");
service.doGet();
service.doSome();
}