AOP配置开发入门案例

Posted xufaye

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AOP配置开发入门案例相关的知识,希望对你有一定的参考价值。

该AOP开发入门案例采用XML文件方式配置开发(非注解方式)共包含一个xml文件和4个Java类,创建好web工程后引入相应jar包(文末会给出),建好包(若自定义包名注意更改类中的包名),将xml文件和Java类复制到包中即可通过测试类进行测试。

Spring的applicationContext.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" 
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop 
        http://www.springframework.org/schema/aop/spring-aop.xsd">
    
    <!-- 配置目标对象:被增强的对象 -->
    <bean id="customerDao" class="cn.muc.spring.demo3.CustomerDaoImpl"></bean>
    
    <!-- 将切面类交给Spring管理 -->
    <bean id="myAspect" class="cn.muc.spring.demo3.MyAspectXML"></bean>
    
    <!-- 通过AOP配置完成对目标类产生代理 -->
    <aop:config>
        <!-- 配置表达式:哪些类的哪些方法需要进行增强 -->
        <aop:pointcut expression="execution(* cn.muc.spring.demo3.CustomerDaoImpl.save(..))" id="pointcut1"/>
        <aop:pointcut expression="execution(* cn.muc.spring.demo3.CustomerDaoImpl.delete(..))" id="pointcut2"/>
        <aop:pointcut expression="execution(* cn.muc.spring.demo3.CustomerDaoImpl.update(..))" id="pointcut3"/>
        <aop:pointcut expression="execution(* cn.muc.spring.demo3.CustomerDaoImpl.find(..))" id="pointcut4"/>
        <!-- 配置切面(通知) -->
        <aop:aspect ref="myAspect">
            <!-- 前置通知 -->
            <aop:before method="checkPri" pointcut-ref="pointcut1"/>
            <!-- 后置通知,returning中自定义的字符串表示切入点(原方法)返回值的名字-->
            <aop:after-returning method="writeLog" pointcut-ref="pointcut2" returning="result"/>
            <!-- 环绕通知 -->
            <aop:around method="watch" pointcut-ref="pointcut3"/>
            <!-- 异常抛出通知 -->
            <aop:after-throwing method="afterTrowing" pointcut-ref="pointcut4" throwing="ex"/>
            <!-- 最终通知 -->
            <aop:after method="after" pointcut-ref="pointcut4"/>
        </aop:aspect>
    </aop:config>
</beans>

Dao接口代码:

package cn.muc.spring.demo3;

public interface CustomerDao {

    public void save();
    public String delete();
    public void update();
    public void find();
}

 

Dao实现类代码:

package cn.muc.spring.demo3;

public class CustomerDaoImpl implements CustomerDao {

    @Override
    public void save() {
        System.out.println("保存方法被调用了。。。");

    }

    @Override
    public String delete() {
        System.out.println("删除方法被调用了。。。");
        return "后置通知获得方法返回值";

    }

    @Override
    public void update() {
        System.out.println("更新方法被调用了。。。");

    }

    @Override
    public void find() {
        System.out.println("查找方法被调用了。。。");
        int a = 1 / 0;

    }

}

切面类代码:

package cn.muc.spring.demo3;

import org.aspectj.lang.ProceedingJoinPoint;

/**
 * 切面类
 * @author xufaye
 *
 */
public class MyAspectXML {

    /**
     * 前置通知
     */
    public void checkPri() {
        System.out.println("权限校验==================");
    }
    
    /**
     * 后置通知:可以获得方法返回值(通过传入对象类型的参数)
     */
    public void writeLog(Object result) {
        System.out.println("日志记录===============" + result);
    }
    /**
     * 环绕通知:比如可以用于性能监控
     * @throws Throwable 
     */
    public Object watch(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("环绕前通知=========");
        Object obj = joinPoint.proceed();
        System.out.println("环绕后通知=========");
        return obj;
    }
    /**
     * 异常抛出通知
     */
    public void afterTrowing(Throwable ex) {
        System.out.println("异常抛出通知=========并获得异常信息:" + ex.getMessage());
    }
    
    /**
     * 最终通知:无论有没有异常都会执行,相当于finally代码块中的内容
     */
    public void after() {
        System.out.println("最终通知===========");
    }
}

测试类代码:

package cn.muc.spring.demo3;

import javax.annotation.Resource;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

/**
 * AOP入门
 * @author xufaye
 *
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class SpringDemo3 {

    @Resource(name="customerDao")
    private CustomerDao customerDao;
    @Test
    public void demo1() {
        customerDao.save();
        customerDao.delete();
        customerDao.update();
        customerDao.find();
        
        
    }
}
Java中AOP开发配置入门案例开发所需引入的jar包

com.springsource.org.aopalliance-1.0.0.jar【AOP联盟】

com.springsource.org.apache.commons.logging-1.1.1.jar【日志包】

com.springsource.org.apache.log4j-1.2.15.jar【日志包】

com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar【aspectj】

spring-aop-4.2.4.RELEASE.jar【spring整合AOP包】

spring-aspects-4.2.4.RELEASE.jar【spring整合aspectj包】

spring-beans-4.2.4.RELEASE.jar【spring基础包】

spring-context-4.2.4.RELEASE.jar【spring基础包】

spring-core-4.2.4.RELEASE.jar【spring基础包】

spring-expression-4.2.4.RELEASE.jar【spring基础包】

spring-test-4.2.4.RELEASE.jar【spring整合Junit包】

 

---------------------
作者:曲水竹莲
来源:CSDN
原文:https://blog.csdn.net/bu529191519/article/details/88046616
版权声明:本文为博主原创文章,转载请附上博文链接!

以上是关于AOP配置开发入门案例的主要内容,如果未能解决你的问题,请参考以下文章

Spring AOP快速入门详解

Spring5框架概述入门案例

Spring:入门AOP案例分析

Spring:入门AOP案例分析

Spring中AOP的初窥和入门小案例

❤️‍Spring从入门到大神--AOP从入门到精通