java可以让一个bean类实例化内部的另一个类,我们是否应该/如何避免它?
假设bean在这里注册
@Configuration
public class configuration{
@Bean(name = "MyClass")
public MyClass getMyClass(@Value("avalue") final String s){
return new MyClass(s);
}
}
}
该类内部有另一个实例化的类,如下所示(这两个类都不需要注释?)
public class MyClass{
MyOtherClass myOtherClass;
public MyClass(String s){
this.myOtherClass = new MyOtherClass(s);
}
}
public class MyOtherClass{
String s;
public MyOtherClass(String s){
this.s = s;
}
}
这个机修工是怎么工作的?在bean注入中实例化新实例安全吗?这样做的优点或缺点是什么
如果我们也通过制作MyOtherClass a bean来避免使用它,这会是一种方式吗?(主要关注:@Autowired和getMyclass()是位置正确还是冗余?)
@Configuration
public class configuration{
@Bean(name = "MyOtherClass")
public MyOtherClass getMyOtherClass(@Value("avalue") final String s){
return new MyOtherClass(s);
}
}
@Bean(name = "MyClass")
public MyClass getMyClass(MyClass myClass){
//I was told the input should be myClass not myOtherClass,
//and the return is myClass not new MyClass(myOtherClass);
//since it's already autowired. Is that correct?
//What if the configuration.java and MyClass.java are in different project?
return myClass;
}
}
}
@Component
public class MyClass{
MyOtherClass myOtherClass;
@Autowired
public MyClass(MyOtherClass myOtherClass){
this.myOtherClass = myOtherClass;
}
}
public class MyOtherClass{
String s;
public MyOtherClass(String s){
this.s = s;
}
}
# 1 楼答案
在bean注入中实例化新实例是否安全
对。但是,这个新实例不是由Spring管理的。(如果这是显而易见的,那么很抱歉。)
但也许更重要的是,这与Spring无关:
很难进行单元测试,因为没有简单的方法来模拟
myOtherClass
仍然与Spring无关,重构以使用IoC来简化单元测试:
并将该类配置为Springbean,但不将
MyOtherClass
也配置为bean:您发布的关于@Component和@Autowire的内容会起作用,但听起来好像您希望避免将
MyOtherClass
作为bean公开# 2 楼答案
如果不想公开
MyOtherClass
并控制其实例的创建,可以使用第一种方法:它是安全的,但它不是依赖项注入:
MyOtherClass
不是由Spring管理的,因此您将无法使用@Autowired
将它注入其他bean,或者将其他Spring管理的类注入MyOtherClass
。此外,正如Andrew所提到的,模拟MyOtherClass
变得不可能如果在Spring上下文中将
MyOtherClass
注册为bean是可以的,那么最简单的方法就是用@Component
注释这两个类,并让Spring完成它的工作(在这种情况下,您应该使用@ComponentScan
来帮助Spring自动检测您的类):或者,使用
@Bean
(如果Config.java
和MyClass.java
在不同的项目中,这将起作用):注意:如果您已经在Spring上下文中使用
那你就不必再这样做了