spring-AOP-ProxyFactoryBean代理的实例

 

1.一个代理模式的实例 通过 Proxy类进行代理

wait.java

//定义一个接口
public interface wait {
    void say();
}



//
目标对象实现接口并重写方法 public class waiter implements wait { @Override public void say() { // TODO Auto-generated method stub System.out.println("先生"); } }


public
class SayHelloBeforemale implements MethodBeforeAdvice {//实现相应增强类的接口 @Override public void before(Method arg0, Object[] arg1, Object arg2) throws Throwable { //arg0 是 目标类的方法 arg1是目标类的入参数 arg2是目标类实例 发生异常则抛给Throwable // TODO Auto-generated method stub System.out.println("hello"); } }

 

UnitTest.java

public class UnitTest {
        //实明变量
    private SayHelloBeforemale male ;
    private waiter wait;
    private ProxyFactory xy;
    @Before
    public void init(){
              //实例化并赋值
        male = new SayHelloBeforemale();
        wait = new waiter();
        xy = new ProxyFactory();
             //设置目标对象
        xy.setTarget(wait);
            //设置增强类对象
        xy.addAdvice(male);
        
    }
    @Test
    public void test(){
               //
        waiter w = (waiter)xy.getProxy();
        w.say();
    }
                                    

 

2.通过spring的配置文件进行代理

  这个方法进行代理所需的类和上面的 wait接口 和 它的实现类waiter 还有sayhelloadvice类

  不同之处在于不是使用 ProxtyFactory来进行代理目标对象,而是通过Schema 的xml文件进行配置代理。

beans.xml

<bean id="sayhelloadvice" class="test3.SayHelloBeforemale"/>
    <bean id="target" class="test3.waiter"/>
    <bean id="waiter" class="org.springframework.aop.framework.ProxyFactoryBean"
        p:proxyInterfaces="test3.wait"
        p:interceptorNames="sayhelloadvice"
        p:target-ref="target"
    />

- target:代理的目标对象 

- proxyInterfaces:代理所需要实现的接口,可以多个接口。该属性还有一个别名是Interfaces

- interceptorNames:需要植入目标对象的bean列表。采用bean的名称指定。这些bean必须实现类 org.aopalliance.intercept.MethodInterceptor

        或 org.springframework.aop.Advisor的bean ,配置中的顺序对应调用的顺序。

- proxyTargetClass:是否对类进行代理(而不是进行对接口进行代理),设置为true时,使用CGLib代理,且proxyInterfaces属性被ProxyFactoryBean忽略。

 

UnitTest.java

public class UnitTest { 
    @Test //测试在spring 通过ProxyFactoryBean 配置代理
    public void test2(){
        ApplicationContext a = new ClassPathXmlApplicationContext("test3/beans.xml");
        wait w = (wait)a.getBean("waiter");
        w.say();
    }
}    

 

posted on 2016-07-30 15:53  野区杰西  阅读(7646)  评论(0编辑  收藏  举报

导航