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