Spring2.5学习4.2_Proxy实现动态代理(目标类实现随意接口)


静态代理的缺点是在代理类中绑定了固定的接口,不利于扩展,动态代理则不然,通过动态代理能够对不论什么实现某一接口的类进行功能性增强。

在java中动态代理由InvocationHander来实现。

HelloInterface接口




[java]  view plain copy


1. package proxy;  
2.   
3. public interface HelloInterface {  
4. public void sayHello();  
5. }

实现 HelloInterface接口的类HelloInterfaceImpl

[java]  view plain copy


    1. package proxy;  
    2.   
    3. public class HelloInterfaceImpl implements HelloInterface {  
    4.   
    5. @Override  
    6. public void sayHello() {  
    7. "Hello xianjj");  
    8.     }  
    9.   
    10. }


    proTest类实现了InvocationHandler类

    package proxy;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    // 实现InvocationHandler接口
    public class proTest implements InvocationHandler {
    
    	Object anyObject;
    	
    	// 申明bind方法
    	public Object bind (Object anyObject){
    		this.anyObject = anyObject;
    		return Proxy.newProxyInstance(anyObject.getClass().getClassLoader(), anyObject.getClass().getInterfaces(), this);
    	}
    	// 重写invoke方法
    	@Override
    	public Object invoke(Object arg0, Method arg1, Object[] args)
    			throws Throwable {
    		Object returnObject = null;
    		System.out.println("动态代理開始");
    		returnObject = arg1.invoke(anyObject, args);
    		System.out.println("动态代理结束");
    		return returnObject;
    	}
    
    	public static void main(String[] args) {
    		proTest proTest = new proTest();
    		HelloInterface helloInterfaceReturn = (HelloInterface)proTest.bind(new HelloInterfaceImpl());
    		helloInterfaceReturn.sayHello();
    	}
    }


    在main方法中调用proTest对象的bind绑定方法将一个实现类与一个动态代理进行绑定。动态代理主要由下面代码来实现

    Proxy.newProxyInstance(anyObject.getClass().getClassLoader(), anyObject.getClass().getInterfaces(), this);


    将输入的anyObject对象与接口进行动态关联。这样就能够避免静态接口固定的缺陷了,动态代理由原来的静态代理面向接口转向动态代理面向实现类,这样设计的出发点不是对接口,而是动态的取的接口。软件的灵活性大大的提高。

    当调用被代理的HelloInterfaceImpl类实例的方法时,系统将转到包括代理类proTest的InvocationHandler的invoke方法中运行对应的代码,动态代理的过程结束。

    public class proTest implements InvocationHandler类不在服务于某一个接口。静态代理和动态代理都是针对于sayHello()方法进行增强,不支持field字段级的增强。

    Spring觉得那已经在破坏面向对象编程的结构,所以支持方法的增强是再合适不的,并且与Spring的其它模块进行整合开发时会更有集中性。




    结果:


    springdatajpa动态拼接参数_java












    静态代理的缺点是在代理类中绑定了固定的接口,不利于扩展,动态代理则不然,通过动态代理能够对不论什么实现某一接口的类进行功能性增强。

    在java中动态代理由InvocationHander来实现。

    HelloInterface接口




    [java]  view plain copy


    1. package proxy;  
    2.   
    3. public interface HelloInterface {  
    4. public void sayHello();  
    5. }

    实现 HelloInterface接口的类HelloInterfaceImpl

    [java]  view plain copy


    1. package proxy;  
    2.   
    3. public class HelloInterfaceImpl implements HelloInterface {  
    4.   
    5. @Override  
    6. public void sayHello() {  
    7. "Hello xianjj");  
    8.     }  
    9.   
    10. }



    proTest类实现了InvocationHandler类

    package proxy;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    // 实现InvocationHandler接口
    public class proTest implements InvocationHandler {
    
    	Object anyObject;
    	
    	// 申明bind方法
    	public Object bind (Object anyObject){
    		this.anyObject = anyObject;
    		return Proxy.newProxyInstance(anyObject.getClass().getClassLoader(), anyObject.getClass().getInterfaces(), this);
    	}
    	// 重写invoke方法
    	@Override
    	public Object invoke(Object arg0, Method arg1, Object[] args)
    			throws Throwable {
    		Object returnObject = null;
    		System.out.println("动态代理開始");
    		returnObject = arg1.invoke(anyObject, args);
    		System.out.println("动态代理结束");
    		return returnObject;
    	}
    
    	public static void main(String[] args) {
    		proTest proTest = new proTest();
    		HelloInterface helloInterfaceReturn = (HelloInterface)proTest.bind(new HelloInterfaceImpl());
    		helloInterfaceReturn.sayHello();
    	}
    }


    在main方法中调用proTest对象的bind绑定方法将一个实现类与一个动态代理进行绑定。动态代理主要由下面代码来实现

    Proxy.newProxyInstance(anyObject.getClass().getClassLoader(), anyObject.getClass().getInterfaces(), this);


    将输入的anyObject对象与接口进行动态关联。这样就能够避免静态接口固定的缺陷了,动态代理由原来的静态代理面向接口转向动态代理面向实现类,这样设计的出发点不是对接口,而是动态的取的接口。软件的灵活性大大的提高。

    当调用被代理的HelloInterfaceImpl类实例的方法时,系统将转到包括代理类proTest的InvocationHandler的invoke方法中运行对应的代码,动态代理的过程结束。

    public class proTest implements InvocationHandler类不在服务于某一个接口。静态代理和动态代理都是针对于sayHello()方法进行增强,不支持field字段级的增强。

    Spring觉得那已经在破坏面向对象编程的结构,所以支持方法的增强是再合适不的,并且与Spring的其它模块进行整合开发时会更有集中性。




    结果:


    springdatajpa动态拼接参数_java