Spring框架如何自动装配集合

时间:2016-06-20 05:18:06

标签: java spring annotations autowired

我从未见过自动收集的集合:

    @Around("execution(public void getPersonCount())")
    public void thirdAdvice(final ProceedingJoinPoint joinPoint) throws Throwable
    {
        final int numberOfArguments = joinPoint.getArgs().length;
        final String functionName = joinPoint.getSignature().getName();
        System.out.println("Number of arguments = " + numberOfArguments);
        System.out.println("Function name = " + functionName);
        joinPoint.proceed();
    }

在init()方法中,我可以看到foos已经有几个条目了。我猜Spring知道谁应该成为foos的入口。但是,怎么样?如果我想将Foo对象添加到foos中,我该怎么办?需要在属性文件中配置,还是任何其他想法?

2 个答案:

答案 0 :(得分:5)

Spring的BeanFactory基本上是bean的注册表。这些bean可以使用XML声明,也可以使用Configuration类中的@Bean - 带注释的方法声明,或者使用包扫描自动发现。

当你要求List<Foo>时,Spring会找到所有类型为Foo的bean,创建一个包含这些bean的List,并注入该列表。

documentation about Autowired解释了它,BTW:

  

通过将注释添加到需要该类型数组的字段或方法,也可以从ApplicationContext提供特定类型的所有bean

答案 1 :(得分:0)

在init()方法中,我可以看到foos已经有几个条目。我想Spring知道谁应该是foos的入口。但是,如何?

在创建应用程序上下文/ Bean工厂时,默认情况下为(如果未另行指定,则使用惰性初始化或非单例作用域),还将创建所有Bean。 应用上下文了解这些bean 。因此,当我们尝试@Autowireprivate List<Foo> foos;之类的特定类型bean的集合时,Spring会找到所有foo,将它们添加到列表中并注入到依赖bean中。

如果我要将Foo对象添加到foos中该怎么办?是否需要在属性文件或其他任何想法中进行配置?

有多种方法可以做到这一点。可以根据需要选择一个合适的选项。

  • 在bean 配置XML文件中声明bean。灵活。但是您可能不喜欢使用XML进行操作。
  • 豆类上的
  • @Component注释。 Spring将在配置了组件扫描的情况下扫描该类。没有XML,但灵活性较差。 Bean类的定义和声明紧密耦合。无法在其他@Component中创建Application Context bean。
  • 在方法上的
  • @Bean批注,该批注将在 @Configuration带注释的类中返回bean。最好。 Bean类的定义和声明仅通过批注解耦并完成。我们也可以通过不同的@Bean中的方法创建Application Context带注释的bean。