如何在不创建多个bean id的情况下访问该类的同一实例

时间:2013-08-02 05:57:46

标签: spring inversion-of-control

我是Spring的新手,我目前正在使用Spring IOC的项目。 这是我的应用程序的当前设置,我试图表示为独立 下面的类在服务器启动期间作为进程启动

Client.java

public final class Client {
    public static void main(String[] args) {
        try {
            ApplicationContext ctx = new ClassPathXmlApplicationContext("context.xml");
            String[] beans = ctx.getBeanDefinitionNames();
            for (String string : beans) {
                System.out.println(beans);
            }
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }
}

context.xml





      <!-- <context:component-scan base-package="com.tradeking" /> -->
       <context:annotation-config />



    <bean id="stream-core" class="com.StreamHandler" scope="singleton" init-method="init">
          <constructor-arg>
             <ref bean="streamingthread"/>
          </constructor-arg>
           </bean>

          <bean id="streamingthread" class="com.StreamingThread" scope="singleton" >
           </bean>

         </beans>

StreamHandler.java

package com;
    public class StreamHandler {
    private StreamingThread streamThread;
    public StreamHandler(StreamingThread streamThread) {
        this.streamThread = streamThread;
    }
    public void init() {
        this.streamThread.start();
    }
}

StreamingThread.java

   package com;
    import java.util.HashSet;
    import java.util.Set;
    public class StreamingThread extends Thread {
        private Set<String> streamSet = new HashSet();
        public void run() {
            while (true) {
                for (int i = 0; i < 12; i++) {
                    streamSet.add("Test" + 1);
                    System.out.println("Run Called");
                }
            }
        }
    }

现在我的问题是,我有另一个名为UbscHandler的类,我需要访问StreamingThread类中存在的streamSet

所以我试过这种方式

在context.xml文件中添加了一个bean id,如图所示

<context:annotation-config />
     <bean id="streamingthreadnew" class="com.StreamingThread" scope="singleton" > 


        @Autowired
        @Qualifier("streamingthreadnew")
        private StreamingThread sThread;

我在这里面临两个问题

  1. 我无法访问streamSet,因为它是私有的。
  2. 2.我可以使用Spring样式访问该特定类,而不是再创建一个bean id。

    已编辑的部分

    现在我正在

     Hi Streamed Thread Called0
    java.lang.NullPointerException
        at com.Client.anotherMethod(Client.java:33)
        at com.Client.main(Client.java:26)
    

    这是我的context.xml

                                   

      <bean id="streamingthread" class="com.StreamingThread" scope="singleton" >
       </bean>
    
     </beans>
    
    
    
        **This is StreamingThread**     
    
    
    
    
       package com;
    
        import java.util.Set;
    
        import org.springframework.beans.factory.annotation.Autowired;
        import org.springframework.beans.factory.annotation.Qualifier;
        import org.springframework.context.ApplicationContext;
        import org.springframework.context.support.ClassPathXmlApplicationContext;
        public  class Client{
            @Autowired
            @Qualifier("streamingthread")
            private StreamingThread streamingthread;
            public void run()
            {
                while(true)
                {
                }
            }
            public static void main(String[] args) {
                try {
                    ApplicationContext ctx = new ClassPathXmlApplicationContext("context.xml");
                    String[] beans = ctx.getBeanDefinitionNames();
                    for (String string : beans) {
                    }
                    Client c = new Client();
                    c.anotherMethod();
                } catch (Throwable t) {
                    t.printStackTrace();
                }
            }
            public void anotherMethod()
            {
                Set set = streamingthread.getData();
                System.out.println(set.size());
            }
        }
    

    这是我的StreaminThread类

       package com;
        import java.util.HashSet;
        import java.util.Set;
        public class StreamingThread extends Thread {
            int i=0;
            StreamingThread()
            {
                System.out.println("Hi Streamed Thread Called"+i);
            }
    
            private  Set<String> streamSet = new HashSet();
    
    
            public Set getData()
            {
                return streamSet;
            }
    
            public void run() {
                /*while (true) {
                    for (int i = 0; i < 12; i++) {
                        streamSet.add("Test" + 1);
                    //s System.out.println("Run Called"+i);
                    }
                }*/
            }
        }
    

1 个答案:

答案 0 :(得分:1)

如果要注入相同的对象,则不能定义另一个bean,而是使用相同的定义:

<beans>
    <bean id="stream-core" class="com.StreamHandler" scope="singleton" init-method="init">
        <constructor-arg><ref bean="streamingthread"/></constructor-arg>
    </bean>

    <bean id="streamingthread" class="com.StreamingThread" scope="singleton" />
</beans>

如果您希望可以访问某个字段,请在您的类中添加一个方法,以便您访问该字段。

编辑:

您只能将(自动装配)Spring bean注入到从应用程序上下文中获取的其他Spring bean中。客户端不是Spring bean,您可以使用new Client()获取它的实例。 Spring完全不知道这个类及其instanciation,因此它不能将任何对象注入此Client实例。

您必须从应用程序上下文中获取StreamingThread:

StreamingThread streamingThread = applicationContext.getBean(StreamingThread.class);