切面环绕通知异常没有返回值 导致404_基于Schema-based的四种通知

ca16043766dd9b2a3d994882a205795f.png

1.Aop编程思想的实现

9259da93af33eb432133918b4f051531.png

2.代码展示

1.导入jar包并添加路径

9fdf980fde96b3879d5fb5c91cb30692.png

2.接口添加新方法

4e147f7a3bb61ebac7a34080e3b18528.png

3.前置通知(在我们目标方法执行之前执行)创建通知类继承接口

5ab10504dcda972fa632c9bfad2d6915.png
package com.bjsxt.aspects;
​
import java.lang.reflect.Method;
​
import org.springframework.aop.MethodBeforeAdvice;
​
//切面:前置通知
public class MyMethodBeforeAdvice implements MethodBeforeAdvice {
    /**
     * method:目标方法
     * args:目标方法参数列表
     * target:目标对象
     */
    @Override
    public void before(Method method, Object[] args, Object target) throws Throwable {
        System.out.println("前置通知的before()方法执行!");
        
    }
​
}
​

修改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"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!-- 注册目标类 -->
    <bean id="someServiceImpl" class="com.bjsxt.service.impl.SomeServiceImpl"></bean>
    <!-- 注册切面:前置通知 -->
    <bean id="myMethodBeforeAdvice" class="com.bjsxt.aspects.MyMethodBeforeAdvice"></bean>
    <!-- 注册切面:后置通知 -->
    <bean id="myAfterReturningAdvice" class="com.bjsxt.aspects.MyAfterReturningAdvice"></bean>
    <!-- 注册切面:环绕通知 -->
    <bean id="myMethodInterceptor" class="com.bjsxt.aspects.MyMethodInterceptor"></bean>
    <!-- 注册切面:异常通知 -->
    <bean id="myThrowsAdvice" class="com.bjsxt.aspects.MyThrowsAdvice"></bean>
    <!-- 注册代理 -->
    <bean id="proxyFactoryBean" class="org.springframework.aop.framework.ProxyFactoryBean">
        <!-- 指定目标对象 -->
        <property name="target" ref="someServiceImpl"></property>
        <!-- 指定目标类实现的所有接口 -->
        <property name="interfaces" value="com.bjsxt.service.SomeService"></property>
        <!-- 指定切面 -->
        <property name="interceptorNames" value="myThrowsAdvice"></property>
    </bean>
</beans>
​

4.测试

71df02ed622bd7e57b75b547e2eb86aa.png

1.后置通知类似前置通知

79dc64ab91736a61da1adad9d85f278e.png

2.代码实现:

注册后置通知

改变代理切面为后置通知切面

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    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">
    <!-- 注册目标类 -->
    <bean id="someServiceImpl" class="com.bjsxt.service.impl.SomeServiceImpl"></bean>
    <!-- 注册切面:前置通知 -->
    <bean id="myMethodBeforeAdvice" class="com.bjsxt.aspects.MyMethodBeforeAdvice"></bean>
    <!-- 注册切面:后置通知 -->
    <bean id="myAfterReturningAdvice" class="com.bjsxt.aspects.MyAfterReturningAdvice"></bean>
    <!-- 注册切面:环绕通知 -->
    <bean id="myMethodInterceptor" class="com.bjsxt.aspects.MyMethodInterceptor"></bean>
    <!-- 注册切面:异常通知 -->
    <bean id="myThrowsAdvice" class="com.bjsxt.aspects.MyThrowsAdvice"></bean>
    <!-- 注册代理 -->
    <bean id="proxyFactoryBean" class="org.springframework.aop.framework.ProxyFactoryBean">
        <!-- 指定目标对象 -->
        <property name="target" ref="someServiceImpl"></property>
        <!-- 指定目标类实现的所有接口 -->
        <property name="interfaces" value="com.bjsxt.service.SomeService"></property>
        <!-- 指定切面 -->
        <property name="interceptorNames" value="myAfterReturningAdvice"></property>
    </bean>
</beans>
​

3.测试:

20cb29d88eada2909d7afc8998af3723.png

0b3e68bd7611c7d559458eacb24f06d6.png

可以拿到返回值

071442687bce3bf3761a002c30e8407a.png

还可对返回值进行扩展

636c04d71737d91953ac91442ec33212.png

返回值全部大写

1.环绕通知

49f0f796339bfecda6ba769c14ce7966.png

2.注册切面 环绕通知

<!-- 注册切面:环绕通知 -->
    <bean id="myMethodInterceptor" class="com.bjsxt.aspects.MyMethodInterceptor"></bean>
    <!-- 指定目标对象 -->
        <property name="target" ref="someServiceImpl"></property>
        <!-- 指定目标类实现的所有接口 -->
        <property name="interfaces" value="com.bjsxt.service.SomeService"></property>
        <!-- 指定切面 -->
        <property name="interceptorNames" value="myMethodInterceptor"></property>

3.测试

697a9f620ac52b778a095642aded9633.png

bcba3f5f9152ef5662a4c74e52a1c4d7.png

环绕通知进行增强

1.异常处理通知没有方法去实现(源码四个重载方法)

3b5bdef02e164ac751c49d973b31e5b2.png

2f89bb772522692d17146b4b18a9df03.png

2.代码展示

e7c8f71129d1ab396b515bf0e8352103.png

3.注册异常通知和切面

  <!-- 注册切面:异常通知 -->
    <bean id="myThrowsAdvice" class="com.bjsxt.aspects.MyThrowsAdvice"></bean>
    <!-- 注册代理 -->
    <bean id="proxyFactoryBean" class="org.springframework.aop.framework.ProxyFactoryBean">
        <!-- 指定目标对象 -->
        <property name="target" ref="someServiceImpl"></property>
        <!-- 指定目标类实现的所有接口 -->
        <property name="interfaces" value="com.bjsxt.service.SomeService"></property>
        <!-- 指定切面 -->
        <property name="interceptorNames" value="myThrowsAdvice"></property>
    </bean>
</beans>
​

4.测试

0db6c541e50ae44fe94321469454e99b.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值