23

私は春のフレームワークが初めてで、それを学ぶためにいくつかのチュートリアルから始めました。

次のファイルがあります。

# MainProgram.java

package test.spring;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainProgram {
        public static void main(String[] args) {
              AbstractApplicationContext context = 
                              new ClassPathXmlApplicationContext("Bean.xml");     
              HelloSpring obj = (HelloSpring) context.getBean("helloSpring");
              obj.setMessage("My message");
              obj.getMessage();
              context.registerShutdownHook();

        }
 }

# HelloSpring.java

package test.spring;

public class HelloSpring   {
     private String message;

     public void setMessage(String message){
      this.message  = message;
      System.out.println("Inside setMessage");
   }

   public void getMessage(){
      System.out.println("Your Message : " + this.message);
   }

   public void xmlInit() {
    System.out.println("xml configured  initialize");
   } 

    public void xmlDestroy() {
    System.out.println("xml configured destroy");
    }

  }

# Bean.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

     <bean id="helloSpring" class="test.spring.HelloSpring" 
          scope="prototype" init-method="xmlInit" destroy-method="xmlDestroy">

     </bean>
     </beans>

scope="singleton" の出力は次のとおりです。

 xml configured  initialize
 Inside setMessage
 Your Message : My message
 xml configured destroy

scope="prototype" の出力は次のとおりです。

 xml configured  initialize
 Inside setMessage
 Your Message : My message

xmlDestroy()メソッドはsingletonスコープ Bean で呼び出されますがprototype 、次のことについて親切に助けてください。

これは正しいです?もしそうなら、考えられる理由は何ですか?

また、次のようなクエリもいくつかあります。

違いまたは関係は何ですか ApplicationContext , AbstractApplicationContext and ClassPathXmlApplicationContext

4

6 に答える 6

45

xmlDestroy()メソッドはシングルトン スコープ Bean で呼び出されますが、プロトタイプでは呼び出されません。

Spring は、プロトタイプ Bean の完全なライフサイクルを管理しません。コンテナーは、プロトタイプ オブジェクトをインスタンス化し、構成し、装飾し、その他の方法でアセンブルし、それをクライアントに渡します。その後、そのプロトタイプ インスタンスについてそれ以上の知識はありません。リソースを解放するには、カスタム Bean ポスト プロセッサを実装してみてください。

Spring コンテナーが完全なライフサイクルを管理するシングルトン Bean とは異なります。

異なるコンテキスト間の違いについては、この基本的なチュートリアルをご覧ください。

ドキュメントを参照

于 2013-02-23T12:37:34.223 に答える
2

これは予期される動作です。プロトタイプ スコープ Bean の使用がいつ終了したかを Spring が知る方法はないため、プロトタイプ スコープ Bean の Bean の破棄は Spring によって管理されません。ドキュメントから:

初期化ライフサイクル コールバック メソッドはスコープに関係なくすべてのオブジェクトで呼び出されますが、プロトタイプの場合、構成された破棄ライフサイクル コールバックは呼び出されません。

詳細については、Spring のドキュメントを参照してください。

sに関してはApplicationContext、用途に合わせてお選びいただけます。たとえば、XML または注釈 Bean 構成を使用するかどうか、およびサーブレット コンテナーで実行しているかどうかによって異なります。 ApplicationContextそれ自体が型階層のルートにあるインターフェースです。

于 2013-02-23T12:34:19.590 に答える
2

シングルトン Bean は、アプリケーション コンテキストにその Bean のインスタンスが 1 つだけ存在することを意味します。つまり、次のようなことをすると:

HelloSpring obj = (HelloSpring) context.getBean("helloSpring");
    obj.setMessage("My message");
    System.out.printIn(obj.getMessage());
    HelloSpring anotherObj = (HelloSpring) context.getBean("helloSpring");
    System.out.printIn(anotherObj.getMessage());

コンソール出力に「My message」が 2 回表示されます。

プロトタイプ Bean の場合、アプリケーション コンテキストからいずれかを取得しようとするたびに新しいインスタンスが取得されるため、上記のコードを再度実行すると、2 番目のコンソール出力は「null」になります。

コンテナーがプロトタイプ Bean の destroy メソッドを呼び出す必要がないため、呼び出しは行われず、動作は正しいです。

上記のクラスの違いは、それらがそれぞれインターフェース、抽象クラス、具象クラスであることです。その概念をよりよく理解するには、ここで Java の公式の Oracle ドキュメントを読むことをお勧めしますOracle Java Tutorials .

于 2013-02-23T12:38:30.560 に答える
-3

スプリング構成ファイルでスコープ タイプを確認してください。scope="prototype" の場合は、scope="singleton" に変更します

<bean id="helloWorld" class="com.example.test.HelloWorld"
init-method="init" destroy-method="destroy">
<property name="message" value="Hello World!" />

于 2015-10-25T11:20:25.223 に答える