具有值的Spring autowire对象

时间:2016-05-09 07:53:14

标签: java spring

假设我有一个名为SomeClass的类,它在构造函数中获取值并填充该字段。

String text;
String sometext;

public someClass(String text, String sometext){
this.text = text;
this.sometext = sometext;
}

SomeClass有一个创建新对象的方法。在java中,当我们创建一个新对象时,我们可以使用像

这样的值进行实例化
ClassName variable = new ClassName(text, sometext);

并使用构造函数

填充ClassName中的字段
public ClassName(String text, String sometext){
this.text = text;
this.sometext = sometext;
}

但是在春天使用自动装配我们怎么能这样做?

@Autowired
public ClassName(SomeClass someClass){
this.text = someClass.text;
this.sometext = someClass.sometext;
}

这不行。春天将如何知道SomeClass

的实例

更新

我错了。我不是在想DI。而不是自动装配SomeClass。我不得不自动装载ClassName

没有DI我在类ClassName

的方法中创建了一个新对象

使用DI时,我必须使用类ClassName

的方法进行自动装配
@Autowired
ClassName className;

我可以直接填充字段使字段公开

className.text = text;
className.sometext = sometext;

我可以使用javabeans。 但是如何通过构造函数来完成。

注意:spring配置没有任何问题。基本扫描已启用。

2 个答案:

答案 0 :(得分:2)

你是对的,因为Spring不会自动知道所有类或创建所需的bean。春天不像魔术一样有效。我们可以使用注释但我们仍然需要告诉Spring要创建哪些bean以及如何创建它们。这就是@Component@Service@Repository@Controller发挥作用的地方。看看here。如果希望SomeClass成为ClassName中的依赖项,则必须明确让Spring知道需要创建SomeClass的bean才能将其作为依赖项注入ClassName 1}},你可以通过使用正确的注释注释SomeClass来实现。此外,您需要为Spring执行<context:component-scan base-package="com.your.package"/>以正确解析所有注释,然后才能自动连接依赖项。

此外,您必须意识到如果您的SomeClass构造函数参数依赖于动态值,您将无法立即创建bean,并且您将无法将其注入使用ClassName@Autowired中的依赖关系,因为spring需要在部署期间知道这些值。如果是这种情况,我更倾向于在ClassName中使用 getter setter 方法来获取SomeClass的实例。

注意:这个答案正在考虑Spring中的注释。您也可以通过在XML中定义Spring Beans来做同样的事情。

答案 1 :(得分:1)

你不能在Spring中使用new,所有东西都必须在spring上下文中创建。在您的示例中,您的spring配置将是

<?xml version="1.0" encoding="UTF-8"?>
<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.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <bean class="SomeClass">
        <constructor-arg index="0" name="text" value="some value" />
        <constructor-arg index="1" name="sometext" value="some other value" />
    </bean>

</beans>

你的代码应该是

@Autowired
private SomeClass someClass;