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();
    }
}    
时间: 2024-10-11 04:28:13

spring-aop-ProxyFactoryBean代理的实例的相关文章

spring aop 动态代理批量调用方法实例

今天项目经理发下任务,需要测试 20 个接口,看看推送和接收数据是否正常.因为对接传输的数据是 xml 格式的字符串,所以我拿现成的数据,先生成推送过去的数据并存储到文本,以便验证数据是否正确,这时候要批量调用这些同名方法,我觉得这里可以发展成有潜力的代码. 推送比较好做数据,队友们都写好代码,但是有个问题,方法要的值都大致相同,封装的方式不一致,多人开发,有的封装对象里面,有的直接使用 Map.get(),唉,一千个人一千个哈姆雷特嘛,只好利用反射和动态代理节省自己的代码量,而且这种方式练练手

详解 spring AOP 动态代理

通过例子查看,首先建立一个实现动态代理的接口Interface1.java,代码如下: package my.spring.fuck.aoptest; public interface Interface1 { public void say_hello(); } 很简单的一个接口,然后定义一个这个接口的实现类MyImple.java,代码: package my.spring.fuck.aoptest; public class MyImple implements Interface1{ @

Spring AOP动态代理实现,解决Spring Boot中无法正常启用JDK动态代理的问题

Spring AOP底层的动态代理实现有两种方式:一种是JDK动态代理,另一种是CGLib动态代理. JDK动态代理 JDK 1.3版本以后提供了动态代理,允许开发者在运行期创建接口的代理实例,而且只能为接口创建代理实例. 如果被代理目标没有接口那么Spring也无能为力,Spring通过Java的反射机制生成被代理接口的新的匿名实现类. JDK动态代理具体实现原理: 通过实现InvocationHandlet接口创建自己的调用处理器: 通过为Proxy类指定ClassLoader对象和一组in

Spring AOP(基于代理类的AOP实现)

#基于代理类的AOP实现:step1: 1 package com.sjl.factorybean; 2 /**切面类*/ 3 import org.aopalliance.intercept.MethodInterceptor; 4 import org.aopalliance.intercept.MethodInvocation; 5 6 public class MyAspect implements MethodInterceptor { 7 @Override 8 public Obj

Spring AOP动态代理

出现org.springframework.aop.framework.ProxyFactoryBean cannot be cast to 错误 在类型转换的时候, 调用getObject()方法,再对ProxyFactoryBean进行转换 xml文件 <aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy><!--使用cglib动态代理--> <be

Spring AOP基于xml配置实例

目录层级: AOP相关的几个类就是com.aop.xmltype这个报下的4个类. ICalculatorxml.java package com.aop.xmltype; /** * 加减乘除接口,用于AOP测试 * * @author Wei * */ public interface ICalculatorxml { /** * 加法 * * @param a * @param b * @return a+b */ public int doAdd(int a, int b); /** *

Spring AOP自动代理创建者

1. BeanNameAutoProxyCreator示例 <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.springfra

spring aop自动代理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" xmlns:aop="http://www.springframework.org/schema/

spring aop自动代理注解配置之二

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/

spring(AOP)静态代理

1.定义抽象主题接口,假设需实现一个计算的类Math.完成加.减.乘.除功能,如下所示: 2.主题类,算术类,实现抽象接口. 3.代理类 4.测试运行 5.总结: 静态代理的优点:解决了"开闭原则(OCP)"的问题,解决了"依赖倒转(DIP)"的问题,解决了"单一职责(SRP)"的问题. 静态代理的缺点:如果项目中有多个类,则需要编写多个代理类,工作量大,不好修改,不好维护,不能应对变化.