我对弹簧注射有疑问。
基础教程告诉我们应该创建一个上下文来获取bean:
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
但是,如果我在每个类中创建一个上下文,我可以从这些上下文中获取的bean包含不同的实例。 e.g。
public class MyClass1 {
public void myMethod() {
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
MyBean myBean1 = (MyBean)context.getBean("myBean");
}
}
public class MyClass2 {
public void myMethod() {
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
MyBean myBean2 = (MyBean)context.getBean("myBean");
}
}
这里,myBean1和myBean2是两个不同的对象,尽管它应该是一个单例。
使用上下文的正确方法是什么,这样我才能保证只创建一个整个系统用来获取bean的上下文?
有没有办法使用像Google Guice这样的Spring,它使用注释来解决依赖注入问题?
非常感谢。
答案 0 :(得分:0)
你可以随时使用注释@Autowired来标记这是你要在课堂上注入的bean
答案 1 :(得分:0)
使用上下文的正确方法是什么,这样我才能保证只创建一个整个系统用来获取bean的上下文?
只调用一次WhateverApplicationContext的构造函数...
有没有办法使用像Google Guice这样的Spring,它使用注释来解决依赖注入问题?
当然有。它在春季参考手册的以下部分中有记录:
您甚至可以像使用Guice或CDI一样使用相同的注释注释:
答案 2 :(得分:0)
启动一次上下文,如果你想在你的类实现ApplicationContextAware中使用它。
public Class1 implement ApplicationContextAware{
private ApplicationContext context;
private void setApplicationContext(ApplicationContext applicationContext) {
this.context = applicationContext;
}
在上下文启动后将自动调用该方法。
答案 3 :(得分:0)
你不应该自己使用Spring的ApplicationContext
来设置你的应用程序。你应该让Spring的ApplicationContext
为你设置应用程序。
常见的模式是在应用程序的启动点实例化ApplicationContext
,无论是main()
方法还是ServletContextListener
(Spring MVC)。您在上下文中声明bean以及它们之间的关系,例如注入目标。您永远不会在同一个应用程序中两次初始化相同的上下文。
答案 4 :(得分:0)
为什么不制作一个单独的类并创建一个以bean名称作为参数的方法,你可以从上下文中获取bean并返回它。因此,您将获得相同的实例,因为您不会一次又一次地加载弹簧配置文件。