我知道如何单独使用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文件
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<context:component-scan base-package="com.fb.common" />
<!--
<bean id="person" class="com.fb.common.Person">
<constructor-arg type="java.lang.String" value="DefaultName"/>
<constructor-arg type="int" value="30"/>
</bean>
-->
</beans>
答案 0 :(得分:3)
您可以执行以下操作
@Inject // or @Autowired
public Person(@Value("DefaultName") String name, @Value("30") int age){
this.name=name;
this.age=age;
}
根据Bozho的回答here,春天对构造函数注入感到皱眉。也许你不应该这样做。
对于您的问题的评论,它应该在
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${org.springframework-version}</version>
</dependency>
对于@Inject
,您需要
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
但你可以使用Spring提供的@Autowired
。
答案 1 :(得分:3)
您需要将@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。
答案 2 :(得分:0)
如果启用了组件扫描,spring将尝试创建一个bean,即使已经在spring config xml中定义了该类的bean。但是,如果spring配置文件中定义的bean和自动发现的bean具有相同的名称,则spring在进行组件扫描时不会创建新的bean。如果bean没有no-args构造函数,则至少有一个构造函数必须自动连接。如果没有构造函数是自动连接的,spring将尝试使用默认的no-args构造函数创建一个对象。您可以在here
找到有关此主题的更多信息