AspectJ实现AOP——基于XML的声明式AspectJ
程序员文章站
2022-07-12 14:10:29
...
文章目录
基于XML的声明式AspectJ
基于XML的声明式AspectJ是指通过XML文件来定义切面,切入点及通知,所有的切面、切入点和通知都必须定义在< aop:config>元素内
实现过程
- 创建切面类ServiceProxy,在这里面编写通知
public class ServiceProxy {
//JoinPoint封装了目标类中方法的特性(方法名,参数等。)
public void toStrong(JoinPoint jp /*,Throwable exp*/){
//目标类中的切点的参数
String methodname=jp.getSignature().getName();
System.out.println("目标方法名:"+methodname);
Object[] args = jp.getArgs();
for(Object o:args) {
System.out.println("目标方法的参数:"+o);
}
System.out.println("以上是增强的内容。。。");
//System.out.println("异常通知:" + exp);
}
//环绕通知方法
public void toStrong1(ProceedingJoinPoint pjp){
//目标类的中切点的参数
String methodname=pjp.getSignature().getName();//
System.out.println("目标方法名:"+methodname);
Object[] args = pjp.getArgs();
for(Object o:args) {
System.out.println("目标方法的参数:"+o);
}
System.out.println("开启事务");
try {
pjp.proceed();//调用目标方法
} catch (Throwable e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("提交事务");
}
}
- 目标类UserServiceImpl
public class UserServiceImpl implements UserService {
@Override
public void save(String name) {
//int i=1/0;
System.out.println("添加用户:" + name);
}
@Override
public String getById(int id) {
System.out.println("查询用户,用户id为:" + id);
return "xiaoming";
}
}
- 配置切面,切入点及通知 配置目标类、切面类
<!--实例化目标类-->
<bean id="userServiceImpl" class="com.yx1.service2.UserServiceImpl"></bean>
<!--实例切面类-->
<bean id="serviceProxy" class="com.yx1.service2.ServiceProxy"></bean>
<!--springAOP完成织入-->
<aop:config>
<!--配置切面-->
<aop:aspect ref="serviceProxy">
<!-- expression:设置切点 访问修饰符 返回值 方法名(参数) -->
<!--访问修饰符:省略不写(任意访问修饰符)也可以指定为某一个访问修饰符public
返回值:*任意的返回值。
方法名:包名..*.*(*可以指定任意的包名和类名,..任意一级包)
参数:..任意的参数-->
<!--配置切入点 通知最后增强的方法-->
<aop:pointcut id="pc" expression="execution(* com.yx1.service2.*.*(..))"/>
<!-- 前置通知:增强的方法是在目标方法之前执行 -->
<aop:before method="toStrong" pointcut-ref="pc"/>
<!--后置通知:增强的方法是在目标方法之后执行,当目标方法遇到异常时,通知不会执行 -->
<!--<aop:after-returning method="toStrong" pointcut-ref="pc"/>-->
<!--最终通知:增强的方法是在目标方法之后执行,不论目标方法中是否有异常,通知都会执行 -->
<!--<aop:after method="toStrong" pointcut-ref="pc"/>-->
<!-- 异常通知:在目标方法遇到异常时才会执行增强的内容 -->
<!--<aop:after-throwing method="toStrong" pointcut-ref="pc" />--> <!--throwing="exp"-->
<!-- 环绕通知:可以定义增强的内容在目标方法之前执行或者之后或者前后都执行 -->
<!--<aop:around method="toStrong1" pointcut-ref="pc" />-->
</aop:aspect>
</aop:config>
- 测试
public class ProxyTest {
public static void main(String[] args) {
ApplicationContext app = new ClassPathXmlApplicationContext("com/yx1/service3/bean.xml");
UserService us = app.getBean("userServiceImpl", UserService.class);
us.save("苏菲的世界");
}
}