与主题类似。我认为这些方法之间没有任何区别。 当我仅使用原型bean时,原型bean就很清楚。但是在春季,我们基于单例的bean,因此当我在单例bean中使用具有范围原型的bean时,看起来就像我要创建新的Object一样。
@Service
public class SomeService{
@Autowired
private ApplicationContext applicationContext;
public void someClass() {
PrototypeObject prototypeObject = applicationContext.getBean(PrototypeObject .class);
PrototypeObject prototypeObject = new PrototypeObject();
}
}
这两种方法之间有区别吗?
对我来说最好的 answer 是: 我失去了IoC的任何优势。
答案 0 :(得分:1)
它们是完全不同的。
Spring Managed Beans :无论何时使用@Bean创建一个bean或使用 @ Inject / @ Autowired它们处于Spring上下文中,并且可以执行与Spring相关的功能,或者可以从应用程序Context中获取它(尽管不建议这样做,因为它不利于控制反转)。
非Spring Managed Beans :无论何时使用新创建的bean,它们都会移出Spring上下文,并且不再可以在Spring Managed Context中使用。
使用new创建的对象不知道任何Spring注释和相关功能。
答案 1 :(得分:1)
让我们以众所周知的“ Singleton”开始
默认情况下,春季所有豆都是单例的,这意味着只有一个副本存在多个引用
有趣的第二个“原型”
每次从容器请求原型作用域时,它都会返回一个差异实例,因此在春季,如果每次将任何bean作为原型都将获得带有该bean自动装配属性的另一个实例
第三个带有“ new”关键字的
这将返回新对象,具有默认值或null的属性,这也是未在spring Application上下文中注册的对象