引介切面是一种比较特殊的增强类型,它不是在目标方法周围织入增强,而是为目标类创建新的方法和属性,所以引介增强的链接点是类级别的,而非方法级别的。通过引介增强,我们
/**要侵入的接口*/
package com.book.service;
public interface Monitorable {
public void setMonitorActive(Boolean flage);
}
package com.book.serviceImpl;
import com.book.entity.User;
/**目标类*/
public class UserServiceImpl {
public User findByName(String name) {
// TODO Auto-generated method stub
System.out.println("进入了service层了哦!!!");
return new User(name,"26");
}
}
/**增强*/
package com.book.aop;
import org.aopalliance.intercept.MethodInvocation;
import org.springframework.aop.support.DelegatingIntroductionInterceptor;
import com.book.service.Monitorable;
public class PerformanceMonitor extends DelegatingIntroductionInterceptor implements Monitorable{
private ThreadLocal<Boolean> laosn=new ThreadLocal<Boolean>();
public void setMonitorActive(Boolean flage) {
// TODO Auto-generated method stub
laosn.set(flage);
}
public Object invoke(MethodInvocation mi) throws Throwable{
Object obj=null;
if(laosn.get()!=null&&laosn.get()){
System.out.println("-------------哈哈!骚年!你被织入了接口了----------开始-----");
obj=super.invoke(mi);
System.out.println("-------------哈哈!骚年!你被织入了接口了----------结束-----");
}else {
obj=super.invoke(mi);
}
return obj;
}
}
@Controller
public class TianController {
@Resource(name="userServiceProxyfactorybean")
private UserServiceImpl userServiceProxyfactorybean;
@RequestMapping("/tian2")
public String tian2(){
/**转换成侵入接口然后再调用接口方法改变行为*/
Monitorable mo=(Monitorable)userServiceProxyfactorybean;
mo.setMonitorActive(true);
User user=proxyfactorybean.findByName("zhangtian");
return "user/index";
}
}
/**最后配置applicationContext.xml*/
<!-- 此配置演示了 引介切点 -->
<bean id="performancemonitoradvice" class="com.book.aop.PerformanceMonitor"></bean>
<bean id="userserviceTarget" class="com.book.serviceImpl.UserServiceImpl"></bean>
<bean id="userServiceProxyfactorybean" p:interfaces="com.book.service.Monitorable" p:interceptorNames="performancemonitoradvice" p:target-ref="userserviceTarget" p:proxyTargetClass="true"class="org.springframework.aop.framework.ProxyFactoryBean"/>
