【问题标题】:Spring autowire object with value具有值的弹簧自动装配对象
【发布时间】:2016-09-03 18:28:56
【问题描述】:

假设我有一个名为 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 配置没有任何问题。基础扫描已启用。

【问题讨论】:

    标签: java spring


    【解决方案1】:

    你不能在 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;
    

    【讨论】:

    • text 和 sometext 不是值。它们是字符串变量
    • 这个答案有错误的代码 sn-p。应该是&lt;constructor-arg index="0" name="text" value="some value" /&gt;
    • 同意上面2个cmets,我的回答有点快。
    【解决方案2】:

    您是对的,Spring 不会自动知道所有类或创建所需的 bean。春天并不像魔术一样工作。我们可以使用注解,但我们仍然需要告诉 Spring 要创建哪些 bean 以及如何创建它们。这就是@Component@Service@Repository@Controller 发挥作用的地方。看看here。当您希望SomeClass 成为ClassName 中的依赖项时,您必须明确让Spring 知道需要创建SomeClass 的bean,然后才能将其作为ClassName 中的依赖项注入,然后您就这样做了通过使用正确的注释注释SomeClass。您还需要为 Spring 执行 &lt;context:component-scan base-package="com.your.package"/&gt; 以正确解析所有注释,然后才能自动装配依赖项。

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

    注意:这是考虑到 Spring 中的注释的答案。您也可以通过在 XML 中定义 Spring Beans 来做到这一点。

    【讨论】:

    • 所以你是说我不能通过构造函数使用自动装配插入动态值?
    • @user2471976 是的,你根本不能这样做。 Spring 需要在部署时知道任何构造函数参数值,因为只有在正确创建所有 bean 时才部署应用程序。查看thisthis 的帖子。对于这种情况,您最好的选择是 getter setter 方法,就像我在回答中提到的那样。
    • 感谢您的快速回复。
    猜你喜欢
    • 1970-01-01
    • 2012-10-18
    • 2014-07-08
    • 2016-09-27
    • 1970-01-01
    • 1970-01-01
    • 2019-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多