【问题标题】:After setting up the bean in the xml, how to you instantiate the object?在xml中设置bean后,如何实例化对象?
【发布时间】:2010-01-26 19:30:31
【问题描述】:

在 xml 文件中连接好 bean 后,如何实例化对象?

是不是就像:

Myobject myObject = new MyObject();

幕后的弹簧会根据类型执行查找?

还是必须使用applicationContext?

【问题讨论】:

    标签: java spring dependency-injection


    【解决方案1】:

    我相信这就是你要找的 -> http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html#beans-factory-client

    基本上归结为getBean() 方法:

    MyObject obj = (MyObject) ctx.getBean("myObject");
    

    当然,在 web 上下文中,或者在其他一些环境中,您可能会从其他地方获取 ctx(spring 上下文),因此您不需要手动创建它。

    【讨论】:

      【解决方案2】:

      也可以通过获取应用上下文并调用getBean来获取对象:

      ApplicationContext appContext =
        WebApplicationContextUtils.getRequiredWebApplicationContext( servletContext );
      return appContext.getBean( beanName );
      

      您可以通过实现 ServletContextAware 并在您的代码中创建适当的设置器来获取您的 servlet 上下文。

      【讨论】:

      • 但我为什么要这样做,它太丑了?没有?
      • 有时你只知道在运行时你想要什么类。因此,使用此代码,您可以根据应用程序中的某些内容动态注入一个类。
      【解决方案3】:

      当您的应用程序服务器启动时,Spring 将为您进行实例化。并且还将“注入”你的类中的对象。

      因此,为了实现注入,您要么必须编写一个 setter 方法(一旦对象被实例化,Spring 就会调用该方法)

      public class MyClass{
          private MyObject myObject;
      
          public void setMyObject(MyObject _myObject){  //Spring will call this method
          this.myObject = _myObject;
          }
      }
      

      或者你可以有一个基于构造函数的注入

      public class MyClass{
          private MyObject myObject;
      
          public MyClass(MyObject _myObject){  //Spring will call this constructor
               this.myObject = _myObject
          }
      }
      

      编辑: 感谢您指出彼得 D

      在您的 XML 配置文件中,您必须执行以下操作:

      <bean name="myObject" class="mypackage.MyObject"/>
      
      <bean name="myClass" class="mypackage.MyClass">
        <property name="myObject" ref="myObject"/>
      </bean>
      

      希望这会有所帮助!

      【讨论】:

      • 仅当调用类被声明为服务或在 XML 配置中时添加 spring 才会自动注入。
      • 如何将其声明为服务?自动接线?
      • 如果你用 @Service 注释来注释你的类并且在你的 XML 中写 那么你将有基于注解的依赖注入。 :)
      【解决方案4】:

      按照你描述的方式,它行不通。 Spring 不会修改普通对象的创建方式。要使用 Spring 注入,即获取对 Spring bean 的引用,您可以:

      • 按名称从应用程序上下文对象中获取 bean
      • 让 Spring 使用 @Autowired 注释或自动自动装配来完成它的工作 :)
      • 在 xml 中显式配置注入

      总而言之,要得到一个bean,你不能创建它,而是让Spring把它交付给你。

      【讨论】:

        【解决方案5】:

        依赖注入的神奇之处在于您无需查找引用,尽管您可以通过编程方式完成。

        <bean name="myObject" class="x.y.MyObject"/>
        
        <bean name="anotherObject" class="x.y.Foo">
          <property name="myObjectProperty" ref="myObject"/>
        </bean>
        

        此外,您可以定义对象应该是“单例”还是原型(每个请求一个实例)。

        希望对你有帮助

        【讨论】:

        • 不完全正确。您当然可以在不编码的情况下完成所有 DI 的工作,但是在某些时候,您仍然需要访问“anotherObject”,并且必须通过对 BeanFactory 或 ApplicationContext 的 getBean 调用来检索它。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-24
        相关资源
        最近更新 更多