创建增强类
增强类型
- 增强类型
- 前置增强Before
- 后置增强AfterReturningAdvice
- 环绕增强MethodInterceptor
- 异常抛出增强ThrowsAdvice
- 引介增强IntroductionInterceptor
前置增强
public interface Waiter {
void greetTo(String name);
void serveTo(String name);
}
public class NativeWaiter implements Waiter {
public void greetTo(String name) {
System.out.println("greet to "+name+"...");
}
public void serveTo(String name) {
System.out.println("serving " + name + "...");
}
}
public class GreetingBeforeAdvice implements MethodBeforeAdvice {
public void before(Method method, Object[] objects, Object o) throws Throwable {
String clientName = (String)objects[0];
System.out.println("How are you!Mr."+ clientName+".");
}
}
public class BeforeAdviceTest {
private Waiter target;
private BeforeAdvice advice;
private ProxyFactory pf;
@Before
public void init(){
target = new NativeWaiter();
advice = new GreetingBeforeAdvice();
pf = new ProxyFactory();
pf.setTarget(target);
pf.addAdvice(advice);
}
@Test
public void beforeAdvice(){
Waiter proxy = (Waiter)pf.getProxy();
proxy.greetTo("John");
proxy.serveTo("Tom");
}
}
在spring中配置
<bean id="greetingAdvice" class="com.smart.advice.GreetingBeforeAdvice"/>
<bean id="target" class="com.smart.advice.NativeWaiter"/>
<bean id="waiter" class="org.springframework.aop.framework.ProxyFactoryBean"
p:proxyInterfaces="com.smart.advice.Waiter"
p:interceptorNames="greetingAdvice"
p:target-ref="target"/>
- ProxyFactoryBean
- proxyInterfaces:代理所要实现的接口
- interceptorName:需要植入目标对象的Bean列表
- singleton:返回代理是否是单实例
- optimize:设置为true时,强制使用CGLIB代理
- proxyTargetClass:是否对类进行代理(而不是对接口),为true使用CGLIB代理
public class SpringAdviceTest {
@Test
public void testAdvice(){
String configPath = "beans.xml";
ApplicationContext ctx = new ClassPathXmlApplicationContext(configPath);
Waiter waiter = (Waiter)ctx.getBean("waiter");
waiter.greetTo("John");
}
}
<bean id="waiter1" class="org.springframework.aop.framework.ProxyFactoryBean"
p:interceptorNames="greetingAdvice"
p:target-ref="target"
p:proxyTargetClass="true"/>