Spring之引介增强

本文介绍了如何使用Spring的引介增强(Introduction Interceptor)来为目标类添加额外的功能。通过继承DelegatingIntroductionInterceptor创建增强类,并定义额外接口以实现所需功能。在beans.xml配置文件中进行相应配置后,通过测试类验证了引介增强的效果。

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

目标类:要为此类添加而外的功能

package com.testApi.yinZhiAdvice;

public class ForumService {
    public void add(){
        System.out.println("add method");
    }

    public void remove(){
        System.out.println("remove method");
    }


}

1.继承DelegatingIntroductionInterceptor,引介增强类

package com.testApi.yinZhiAdvice;

import org.aopalliance.intercept.MethodInvocation;
import org.springframework.aop.support.DelegatingIntroductionInterceptor;

public class ControllerIntroductionInterceptor extends DelegatingIntroductionInterceptor
                                                implements Monitor{

    //Boolean是boolean的封装类
    //ThreadLocal是线性安全的
    ThreadLocal<Boolean> threadLocal=new ThreadLocal<Boolean>();


    @Override
    public void setActiveStatus(boolean active) {
        threadLocal.set(active);
    }


    public Object invoke(MethodInvocation mi) throws Throwable {
        Object ob=null;
        if (threadLocal.get() !=null && threadLocal.get()){
            System.out.println("开启日志监控功能start");
            ob=super.invoke(mi);
            System.out.println("开启日志监控功能end");
        }else {
            ob=super.invoke(mi);
        }

        return ob;
    }


}

3.而外接口,通过此接口实现而外功能

package com.testApi.yinZhiAdvice;

public interface Monitor {
    void setActiveStatus(boolean active);
}

4.beans.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:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
         http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<!--            增强类-->
    <bean id="controlAdvice" class="com.testApi.yinZhiAdvice.ControllerIntroductionInterceptor"/>
    <bean id="target" class="com.testApi.yinZhiAdvice.ForumService"/>
<!--   此处的ForumService是bean的名称,不是上面的ForumService类,只是一个名字 -->
    <!--          Monitor接口是要额外增加功能的接口,应该是表明该bean要继承它?-->
<!--    因为是为类增加代理,所以必须用p:proxyTargetClass="true" -->
    <bean id="ForumService" class="org.springframework.aop.framework.ProxyFactoryBean"
          p:interfaces="com.testApi.yinZhiAdvice.Monitor"
          p:interceptorNames="controlAdvice"
          p:target-ref="target"
          p:proxyTargetClass="true"/>

</beans>

5.测试类:

    @Test
    public void test6(){
        ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("beans2.xml");
        ForumService forumService=(ForumService)context.getBean("ForumService");
        forumService.add();
        forumService.remove();

        Monitor monitor =(Monitor) forumService;
        monitor.setActiveStatus(true);

        forumService.add();
        forumService.remove();

    }

输出:

add method
remove method
开启日志监控功能start
add method
开启日志监控功能end
开启日志监控功能start
remove method
开启日志监控功能end

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值