繁体   English   中英

具有值的Spring autowire对象

[英]Spring autowire object with value

假设我有一个名为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;
}

这不行。 Spring如何知道SomeClass哪个实例


更新:

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

没有DI我在类ClassName的方法中创建了一个新对象

当使用DI时,我必须在类ClassName的方法中自动装配

@Autowired
ClassName className;

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

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

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

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

你是正确的,因为Spring不会自动知道所有类或创建所需的bean。 春天不像魔术一样有效。 我们可以使用注释,但我们仍然需要告诉Spring要创建哪些bean以及如何创建它们。 这就是在@Component@Service@Repository@Controller进场。 看看这里 当您希望SomeClass成为ClassName的依赖项时,您必须明确地让Spring知道SomeClass的bean需要先创建才能作为ClassName的依赖项注入,并且您可以通过使用正确的注释注释SomeClass来实现。 此外,您需要为Spring执行<context:component-scan base-package="com.your.package"/> ,以便在它可以自动装配依赖项之前正确解析所有注释。

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

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

你不能在Spring中使用new,所有东西都必须在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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM