文章目录
前言业务类基于xml配置AspectJapplication.xml切面类
基于注解配置AspectJ测试
前言
1、 什么是aop? 2、需要的jar包
业务类
一个简单的业务类
package com
;
import org
.springframework
.stereotype
.Repository
;
@Repository("userDao1")
public class UserDaoImpl implements UserDao{
public void say() {
System
.out
.println("dao");
}
@Override
public void addUser() {
System
.out
.println("添加用户");
}
@Override
public void delUser() {
System
.out
.println("删除用户");
}
}
基于xml配置AspectJ
application.xml
<?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:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">
<bean id="userDao" class="com.UserDaoImpl"></bean>
<bean id="myAspect" class="com.MyAspect" />
<aop:config>
<aop:aspect ref="myAspect">
<aop:pointcut expression="execution(* com.*.*(..))"
id="myPointCut" />
<aop:before method="myBefore" pointcut-ref="myPointCut" />
<aop:after-returning method="myAfterReturning"
pointcut-ref="myPointCut" returning="returnVal" />
<aop:around method="myAround" pointcut-ref="myPointCut" />
<aop:after-throwing method="myAfterThrowing"
pointcut-ref="myPointCut" throwing="e" />
<aop:after method="myAfter" pointcut-ref="myPointCut" />
</aop:aspect>
</aop:config>
</beans>
切面类
package com
;
import org
.aspectj
.lang
.JoinPoint
;
import org
.aspectj
.lang
.ProceedingJoinPoint
;
import org
.aspectj
.lang
.annotation
.*
;
import org
.springframework
.stereotype
.Component
;
public class MyAspect {
public void myBefore(JoinPoint joinPoint
) {
System
.out
.print("前置通知 :模拟执行权限检查...,");
System
.out
.print("目标类是:"+joinPoint
.getTarget() );
System
.out
.println(",被织入增强处理的目标方法为:"
+joinPoint
.getSignature().getName());
}
public void myAfterReturning(JoinPoint joinPoint
) {
System
.out
.print("后置通知:模拟记录日志...," );
System
.out
.println("被织入增强处理的目标方法为:"
+ joinPoint
.getSignature().getName());
}
public Object
myAround(ProceedingJoinPoint proceedingJoinPoint
)
throws Throwable
{
System
.out
.println("环绕开始:执行目标方法之前,模拟开启事务...");
Object obj
= proceedingJoinPoint
.proceed();
System
.out
.println("环绕结束:执行目标方法之后,模拟关闭事务...");
return obj
;
}
public void myAfterThrowing(JoinPoint joinPoint
, Throwable e
) {
System
.out
.println("异常通知:" + "出错了" + e
.getMessage());
}
public void myAfter() {
System
.out
.println("最终通知:模拟方法结束后的释放资源...");
}
}
基于注解配置AspectJ
package com
;
import org
.aspectj
.lang
.JoinPoint
;
import org
.aspectj
.lang
.ProceedingJoinPoint
;
import org
.aspectj
.lang
.annotation
.*
;
import org
.springframework
.stereotype
.Component
;
@Aspect
@Component
public class MyAspect {
@Pointcut("execution(* com.*.*(..))")
private void myPointCut(){}
@Before("myPointCut()")
public void myBefore(JoinPoint joinPoint
) {
System
.out
.print("前置通知 :模拟执行权限检查...,");
System
.out
.print("目标类是:"+joinPoint
.getTarget() );
System
.out
.println(",被织入增强处理的目标方法为:"
+joinPoint
.getSignature().getName());
}
@AfterReturning(value
="myPointCut()")
public void myAfterReturning(JoinPoint joinPoint
) {
System
.out
.print("后置通知:模拟记录日志...," );
System
.out
.println("被织入增强处理的目标方法为:"
+ joinPoint
.getSignature().getName());
}
@Around("myPointCut()")
public Object
myAround(ProceedingJoinPoint proceedingJoinPoint
)
throws Throwable
{
System
.out
.println("环绕开始:执行目标方法之前,模拟开启事务...");
Object obj
= proceedingJoinPoint
.proceed();
System
.out
.println("环绕结束:执行目标方法之后,模拟关闭事务...");
return obj
;
}
@AfterThrowing(value
="myPointCut()",throwing
="e")
public void myAfterThrowing(JoinPoint joinPoint
, Throwable e
) {
System
.out
.println("异常通知:" + "出错了" + e
.getMessage());
}
@After("myPointCut()")
public void myAfter() {
System
.out
.println("最终通知:模拟方法结束后的释放资源...");
}
}
<?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:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">
<bean id="userDao" class="com.UserDaoImpl"></bean>
<context:component-scan base-package="com" />
<aop:aspectj-autoproxy />
</beans>
测试
package com
;
import org
.springframework
.context
.ApplicationContext
;
import org
.springframework
.context
.support
.ClassPathXmlApplicationContext
;
public class Test {
public static void main(String
[] args
) {
ApplicationContext ac
= new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao
= (UserDao
) ac
.getBean("userDao");
userDao
.addUser();
}
}