茂名网站制作网页/网络平台有哪些?
对于Spring而言,如果Bean是面向接口编程,那么在Spring内部都是通过动态代理的方式对Bean进行增强的。动态代理中所谓的动态,是针对使用Java代码实际编写了代理类的静态代理而言的,它的优势不在于省去了编写代理类的工作量,而是实现了可以在原始类和接口还未知的时候,就确定代理类的行为,当代理类与原始类脱离直接联系后,就可以重用于不同的应用场景中。
实例演示:
public class DynamicProxyTest {interface IHello{void sayHello();}static class Hello implements IHello{@Overridepublic void sayHello(){System.out.println("hello world");}}static class DynamicProxy implements InvocationHandler{Object originalObj;Object bind(Object originalObj){this.originalObj=originalObj;returnProxy.newProxyInstance(originalObj.getClass().getClassLoader(), originalObj.getClass().getInterfaces(), this);}@Overridepublic Object invoke(Object proxy,Method method,Object[] args)throws Throwable{System.out.println("welcome");return method.invoke(originalObj, args);}}public static void main(String[] args) {IHello hello=(IHello)new DynamicProxy().bind(new Hello());hello.sayHello();}}
原始的逻辑是打印Hello world 但代理类的逻辑在原始基础之前打印welcome
上述方法中的Proxy.newProxyInstance() 返回一个实现了IHello的接口,并且代理了new Hello()实例行为的对象