Spring--AOP实例2

该博客主要围绕Java项目展开,涉及配置文件的操作,三层架构内Java文件的设置,在aop包的相关设置,还进行了测试并展示了运行结果,为Java后端开发提供了操作指引。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、配置文件

<?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"
       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
	http://www.springframework.org/schema/aop
	http://www.springframework.org/schema/aop/spring-aop-3.2.xsd">


    <bean id="userDao" class="cn.gwj.dao.UserDaoImpl"/>
    <bean id="userService" class="cn.gwj.service.user.UserServiceImpl">
        <!--        构造注入 给构造方法传入参数 userDao -->
        <constructor-arg type="java.lang.String" index="1" value="zs"/>
        <constructor-arg type="cn.gwj.dao.UserDao" index="0" ref="userDao"/>
    </bean>

    <!--    <bean id="userService" class="cn.gwj.service.user.UserServiceImpl"/>-->
    <bean id="aopLogger" class="cn.gwj.aop.AopLogger"/>

    <!--    配置切面-->
    <aop:config>
    <!--        定义切入点(某方法)  参数类型要传其全路径-->
<!--        <aop:pointcut id="addPo" expression="execution(public String add(java.lang.String))"/>-->
        <aop:pointcut id="addPo" expression="execution(* cn.gwj.service..*.*(..))"/>
        <!--        引用包含增强方法的bean-->
        <aop:aspect ref="aopLogger">
            <!--            定义前置增强   pointcut-ref已经定义的切点方法-->
            <aop:before method="before" pointcut-ref="addPo"/>
            <!--            定义后置增强   pointcut-ref已经定义的切点方法 returning在增强方法里面定义的返回值参数-->
            <aop:after-returning method="after" pointcut-ref="addPo" returning="result"/>
            <!--            定义最终增强-->
            <aop:after method="aft" pointcut-ref="addPo"/>
            <!--            异常-->
            <aop:after-throwing method="exc" pointcut-ref="addPo" throwing="e"/>
            <!--            环绕增强-->
            <aop:around method="around" pointcut-ref="addPo"/>
        </aop:aspect>
    </aop:config>

   <!--    声明切面类-->
    <bean class="cn.gwj.aop.AopLogger"/>

</beans>

二、三层架构内java文件设置

package cn.gwj.dao;
import cn.gwj.entity.User;
import java.util.List;
public class UserDaoImpl implements UserDao{ 
    @Override
    public int add() {
        throw new RuntimeException("数据异常");
    }
}

 

package cn.gwj.service.user;
import cn.gwj.dao.UserDao;
import cn.gwj.dao.UserDaoImpl;
public class UserServiceImpl implements UserService{
    private UserDao userDao;
    private String name;
    public UserServiceImpl() {}
    public UserServiceImpl(UserDao userDao, String name){
        this.userDao=userDao;
        this.name=name;
    }
    public String add(String name){
        System.out.println("add方法");
        UserDaoImpl userDao=new UserDaoImpl();
        userDao.add();
        return "添加了"+name;
    }
}

三、在aop包设置

package cn.gwj.aop;
import cn.gwj.util.MyBatisUtil;
import org.apache.ibatis.session.SqlSession;
import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import java.util.Arrays;

/**
 * 增强类
 */
public class AopLogger {
    private Logger logger=Logger.getLogger(AopLogger.class);
    public void before(JoinPoint jp){
        logger.info("前置增强-执行了"+jp.getTarget()+"的"+jp.getSignature().getName()
                +"的方法,传入了参数"+ Arrays.toString(jp.getArgs()));
    }
    public void after(JoinPoint jp,Object result){
        logger.info("后置增强执行了"+jp.getTarget()+"的"+jp.getSignature().getName()
                +"的方法,返回值"+ result);
    }
    public void aft(JoinPoint jp){
        //SqlSession sqlSession=(SqlSession)jp.getArgs()[0];
        //MyBatisUtil.closeSqlSession(sqlSession);
        logger.info("最终增强-执行了"+jp.getTarget()+"的"+jp.getSignature().getName()
                +"的方法");
    }
    public void exc(JoinPoint jp,RuntimeException e){
        logger.info("异常增强-执行了"+jp.getTarget()+"的"+jp.getSignature().getName()
                +"的方法,异常"+ e);
    }
    public Object around(ProceedingJoinPoint pj) throws Throwable {
        logger.info(
                "前置增强-执行了"+pj.getTarget()+"的"+pj.getSignature().getName()+"方法。方法传参"+Arrays.toString(pj.getArgs())
        );
        try{
            Object result=pj.proceed();
            logger.info(
                    "后置增强-执行了"+pj.getTarget()+"的"+pj.getSignature().getName()
                            +"的方法,返回值"+ result
            );
            return result;
        }catch (Throwable e){
            logger.error("环绕增强"+pj.getSignature().getName()+"方法发生异常。");
            throw e;
        }finally {
            logger.info("环绕增强-"+pj.getSignature().getName()+"方法结束执行。");
        }
    }
}

四、测试

package cn.gwj.dao;

import cn.gwj.entity.User;
import cn.gwj.service.user.UserService;
import cn.gwj.service.user.UserServiceImpl;
import cn.gwj.util.MyBatisUtil;
import javafx.application.Application;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.session.SqlSession;
import org.apache.log4j.Logger;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.ArrayList;
import java.util.List;
/*    
    Created by IntelliJ IDEA.
    Package:cn.gwj.dao
    User:1093499975@qq.com
    Date:2019/7/6 0006
    Time:15:59
*/
public class UserDaoTest {
    @Test
    public void testAop(){
        //通过ClassPathXmlApplicationContext实例化Spring的上下文
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("spring-config.xml");
        //通过ApplicationContext的getBean()方法,根据id来获取bean的实例
        UserService userService=(UserService)applicationContext.getBean("userService");
        userService.add("张三");
    }
}

五、运行结果

"C:\Program Files\Java\jdk1.8.0_201\bin\java.exe" -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:E:\Program Files\JetBrains\IntelliJ IDEA 2019.1.2\lib\idea_rt.jar=60438:E:\Program Files\JetBrains\IntelliJ IDEA 2019.1.2\bin" -Dfile.encoding=UTF-8 -classpath "E:\Program Files\JetBrains\IntelliJ IDEA 2019.1.2\lib\idea_rt.jar;E:\Program Files\JetBrains\IntelliJ IDEA 2019.1.2\plugins\junit\lib\junit-rt.jar;E:\Program Files\JetBrains\IntelliJ IDEA 2019.1.2\plugins\junit\lib\junit5-rt.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\rt.jar;E:\ideaWork\bill\target\test-classes;E:\ideaWork\bill\target\classes;E:\java\apache-maven-3.6.1\m2\maven-repository\junit\junit\4.11\junit-4.11.jar;E:\java\apache-maven-3.6.1\m2\maven-repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;E:\java\apache-maven-3.6.1\m2\maven-repository\mysql\mysql-connector-java\8.0.16\mysql-connector-java-8.0.16.jar;E:\java\apache-maven-3.6.1\m2\maven-repository\com\google\protobuf\protobuf-java\3.6.1\protobuf-java-3.6.1.jar;E:\java\apache-maven-3.6.1\m2\maven-repository\org\mybatis\mybatis\3.4.1\mybatis-3.4.1.jar;E:\java\apache-maven-3.6.1\m2\maven-repository\log4j\log4j\1.2.17\log4j-1.2.17.jar;E:\java\apache-maven-3.6.1\m2\maven-repository\org\slf4j\slf4j-api\1.7.18\slf4j-api-1.7.18.jar;E:\java\apache-maven-3.6.1\m2\maven-repository\org\slf4j\slf4j-log4j12\1.7.18\slf4j-log4j12-1.7.18.jar;E:\java\apache-maven-3.6.1\m2\maven-repository\com\alibaba\fastjson\1.2.58\fastjson-1.2.58.jar;E:\java\apache-maven-3.6.1\m2\maven-repository\javax\servlet\jstl\1.2\jstl-1.2.jar;E:\java\apache-maven-3.6.1\m2\maven-repository\javax\javaee-api\8.0\javaee-api-8.0.jar;E:\java\apache-maven-3.6.1\m2\maven-repository\com\sun\mail\javax.mail\1.6.0\javax.mail-1.6.0.jar;E:\java\apache-maven-3.6.1\m2\maven-repository\javax\activation\activation\1.1\activation-1.1.jar;E:\java\apache-maven-3.6.1\m2\maven-repository\org\apache\taglibs\taglibs-standard-impl\1.2.5\taglibs-standard-impl-1.2.5.jar;E:\java\apache-maven-3.6.1\m2\maven-repository\org\springframework\spring-core\5.1.8.RELEASE\spring-core-5.1.8.RELEASE.jar;E:\java\apache-maven-3.6.1\m2\maven-repository\org\springframework\spring-jcl\5.1.8.RELEASE\spring-jcl-5.1.8.RELEASE.jar;E:\java\apache-maven-3.6.1\m2\maven-repository\org\springframework\spring-beans\5.1.8.RELEASE\spring-beans-5.1.8.RELEASE.jar;E:\java\apache-maven-3.6.1\m2\maven-repository\org\springframework\spring-tx\5.1.8.RELEASE\spring-tx-5.1.8.RELEASE.jar;E:\java\apache-maven-3.6.1\m2\maven-repository\org\springframework\spring-jdbc\5.1.8.RELEASE\spring-jdbc-5.1.8.RELEASE.jar;E:\java\apache-maven-3.6.1\m2\maven-repository\org\springframework\spring-webmvc\5.1.8.RELEASE\spring-webmvc-5.1.8.RELEASE.jar;E:\java\apache-maven-3.6.1\m2\maven-repository\org\springframework\spring-expression\5.1.8.RELEASE\spring-expression-5.1.8.RELEASE.jar;E:\java\apache-maven-3.6.1\m2\maven-repository\org\springframework\spring-web\5.1.8.RELEASE\spring-web-5.1.8.RELEASE.jar;E:\java\apache-maven-3.6.1\m2\maven-repository\org\springframework\spring-context\5.1.8.RELEASE\spring-context-5.1.8.RELEASE.jar;E:\java\apache-maven-3.6.1\m2\maven-repository\org\springframework\spring-context-support\5.1.8.RELEASE\spring-context-support-5.1.8.RELEASE.jar;E:\java\apache-maven-3.6.1\m2\maven-repository\org\springframework\spring-aop\5.1.8.RELEASE\spring-aop-5.1.8.RELEASE.jar;E:\java\apache-maven-3.6.1\m2\maven-repository\org\aspectj\aspectjrt\1.9.3\aspectjrt-1.9.3.jar;E:\java\apache-maven-3.6.1\m2\maven-repository\org\aspectj\aspectjweaver\1.9.3\aspectjweaver-1.9.3.jar;E:\java\apache-maven-3.6.1\m2\maven-repository\org\springframework\spring-test\5.1.8.RELEASE\spring-test-5.1.8.RELEASE.jar;E:\java\apache-maven-3.6.1\m2\maven-repository\org\mybatis\mybatis-spring\1.3.0\mybatis-spring-1.3.0.jar" com.intellij.rt.execution.junit.JUnitStarter -ideVersion5 -junit4 cn.gwj.dao.UserDaoTest,testAop
07-12 14:44:26[INFO]cn.gwj.aop.AopLogger
 -前置增强-执行了cn.gwj.service.user.UserServiceImpl@74455848的add的方法,传入了参数[张三]
07-12 14:44:26[INFO]cn.gwj.aop.AopLogger
 -前置增强-执行了cn.gwj.service.user.UserServiceImpl@74455848的add方法。方法传参[张三]
add方法
07-12 14:44:26[ERROR]cn.gwj.aop.AopLogger
 -环绕增强add方法发生异常。
07-12 14:44:26[INFO]cn.gwj.aop.AopLogger
 -环绕增强-add方法结束执行。
07-12 14:44:26[INFO]cn.gwj.aop.AopLogger
 -异常增强-执行了cn.gwj.service.user.UserServiceImpl@74455848的add的方法,异常java.lang.RuntimeException: 数据异常
07-12 14:44:26[INFO]cn.gwj.aop.AopLogger
 -最终增强-执行了cn.gwj.service.user.UserServiceImpl@74455848的add的方法

java.lang.RuntimeException: 数据异常

	at cn.gwj.dao.UserDaoImpl.add(UserDaoImpl.java:50)
	at cn.gwj.service.user.UserServiceImpl.add(UserServiceImpl.java:16)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
	at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:88)
	at cn.gwj.aop.AopLogger.around(AopLogger.java:44)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:644)
	at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:633)
	at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
	at org.springframework.aop.aspectj.AspectJAfterThrowingAdvice.invoke(AspectJAfterThrowingAdvice.java:62)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
	at org.springframework.aop.aspectj.AspectJAfterAdvice.invoke(AspectJAfterAdvice.java:47)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
	at org.springframework.aop.framework.adapter.AfterReturningAdviceInterceptor.invoke(AfterReturningAdviceInterceptor.java:55)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
	at org.springframework.aop.framework.adapter.MethodBeforeAdviceInterceptor.invoke(MethodBeforeAdviceInterceptor.java:56)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
	at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:93)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)
	at com.sun.proxy.$Proxy11.add(Unknown Source)
	at cn.gwj.dao.UserDaoTest.testAop(UserDaoTest.java:127)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:160)
	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
	at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
	at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
	at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)


Process finished with exit code -1

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值