gpt4 book ai didi

java - Spring内部-成员实例注入(inject)澄清

转载 作者:行者123 更新时间:2023-12-01 13:00:19 27 4
gpt4 key购买 nike

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

@Component
public class NewsService implements Service{
}

但是Spring如何注入(inject)成员变量呢?即

@Autowired
private EntityManager em;

Java动态代理使用接口(interface)(即服务)来创建对象。但是成员变量是如何注入(inject)的呢? 接口(interface)无法识别实例变量。

当成员实例被注入(inject)时?加载时间?(当创建包含类对象时?)还是延迟加载? (什么时候首先使用对象?)

最佳答案

为您提供的一些事实:

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

依赖注入(inject)是如何实现的:

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

关于代理的一些知识:

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

关于java - Spring内部-成员实例注入(inject)澄清,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23565014/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com