Spring Internal - 成员实例注入澄清

时间:2014-05-09 12:45:41

标签: java spring dependency-injection

Spring通过Java动态代理(java.lang.reflect.Proxy)创建类对象。即

@Component
public class NewsService implements Service{
}

但Spring如何注入成员变量?即

@Autowired
private EntityManager em;

Java动态代理使用interface(即Service)来创建对象。但是如何注入成员变量? interface不知道实例变量。

当注入成员实例时?加载时间?(当创建包含类对象?)或延迟加载? (首先使用对象?)

1 个答案:

答案 0 :(得分:1)

对你来说很少有事实:

  • Spring实例化特定的类,而不是接口。依赖注入是在原始bean实例上完成的。
  • 创建代理时,Spring会在应用程序上下文中注册原始bean 及其代理。为原始bean实现的所有接口创建JDK代理。
  • 如果不需要代理,则不会创建代理(即目标bean上没有应用任何方面)。
  • 默认情况下,所有bean都会急切地初始化。如果您希望以惰性方式实例化某个bean,则需要明确指定它。
  • 在实例化bean之后立即发生依赖注入。一些依赖项是基于bean定义注入的,其他依赖项可能由各种 bean后处理器注入(但它们也会立即执行)。

如何实现依赖注入:

  • 使用XML配置或自动装配时,依赖注入是通过Reflection API完成的。 Spring可以调用属性设置器(setFoo(...))或直接设置字段值(反射允许设置私有成员)。
  • 在Java配置中使用@Bean方法时,依赖注入由您的方法完成。

有点代理:

  • JDK代理和CGLIB代理是两种不同的代理机制。 JDK基于提供的接口创建人工类,而CGLIB创建目标类的人工子类。
  • 使用哪种代理机制取决于您的Spring配置(JDK是默认配置)。出于显而易见的原因,只有在依赖项仅由接口引用的情况下才能使用JDK代理。另一方面,您无法使用CGLIB代理最终类。