欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

AspectJ实现AOP——基于XML的声明式AspectJ

程序员文章站 2022-07-12 14:10:29
...

基于XML的声明式AspectJ

基于XML的声明式AspectJ是指通过XML文件来定义切面,切入点及通知,所有的切面、切入点和通知都必须定义在< aop:config>元素内

AspectJ实现AOP——基于XML的声明式AspectJ

实现过程

  • 创建切面类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("苏菲的世界");
    }
}
相关标签: AspectJ开发