0

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

客户端.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;

我在这里面临2个问题

  1. 我无法访问 streamSet,因为它是私有的。

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);
                }
            }*/
        }
    }
4

1 回答 1

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。Client 不是 Spring bean,您可以使用new Client(). Spring 完全不知道这个类和它的实例化,所以它不能将任何对象注入到这个 Client 实例中。

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

StreamingThread streamingThread = applicationContext.getBean(StreamingThread.class);
于 2013-08-02T06:04:46.707 回答