Java @任意配置方法上的自动连线

Java @任意配置方法上的自动连线,java,spring,Java,Spring,在Spring参考指南中,它说您可以将@Autowired注释应用于具有任意名称和/或多个参数的方法,如以下代码所示 public class MovieRecommender { private MovieCatalog movieCatalog; private CustomerPreferenceDao customerPreferenceDao; @Autowired public void prepare(MovieCatalog movieCat

在Spring参考指南中,它说您可以将@Autowired注释应用于具有任意名称和/或多个参数的方法,如以下代码所示

public class MovieRecommender {

    private MovieCatalog movieCatalog;

    private CustomerPreferenceDao customerPreferenceDao;

    @Autowired
    public void prepare(MovieCatalog movieCatalog,
            CustomerPreferenceDao customerPreferenceDao) {
        this.movieCatalog = movieCatalog;
        this.customerPreferenceDao = customerPreferenceDao;
    }

    // ...

}

但是Spring容器不会调用prepare()方法,因为它不是setter方法。@Autowired在这种情况下是如何工作的

它并没有说您可以使用@Autowired实现它所说的任何方法

配置方法可以有任意名称和任意数量的参数;这些参数中的每一个都将与Spring容器中的匹配bean自动关联



无论方法名是什么,@Autowired将在spring上下文初始化期间尝试获取自动连接

注释
@Autowired
并不真正关心您使用的方法名。因此,像
prepare
这样的方法名与沿着
setMovieCatalog
行的方法名一样有效

此外,Spring还使用
@Autowired
处理方法中的多个参数。这通常用于基于构造函数的注入,但对于其他方法(如
prepare
-method)效果很好

那么,要使这项工作发挥作用需要什么呢?首先,该方法的参数必须是Spring上下文已知的bean。这意味着Bean必须在XML上下文中连接,并用
@组件
@配置
类中的
@Bean
进行注释。其次,保存
@Autowired
方法的类也必须是Spring上下文已知的bean


如果上述两项都得到满足,则自动连线将按预期工作。它可以在任何实例方法上使用,无论名称如何。

为什么这不是setter方法?因此,在初始化过程中,容器将调用带有
@Autowired
注释的任何方法,对吗?它不需要是setter方法或构造函数方法,您是对的。只要您已经初始化了bean,并与方法参数中给定的类匹配,它就可以工作。
<beans>
<bean id="myBean" class="..." init-method="prepare"/>
</beans>