AOPXML实现

来源:互联网 发布:淘宝客推广方式大全 编辑:程序博客网 时间:2024/05/16 06:14

 主要在于配置可以对照JDK实现(主要代理实现需要的参数)记忆

spring
log4j-1.2.11.jar
commons-logging-1.0.4.jar

配置
属性文件
log4j.properties

#rootlogger
log4j.rootLogger=INFO,A1

#1.ConsoleAppender
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.conversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p[%t] %-17c{2}(%13F:%L) %3x-%n%m%n

AOP.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN"
                  "
http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans>
    <bean id="logbeforeAdvice" class="aopxml.LogbeforeAdvice"/>     //定义一个bean 向代理序言的Handler
    <bean id="logafterAdvice" class="aopxml.LogAfterAdvice"/>
    <bean id="hello" class="aopxml.Hello"/>                         //代理中必须需要一个被代理类的实例
    <bean id="helloProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
        <property name="proxyInterfaces">       //代理中需要interface参数
            <value>aopxml.IHello</value>
        </property>
        <property name="target">                //Handler需要被代理类的实例
            <ref bean="hello"/>
        </property>
        <property name="interceptorNames">        //
            <list>
                <value>logbeforeAdvice</value>
                <value>logafterAdvice</value>
            </list>
        </property>
    </bean>
</beans>

1.接口Hello
public interface IHello {
    void sayHello(String name);
}
2.类Hello
public class Hello implements IHello{
    public void sayHello(String name) {
        System.out.println("Hello " + name);
    }
    public void doPrintln(String str){
        System.out.println("========method doprint is work! =========");
        System.out.println("+++++++" + str);
    }
}
3.后置实现 LogAfterAdvice
import java.lang.reflect.Method;
import org.apache.log4j.Logger;
import org.springframework.aop.AfterReturningAdvice;
public class LogAfterAdvice implements AfterReturningAdvice {
    Logger log = Logger.getLogger(this.getClass().getName());
    public void afterReturning(Object arg0, Method arg1, Object[] arg2, Object arg3)
            throws Throwable {
            log.info("======= after method =========");
    }
}
4.前置实现
import java.lang.reflect.Method;
import org.apache.log4j.Logger;
import org.springframework.aop.MethodBeforeAdvice;
public class LogbeforeAdvice implements MethodBeforeAdvice {
    Logger log = Logger.getLogger(this.getClass().getName());
    public void before(Method arg0, Object[] arg1, Object arg2) throws Throwable {
        log.info("======== method start =========");
        if (arg1.length > 0) {
            for (int i = 0; i < arg1.length; i++) {
                log.info("========paramer===" + arg1[i].toString() + " =======");
            }
        }
        if (arg2 != null) {
            log.info(arg2.toString());
            for (java.lang.reflect.Method m : arg2.getClass().getMethods()) {
                log.info("---- method name is:" + m.getName());
                if (m.getName().indexOf("doPrintln") != -1) {
                    m.invoke(arg2, arg1);
                }
            }
        }
    }
}
5.Main
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
public class Main {
    public static void main(String[] args) {
      ClassPathResource s = new ClassPathResource("/AOP.xml");
      BeanFactory f = new XmlBeanFactory(s);
      IHello h = (IHello)f.getBean("helloProxy");
      h.sayHello("Bill");
    }
}