天天看點

Spring AOP 之 ControlFlowDemo

平台:Spring2.5

org.springframework.aop.support.ControlFlowPointcut是Spring 所提供的類,作用是判斷在方法的執行堆棧中,某個指定類的某方法是否曾經要求您的目标對象執行某個動作,由于這在執行時期才會确定是否介入Advices,是以Spring 提供的是動态Pointcut功能。

IHello.java内容如下:

package onlyfun.caterpillar;

public interface IHello {

    public void helloNewbie(String name);

    public void helloMaster(String name);

}

HelloSpeaker.java内容:

package onlyfun.caterpillar;

public class HelloSpeaker implements IHello {

    public void helloNewbie(String name) {

        System.out.println("Hello, " + name + " newbie!");

    }

    public void helloMaster(String name) {

        System.out.println("Hello, " + name  + " master!");

    }

}

Some.java内容:

package onlyfun.caterpillar;

import org.springframework.beans.BeansException;

import org.springframework.context.ApplicationContext;

import org.springframework.context.ApplicationContextAware;

public class Some implements ApplicationContextAware {

    private IHello helloProxy;

    public void setApplicationContext(

            ApplicationContext context) throws BeansException {

        helloProxy = (IHello) context.getBean("helloProxy");

    }

    public void helloEverybody() {

        helloProxy.helloNewbie("Justin");

        helloProxy.helloMaster("caterpillar");

    }

    public void hello() {

        System.out.println("Hello!");

    }

}

LogBeforeAdvice.java内容:

package onlyfun.caterpillar;

import java.lang.reflect.Method;

import java.util.logging.Level;

import java.util.logging.Logger;

import org.springframework.aop.MethodBeforeAdvice;

public class LogBeforeAdvice

        implements MethodBeforeAdvice {

    private Logger logger =

            Logger.getLogger(this.getClass().getName());

    public void before(Method method, Object[] args,

                     Object target) throws Throwable {

        logger.log(Level.INFO,

                "method starts..." + method);

   }

}

applicationContext.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"

  xsi:schemaLocation="http://www.springframework.org/schema/beans

  http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

    <bean id="some" class="onlyfun.caterpillar.Some"/>

    <bean id="logBeforeAdvice"

          class="onlyfun.caterpillar.LogBeforeAdvice"/>

    <bean id="helloFlowControlPointcut"

       class="org.springframework.aop.support.ControlFlowPointcut">

        <constructor-arg value="onlyfun.caterpillar.Some"/>

    </bean>

    <bean id="helloAdvisor"

       class="org.springframework.aop.support.DefaultPointcutAdvisor">

        <property name="advice" ref="logBeforeAdvice"/>

        <property name="pointcut" ref="helloFlowControlPointcut"/>

    </bean>

    <bean id="helloSpeaker"

          class="onlyfun.caterpillar.HelloSpeaker"/>

    <bean id="helloProxy"

          class="org.springframework.aop.framework.ProxyFactoryBean">

        <property name="proxyInterfaces"

                  value="onlyfun.caterpillar.IHello"/>

        <property name="target" ref="helloSpeaker"/>

        <property name="interceptorNames">

            <list>

                <value>helloAdvisor</value>

            </list>

        </property>

    </bean>

</beans>

test.java

package onlyfun.caterpillar;

import org.springframework.context.ApplicationContext;

import org.springframework.context.

              support.ClassPathXmlApplicationContext;

public class test{

    public static void main(String[] args) {

        ApplicationContext context =

                new ClassPathXmlApplicationContext(

                        "beans-config.xml");

        Some some = (Some) context.getBean("some");

        if(args.length > 0 && "run".equals(args[0])) {

            some.helloEverybody();

        }

        else {

            some.hello();

        }

    }

}

log4j.properties

log4j.rootLogger=WARN, stdout

log4j.appender.stdout=org.apache.log4j.ConsoleAppender

log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n