接口
package net.blogjava.dodoma.spring.aop;
public interface HelloI {
?public String sayHello(String firstName,String lastName);
?}
實現類
package net.blogjava.dodoma.spring.aop;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class Hello implements HelloI {
?protected static final Log log=LogFactory.getLog(Hello.class);
?private String msg;
?public Hello(){}
?public Hello(String msg){
??this.msg=msg;
?}
?public String getMsg() {
??return msg;
?}
?public void setMsg(String msg) {
??this.msg = msg;
?}
?public String sayHello(String firstName, String lastName) {
??// TODO Auto-generated method stub
??log.info("in the class "+this.getClass().getName()+"'s method sayHello()");
??return (msg+" "+firstName+" "+lastName);
?}
}
BeforeAdvice通知
package net.blogjava.dodoma.spring.aop;
import java.lang.reflect.Method;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.aop.MethodBeforeAdvice;
/**
?* 方法調用之前.
?* 先調用此方法
?* @author dodoma
?**/
public class LogBeforeAdvice implements MethodBeforeAdvice {
?protected static final Log log = LogFactory.getLog(LogBeforeAdvice.class);
?public void before(Method m, Object[] args, Object target) throws Throwable {
??log.info("in the class "+this.getClass().getName()+"'s method before()");
??log.info("the target class is:" + target.getClass().getName());
??log.info("the target method is:" + m.getName());
??for (int i = 0; i < args.length; i++) {
???log.info("the method's args is:" + args[i]);
??}
??//測試,如果在before通知中發生了異常,程序流程將如何
??//throw new Exception("異常");
?}
}
測試類
package net.blogjava.dodoma.spring.aop;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.aop.framework.ProxyFactory;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
public class HelloTest {
?protected static final Log log = LogFactory.getLog(HelloTest.class);
?public static void main(String[] args) throws Exception {
??// TODO Auto-generated method stub
?//應用spring的ioc容器
??Resource rs = new ClassPathResource("beans.xml");
??BeanFactory bf = new XmlBeanFactory(rs);
??HelloI h = (HelloI) bf.getBean("theBean");
??log.info("starting...");
??try {
???log.info(h.sayHello("ma", "bin"));
?????} catch (Exception e) {
???e.printStackTrace();
??}
??log.info("end...");
??
??//如果沒有使用spring的ioc,可以直接用如下代碼測試
??ProxyFactory factory=new ProxyFactory();
??factory.addAdvice(new LogBeforeAdvice());//添加通知
??factory.setTarget(new Hello("hello"));//添加被代理的類實例
??try{
??HelloI hi=(HelloI)factory.getProxy();
??hi.sayHello("ma","bin");}
??catch(Exception e){e.printStackTrace();}
?}
}
spring的配置文件beans.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "
<beans>
<!--享受日志的類-->
<bean id="theTargetBean" class="net.blogjava.dodoma.spring.aop.Hello">
?<property name="msg">
??? ?<value>hello</value>
??? </property>
?????
</bean>
<!--advices-->
<bean id="theLogBeforeAdvice" class="net.blogjava.dodoma.spring.aop.LogBeforeAdvice"/>
<!--CONFIG-->
? <bean id="theBean" class="org.springframework.aop.framework.ProxyFactoryBean">
??? <!--接口-->
??? <property name="proxyInterfaces">
????? <value>net.blogjava.dodoma.spring.aop.HelloI</value>
??? </property>
??? <!--被代理的類-->
??? <property name="target">
????? <ref local="theTargetBean"/>
??? </property>
??? <!--加在代理類上的advice-->
??? <property name="interceptorNames">
????? <list>
??????? <value>theLogBeforeAdvice</value><!--此時直接使用advice,表明這個類所有的實例,方法,都享受advice的攔截-->
??????</list>
??? </property>
? </bean>
??
? <!--切入點,可以精確匹配類,方法,也可以不需要這個-->
? <!--Note: An advisor assembles pointcut and advice-->
? <bean id="theBeAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
??? <property name="advice">
????? <ref local="theLogBeforeAdvice"/>
??? </property>
??? <!--匹配模式-->
??? <property name="pattern">
????? <value>.*</value>
??? </property>
? </bean>
?? ?
</beans>
posted on 2006-03-28 12:02
dodoma 閱讀(448)
評論(0) 編輯 收藏 所屬分類:
spring