posts - 10,comments - 4,trackbacks - 0

          接口
          package net.blogjava.dodoma.spring.aop;

          public interface HelloI {
          ?public String sayHello(String firstName,String lastName);
          ?}

          實(shí)現(xiàn)類
          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;

          /**
          ?* 方法調(diào)用之前.
          ?* 先調(diào)用此方法
          ?* @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]);
          ??}
          ??//測(cè)試,如果在before通知中發(fā)生了異常,程序流程將如何
          ??//throw new Exception("異常");
          ?}
          }

          測(cè)試類
          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
          ?//應(yīng)用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...");
          ??
          ??//如果沒(méi)有使用spring的ioc,可以直接用如下代碼測(cè)試
          ??ProxyFactory factory=new ProxyFactory();
          ??factory.addAdvice(new LogBeforeAdvice());//添加通知
          ??factory.setTarget(new Hello("hello"));//添加被代理的類實(shí)例
          ??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><!--此時(shí)直接使用advice,表明這個(gè)類所有的實(shí)例,方法,都享受advice的攔截-->
          ??????</list>
          ??? </property>
          ? </bean>
          ??
          ? <!--切入點(diǎn),可以精確匹配類,方法,也可以不需要這個(gè)-->
          ? <!--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>


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 武义县| 九龙坡区| 南昌市| 白玉县| 绍兴市| 河东区| 湖州市| 关岭| 龙游县| 临邑县| 清远市| 巴塘县| 佛山市| 长寿区| 茶陵县| 年辖:市辖区| 威海市| 台山市| 林口县| 黄骅市| 镇原县| 聊城市| 乌兰浩特市| 太和县| 麻阳| 中山市| 武乡县| 佛冈县| 沽源县| 津市市| 大理市| 通化县| 社旗县| 静宁县| 额济纳旗| 安远县| 全州县| 盐边县| 凤山县| 甘洛县| 开江县|