[英]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.