2016-04-20 11 views
0

私を助けてください 私は新しいspring mvcユーザーです。コントローラでは、私はそのようなシングルトン豆呼び出す:spring mvc bean scope singletonが正しく動作しないようです。

@RequestMapping(value = "/student", method = RequestMethod.GET) 
public ModelAndView student(@RequestParam(required = false) String name) { 
    ApplicationContext context = 
      new ClassPathXmlApplicationContext(new String[] { "mvc-dispatcher-servlet.xml" }); 
    Student student = (Student) context.getBean("student"); 
    if (name != null && name.length() > 1) { 
     student.setName(name); 
    } 
    System.out.println("name:" + student.getName()); 
    return new ModelAndView("result", "student", student); 
} 

初めて、私はブラウザにURLを入力してください:http://localhost:8080/example/student?name=myname そのようなシステムの印刷結果:名:MYNAME =>それは二度目

大丈夫です私はブラウザでurlを入力します:http://localhost:8080/example/student このようなシステムの印刷結果:name:null

なぜですか?リクエストごとに1つのBeanインスタンスが作成されると言っていますか? 初めて生徒の名前が設定されたのは「myname」です。もう一度リクエストすると、1回目のリクエストで設定されたため、1つのBeanインスタンスが作成された場合、学生の名前は「myname」でなければなりません。しかし、私の場合、2回目のリクエストでは、 Beanのインスタンスを作成する?だから、名前の値は

どうもありがとうございました

+0

私は削除する場合は、Webアプリケーション用の容器を春にあなたのxmlファイルを設定するには、このリンク "のApplicationContextコンテキスト= 新しいClassPathXmlApplicationContext(新しいString [] {" MVC-ディスパッチャ-servlet.xml」}) ; " "@Autowired private student student"を使用すると、リクエストごとに単一のBeanインスタンスが作成されます。何か案が? –

答えて

0

nullの春は、あなたが正確に何を求めているやっています。

ApplicationContext context = 
      new ClassPathXmlApplicationContext(new String[] { "mvc-dispatcher-servlet.xml" }); 

親のコンテキストの新しいインスタンスを作成しています。したがって、シングルトンスコープでBeanを取得することはできません。

使用、

@Autowiredプライベート学生学生

あなたはすべてのリクエストのコンテキストを作成していません。したがって、Beanはシングルトンスコープで作成されています。

0

シングルトンインスタンスは、BeanFactoryやApplicationContextのようなスプリングコンテナによってBeanの単一インスタンスのみが作成されることを意味します。

* .xml設定ファイルをBeanFactoryコンテナまたはApplicationContextコンテナに指定したときは、指定されたBean宣言を読み込み、デフォルトでシングルトンとしてインスタンス化します。

"/ student"へのリクエストごとに* .xmlをコンテナに指定しているため、 "/ student"インスタンスのすべてのリクエストが作成されます。

研究 http://docs.spring.io/autorepo/docs/spring/3.2.x/spring-framework-reference/html/mvc.html