使用Aspectj来开发AOP的一个小例子
① 基于xml方式实现:
- 切面类
public class MyAspect {
public void myBefore(JoinPoint joinPoint){
System.out.println("前置通知 "+joinPoint.getSignature().getName());
}
public void myAfterRetruning(JoinPoint joinPoint){
System.out.println("后置通知"+ joinPoint.getSignature().getName());
}
}
- 接口类
public interface UserService {
public void addUser();
public String updateUser();
public void deleteUser();
}
- applicationContext.xml
<!-- 1. 创建实体类 -->
<bean id="userServiceId" class="com.itt.c_aspectj_xml.UserServiceImpl"></bean>
<!-- 2. 创建切面类-->
<bean id="aspectId" class="com.itt.c_aspectj_xml.MyAspect"></bean>
<!-- 3. 创建代理类-->
<!--
<aop:aspect>将切面类声明“切面”, 获得通知
<aop:pointcut> 切入点,expression:为切入点表达式
<aop:before method="" pointcut-ref="">
前置通知,method为通知的方法,pointcut-ref为切入点的引用
-->
<aop:config>
<aop:aspect ref="aspectId">
<aop:pointcut id="myaspectId" expression="execution(* com.itt.c_aspectj_xml.UserServiceImpl.*(..))"/>
<aop:before method="myBefore" pointcut-ref="myaspectId"></aop:before>
<aop:after method="myAfterRetruning" pointcut-ref="myaspectId"></aop:after>
</aop:aspect>
</aop:config>
- 运行结果…
②基于注解方式:
- 切面类
//切面类
@Component
@Aspect
public class MyAspect {
// 声明公共切入点
@Pointcut("execution(* com.itt.c_aspectj_xml.UserServiceImpl.*(..))")
public void myPoint(){
}
@Before(value = "myPoint()")
public void myBefore(JoinPoint joinPoint){
System.out.println("前置通知 "+joinPoint.getSignature().getName());
}
@After(value = "myPoint()")
public void myAfterRetruning(JoinPoint joinPoint){
System.out.println("后置通知"+ joinPoint.getSignature().getName());
}
}
- 实现类
@Service("userServiceId")//指定生成的Bean的id
public class UserServiceImpl implements UserService{
@Override
public void addUser() {
System.out.println("c_aspectj_xml addUser");
}
@Override
public String updateUser() {
System.out.println("c_aspectj_xml updateUser");
return "String";
}
@Override
public void deleteUser() {
System.out.println("c_aspectj_xml deleteUser");
}
}
- applicationContext.xml
<!--扫描所有的注解-->
<context:component-scan base-package="com.itt.c_aspectj_xml"></context:component-scan>
<!--确定aop注解生效-->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
- 测试一下