具有值的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配置没有问题。基本扫描已启用
# 1 楼答案
不能将new与Spring一起使用,所有内容都必须在Spring上下文中创建。在你的例子中,你的spring配置是
你的密码是
# 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来实现同样的功能