使用构造函数注入进行Spring Auto Components扫描

我知道如何单独使用Auto Components Scanning和Consctuctor Injection。 http://www.mkyong.com/spring/spring-auto-scanning-components/ http://www.dzone.com/tutorials/java/spring/spring-bean-constructor-injection-1.html

是否可以将AutoComponent Scanning与构造函数注入一起使用? 使用自动组件扫描弹簧框架扫描时,所有类都指向"base-package"并通过调用每个没有参数的构造函数来创建每个类的实例。 让我们说如何修改以下类和相关的spring XML文件。

 package com.fb.common; @Repository public class Person { private String name; private int age; public Person(String name, int age){ this.name=name; this.age=age; } public String toString(){ return "Name: "+name+" Age:"+age; } } 

XML文件

   <!--     -->  

您可以执行以下操作

 @Inject // or @Autowired public Person(@Value("DefaultName") String name, @Value("30") int age){ this.name=name; this.age=age; } 

根据Bozho 在这里的回答, spring在构造函数注入时皱眉 。 也许你不应该这样做。

对于你的问题的评论,它应该在

  org.springframework spring-context ${org.springframework-version}  

对于@Inject ,你需要

  javax.inject javax.inject 1  

但你可以使用Spring提供的@Autowired

您需要将@Value注释添加到每个构造函数参数中

 public Person(@Value("DefaultName")String name, @Value("30")int age){ this.name=name; this.age=age; } 

您可以使用属性占位符来引用属性文件中定义的属性,而不是对值进行硬编码。

 public Person(@Value("${person.defaultName}")String name, @Value("${person.age}")int age){ this.name=name; this.age=age; } 

像Person(实体值对象)这样的类通常不会被创建为spring bean。

如果启用了组件扫描,spring将尝试创建一个bean,即使已经在spring config xml中定义了该类的bean。 但是,如果spring配置文件中定义的bean和自动发现的bean具有相同的名称,则spring在进行组件扫描时不会创建新的bean。 如果bean没有no-args构造函数,则至少有一个构造函数必须自动连接。 如果没有构造函数是自动连接的,spring将尝试使用默认的no-args构造函数创建一个对象。 您可以在此处找到有关此主题的更多信息