Spring动态注入的时候,如果一个类实现了一个接口,则需要利用到动态代理。
为了保持行为的一致性,代理类和委托类通常会实现相同的接口,所以在访问者看来两者没有丝毫的区别。通过代理类这中间一层,能有效控制对委托类对象的直接访问,也可以很好地隐藏和保护委托类对象,同时也为实施不同控制策略预留了空间,从而在设计上获得了更大的灵活性。Java动态代理机制以巧妙的方式近乎完美地实践了代理模式的设计理念。
因为JDK生成的最终真正的代理类,它继承自Proxy并实现了我们定义的接口,在实现接口方法的内部,通过反射调用了实现类的invoke方法。
因为本人现在才疏学浅,具体过程也不是太懂,所以直接上结论和代码。
结论:不能既继承接口又使用实现类来注入的方式。
代码实例如下:
接口类:MathCalculator.java
上述接口的实现类:
具体的测试:
测试的时候,通过实现类的ID获取bean,然后转为接口!
出现如果直接注入实现类会出现没有对应的bean,因为我们通过实现类来继承的接口,然而,必须使用jdk提供的动态代理方法,而不使用接口直接对实现类进行注入,则为cglib的注入,而不能既继承接口又使用实现类来注入的方式,这样两种代理类都是没有办法使用的。(此处为Java动态代理的知识)