posts - 10,comments - 4,trackbacks - 0

          接口
          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>

          主站蜘蛛池模板: 安丘市| 潮安县| 沛县| 含山县| 天门市| 永年县| 兴义市| 浏阳市| 新昌县| 德昌县| 保德县| 区。| 兖州市| 穆棱市| 宁明县| 湟中县| 上饶县| 化州市| 永胜县| 岐山县| 介休市| 枣强县| 卓资县| 宿松县| 木兰县| 扶余县| 阿鲁科尔沁旗| 建昌县| 恩平市| 曲水县| 滨州市| 铜陵市| 元江| 米脂县| 都昌县| 张家川| 林甸县| 永兴县| 手游| 保康县| 友谊县|