上一篇文章是Spring AOP的單獨代理,這一篇是關於Spring AOP的自動代理。其中的原理沒必要多說,Spring AOP可以通過兩種方式實現自動代理。下面就是分別介紹這兩種方式。
1、使用 BeanNameAutoProxyCreator
1)首先創建Bean類
package com.javaeye.sunjiesh.proxy.auto;
public class HelloBeanA {
public void testHelloBeanA(){
System.out.println(this.getClass().getName()+" is running");
}
}
package com.javaeye.sunjiesh.proxy.auto;
public class HelloBeanB {
public void testHelloBeanB(){
System.out.println(this.getClass().getName()+" is running");
}
}
2)創建Advice類
package com.javaeye.sunjiesh.aop;
import java.lang.reflect.Method;
import org.springframework.aop.AfterReturningAdvice;
public class AfterAdviceBean implements AfterReturningAdvice{
public AfterAdviceBean() {
// TODO Auto-generated constructor stub
}
@Override
public void afterReturning(Object returnValue, Method method,
Object[] args, Object target) throws Throwable {
// TODO Auto-generated method stub
System.out.println("afterReturning is running");
}
}
package com.javaeye.sunjiesh.aop;
import java.lang.reflect.Method;
import org.springframework.aop.MethodBeforeAdvice;
public class BeforeAdviceBean implements MethodBeforeAdvice{
public BeforeAdviceBean() {
// TODO Auto-generated constructor stub
}
@Override
public void before(Method method, Object[] args, Object target)
throws Throwable {
// TODO Auto-generated method stub
System.out.println("before is running");
}
}
3)創建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:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> <bean id="helloBeanA" class="com.javaeye.sunjiesh.proxy.auto.HelloBeanA"></bean> <bean id="helloBeanB" class="com.javaeye.sunjiesh.proxy.auto.HelloBeanB"></bean> <bean id="beforeAdvice" class="com.javaeye.sunjiesh.aop.BeforeAdviceBean"></bean> <bean id="afterAdvice" class="com.javaeye.sunjiesh.aop.AfterAdviceBean"></bean> <!-- 在此進行自動代理配置 --> <bean id="beanNameAutoProxyCreator" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> <property name="beanNames"> <list> <value>helloBean*</value> </list> </property> <property name="interceptorNames"> <list> <value>beforeAdvice</value> <value>afterAdvice</value> </list> </property> </bean> </beans>
4)創建測試類
package com.javaeye.sunjiesh.proxy.auto;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SpringAopMain {
public SpringAopMain() {
// TODO Auto-generated constructor stub
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
ApplicationContext ctx = new ClassPathXmlApplicationContext(
"spring-beans3.xml");
HelloBeanA h1 = (HelloBeanA) ctx.getBean("helloBeanA");
h1.testHelloBeanA();
HelloBeanB h2 = (HelloBeanB) ctx.getBean("helloBeanB");
h2.testHelloBeanB();
}
}
5)輸出
before is running com.javaeye.sunjiesh.proxy.auto.HelloBeanA is running afterReturning is running before is running com.javaeye.sunjiesh.proxy.auto.HelloBeanB is running afterReturning is running
2、使用 DefaultAdvisorAutoProxyCreator
只要修改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:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> <bean id="helloBeanA" class="com.javaeye.sunjiesh.proxy.auto.HelloBeanA"></bean> <bean id="helloBeanB" class="com.javaeye.sunjiesh.proxy.auto.HelloBeanB"></bean> <bean id="beforeAdvice" class="com.javaeye.sunjiesh.aop.BeforeAdviceBean"></bean> <bean id="afterAdvice" class="com.javaeye.sunjiesh.aop.AfterAdviceBean"></bean> <!-- 在此進行自動代理配置 --> <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" /> <bean id="nameMatchMethodPointcutAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor"> <property name="advice" ref="beforeAdvice" /> <property name="mappedNames"> <list> <value>test*</value> </list> </property> </bean> </beans>