有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

具有值的java Spring autowire对象

假设我有一个名为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。我不得不自动连线

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

使用DI时,我必须在类ClassName的方法中自动连线

@Autowired
ClassName className;

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

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

我可以使用javabeans但如何通过构造函数实现

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


共 (2) 个答案

  1. # 1 楼答案

    不能将new与Spring一起使用,所有内容都必须在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;
    
  2. # 2 楼答案

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

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

    注意:这是我们考虑的关于春季注释的答案。也可以通过在XML中定义Springbean来实现同样的功能