Spring之引介增强

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

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

猜你喜欢

转载自blog.csdn.net/weixin_39102174/article/details/90614658