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");
                }
            }
        }
    }

ここで私の質問は、私は StreamingThread クラス内に存在する streamSet にアクセスする必要がある UbscHandler という名前の別のクラスを持っているということです

だから私はこのようにしてみました

示されているように、context.xml ファイル内にもう 1 つの Bean ID を追加しました

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


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

ここで2つの問題に直面しています

  1. private であるため、streamSet にアクセスできません。

2. もう 1 つの Bean ID を作成する代わりに、Spring スタイルを使用してその特定のクラスにアクセスできます。

編集部分

今、私は得ています

 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 に答える