SpringAOP利用xml配置实现

SpringTest与Junit的完美的集合

优点:可以不用每次测试的时候进行创建spring的容器,而且进行持久层的测试的完毕的时候可以回滚已经测试的数据,不会对数据库造成影响。还有很多的优点,可以自己慢慢研究。
导入的jar包:

<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.1.3.RELEASE</version>
            <scope>test</scope>
</dependency>
<dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
</dependency>

在测试类中进行注解的配置

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

import javax.annotation.Resource;

/**
 * @author kiosk
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:springAOP.xml")
public class TestUserDao {
    @Resource(type = UserDao.class)
    private UserDao userDao;

    @Test
    public void test1() {
        userDao.delete();
        userDao.insert();
    }
}

SprinAOP利用xml文件实现

接口

public interface UserDao {
    void insert();
    void update();
    void delete();
    void select();
}

实现类

public class UserDaoImpl implements UserDao {
    public void insert() {
        System.out.println("插入");
    }

    public void update() {
        System.out.println("修改");
    }

    public void delete() {
        System.out.println("删除");
    }

    public void select() {
        System.out.println("查询");
    }
}

切面类:

public class MyAspectXML {
    public void checkPri(){
        System.out.println("权限校验=======");
    }
}

xml文件配置

 <!--配置目标类-->
    <bean id="UserDaoImpl" class="com.aop.demo.UserDaoImpl"/>
    <!--配置代理类-->
    <bean id="MyAspectXML" class="com.aop.demo.MyAspectXML"/>
    <!--AOP的配置-->
    <aop:config>
        <!--配置表达式 * 代表的是任意的返回值,..代表的是任意的参数-->
        <aop:pointcut id="pointCut1" expression="execution(* com.aop.demo.UserDaoImpl.insert(..))"/>
        <!--配置切面-->
        <aop:aspect id="aspect" ref="MyAspectXML">
            <!--配置前置的通知-->
            <aop:before method="checkPri" pointcut-ref="pointCut1"/>
        </aop:aspect>
    </aop:config>

Spring的通知类型

(1)前置通知(目标方法执行之前)
(2)后置通知(目标方法执行之后)

 /**
     * 参数为切点的返回值
     * @param result
     */
    public void writeLog(Object result){
        System.out.println("日志记录完成");
    }
<aop:after-returning method="writeLog" pointcut-ref="pointCut2" returning="result"/>

(3)环绕通知(目标方法的前后)
(4)异常抛出通知(程序出现异常的时候执行的操作,例如:在异常的时候进行回滚)
(5)最终通知(无论代码是否有异常,都会执行)
切面类

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;

public class MyAspectXML {
    public void checkPri(JoinPoint joinpoint){
        System.out.println("权限校验=======" + joinpoint);
    }

    /**
     * 参数为切点的返回值
     * @param result
     */
    public void writeLog(Object result){
        System.out.println("日志记录完成");
    }
    public Object monitor(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("环绕前");
        Object object = joinPoint.proceed();
        System.out.println("环绕后");
        return object;
    }
    public void afterThrowing(Throwable exception){
        System.out.println("异常抛出通知" + exception.getMessage() );
    }

    /**
     * 相当于是finally
     */
    public void after(){
        System.out.println("最终通知");
    }
}

xml的配置的文件

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
 http://www.springframework.org/schema/beans/spring-beans.xsd
 http://www.springframework.org/schema/context
 http://www.springframework.org/schema/context/spring-context.xsd
 http://www.springframework.org/schema/aop
 http://www.springframework.org/schema/aop/spring-aop.xsd
 http://www.springframework.org/schema/tx
 http://www.springframework.org/schema/tx/spring-tx.xsd">
    <!--配置目标类-->
    <bean id="UserDaoImpl" class="com.westos.demo.UserDaoImpl"/>
    <!--配置代理类-->
    <bean id="MyAspectXML" class="com.westos.demo.MyAspectXML"/>
    <!--AOP的配置-->
    <aop:config>
        <!--配置表达式 * 代表的是任意的返回值,..代表的是任意的参数-->
        <aop:pointcut id="pointCut1" expression="execution(* com.westos.demo.UserDaoImpl.insert(..))"/>
        <aop:pointcut id="pointCut2" expression="execution(* com.westos.demo.UserDaoImpl.delete(..))"/>
        <aop:pointcut id="pointCut3" expression="execution(* com.westos.demo.UserDaoImpl.update(..))"/>
        <aop:pointcut id="pointCut4" expression="execution(* com.westos.demo.UserDaoImpl.select(..))"/>
        <!--配置切面-->
        <aop:aspect  ref="MyAspectXML">
            <!--配置前置的通知-->
            <aop:before method="checkPri" pointcut-ref="pointCut1"/>
            <!--配置后置通知-->
            <aop:after-returning method="writeLog" pointcut-ref="pointCut2" returning="result"/>
            <!--配置环绕通知-->
            <aop:around method="monitor" pointcut-ref="pointCut3" />
            <!--配置异常抛出通知-->
            <aop:after-throwing method="afterThrowing" pointcut-ref="pointCut4" throwing="exception"/>
            <!--配置最终通知-->
            <aop:after method="after" pointcut-ref="pointCut4"/>
        </aop:aspect>
    </aop:config>
</beans>

猜你喜欢

转载自blog.csdn.net/weixin_40843624/article/details/86764009