在Spring框架中,任何注册到Spring框架中的bean,如果实现了某个接口,那么在得到这个bean的时候,只能将其下溯造型成其接口进行操作,而不能直接下溯造型成具体的类型进行操作。原因在于Spring的AOP实现机制, Spring中的Bean管理实际上是基于动态AOP机制实现,为了实现动态AOP,Spring在默认情况下会使用Java Dynamic Proxy,但是,Dynamic Proxy要求其代理的对象必须实现一个接口,该接口定义了准备进行代理的方法。而对于没有实现任何接口的Java Class,需要采用其他方式,Spring通过CGLib实现这一功能。当类实现了一个接口之后,Spring将通过Java Dynamic Proxy机制实现代理功能,此时返回的Bean,是通过java.lang.reflect.Proxy.newProxyInstance方法创建的其接口的一个代理实现,这个实例实现了其接口,但与类已经没有继承关系,因此无法通过下溯造型进行强制转型,如果进行转换,则会抛出异常。这也就强制要求编程人员要面向接口编程,使程序员能够从接口的角度考虑程序设计,从而降低了程序的耦合度。
Spring的动态代理机制
最新推荐文章于 2024-07-20 20:04:43 发布