【问题标题】:Spring @Autowired for setter methods vs non-setter methodsSpring @Autowired 用于 setter 方法与非 setter 方法
【发布时间】:2015-07-23 04:09:04
【问题描述】:

根据@Autowired javadoc

将构造函数、字段、设置方法或配置方法标记为自动装配 通过 Spring 的依赖注入工具。只有一个构造函数(在 max) 任何给定的 bean 类都可以带有这个注解,表示 用作 Spring bean 时自动装配的构造函数。这样的构造函数 不必公开。字段在之后立即注入 在调用任何配置方法之前构建一个 bean。这样一个 配置字段不必是公开的。配置方法可能有 任意名称和任意数量的参数;这些论点中的每一个 将使用 Spring 容器中的匹配 bean 自动装配。

Bean 属性设置器方法实际上只是这种情况的一个特例 一般配置方法。这样的配置方法不必是公开的。 在多参数方法的情况下,“必需”参数是 适用于所有论点。如果是集合或地图 依赖类型,容器将自动装配所有匹配的bean 声明值类型。在 Map 的情况下,键必须声明为 类型 String 并将解析为相应的 bean 名称。笔记 实际注入是通过 BeanPostProcessor 执行的 反过来意味着您不能使用 @Autowired 将引用注入 BeanPostProcessor 或 BeanFactoryPostProcessor 类型。请咨询 AutowiredAnnotationBeanPostProcessor 类的 javadoc(其中, 默认情况下,检查是否存在此注释)。

我的问题是:

  1. 配置方法是什么意思?

  2. 另外,假设我有一个带有@Autowired 的setter 方法和一些带有@Autowired 的任意方法。我假设在bean实例化后spring会自动调用setter方法,而不会调用随机命名的@Autowired方法,对吗?

  3. Spring 如何理解在实例化(setter)之后应该调用哪个@Autowired 方法,而其他方法不应该?以及这与 javadoc 的声明有何关联,说:

Bean 属性设置方法实际上只是 这么通用的配置方法

最后一个问题:我在哪里可以阅读到它? 因为 Spring 文档没有任何相关信息,而且我无法在其 javadoc 中找到 spring 使用的确切逻辑。

【问题讨论】:

    标签: java spring


    【解决方案1】:

    @Autowired 注解可以与构造函数、setter 方法或任何其他方法一起使用。 每当 Spring 找到 @Autowired 注释时,它将尝试找到与方法参数匹配的 bean 并调用该方法。如果多个方法(setter或non-setter)有@Autowired注解,bean实例化后都会被Spring调用。

    【讨论】:

    • 我是否理解正确,每当 spring 在方法上看到“自动装配”时,它就必须在 bean 实例化后调用此方法。每当 spring 在字段上看到“autowired”时,都需要使用适当的 bean 初始化该属性。每当它在构造函数上看到“自动装配”时,它就必须调用这些构造函数中的至少一个。所以,基本上在我的初始声明中,我错了,在 bean 实例化之后不调用带有“autowired”注释的非 setter 方法。
    • 你中了靶心!!
    • dhblah 你对构造函数并不完全正确。只有一个构造函数可以带有@Autowired 注解。它在您附加的 javadoc 中指定。
    • @dhblah 在这里聚会有点晚了,但值得注意的是您指出的规则有一个例外。请注意,@Lazy 注释也可以与@Autowired 一起使用。例如,如果您将它与字段一起使用,则自动装配的字段和自动装配到该字段的 bean 都需要注释为惰性才能使其工作(我相信)。效果是 Spring 在 bean 实例化后实际上不会初始化该字段。可能它只会在第一次访问该字段时初始化。更多信息请看这里:baeldung.com/spring-lazy-annotation.
    【解决方案2】:

    配置方法是一种类似工厂的方法,在这种情况下会自动装配参数:

    @Autowired
    public SomeObject initSomeObject(Object1 o1, Object2 o2, ...) {
    

    @Autowired 仅确保 Spring 将(尝试)提供所需的参数。

    【讨论】:

      【解决方案3】:

      此上下文中的配置方法是指您将在init-method@PostConstruct 下指定的方法

      你已经知道的 Setter 就像 setXXX

      所以很明显,找出哪个是哪个是不难的。 同时注意spring不能根据参数名自动装配。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-08
        • 2011-07-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-14
        相关资源
        最近更新 更多