目标类:要为此类添加而外的功能
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