プロジェクトに取り組んでいるときは、リスナーを使用してスプリング構成ファイルを取得し、必要な豆を取り出します。たとえば、Webサイトのホームページを作成します。製品のバックグラウンドビジネスロジックがうまく行われていると仮定すると、リスナーを作成し、プロジェクトの起動時にホームページデータを照会してアプリケーションに入力する必要があります。つまり、リスナーのバックグラウンド製品ビジネスロジックを呼び出す方法、つまりリスナーで春に構成された対応する豆を取得する必要があります。最初にリスナーを作成します:
1. initdatalistenerを作成します
リスナーinitdatalistenerを作成しますservletcontextListenerを継承します。
/** * @description:todo(プロジェクトの開始時にデータを初期化するために使用) Tomcatによってインスタンス化され、春にインスタンス化されていません。春の公開クラスに置くことはできませんinitdatalistener exmments servletcontextlistener {private productervice productservice = null; // productserviceは、製品@Override void contextDestroyedに関連するビジネスロジックを定義します(servletcontexteventイベント){} @Override public contextializatializatializatializatializatializeweb.xmlでリスナーを構成します:
上記のように、製品のいくつかのビジネスロジックはProductserviceで定義されており、このProductserviceは管理のためにSpringに引き渡されます。では、このオブジェクトをどのように取得できますか?最初に確信するのは、自分でそれを取り出すことはできないことです。なぜなら、それが出てくると、SpringのIOCとは何の関係もないからです。それを達成するための3つの主な方法があります。 1つずつ分析し、最終的に利点と短所を比較します。
2。Beans.xmlファイルを直接ロードします
この方法はシンプルで粗雑です。構成ファイルをロードする必要はありませんか?わかりました、私はそれをロードします、次のように:
//@component //リスナーはWebレイヤーのコンポーネントです。春ではなく、Tomcatによってインスタンス化されています。春の公開クラスに置くことはできませんinitdatalistener servletcontextlistener {private productservice productservice = null; // Productervice製品に関連するビジネスロジック@Override public void contextdestroyed(servletcontextevent event){} @override public void contextInitialized(servletcontexteventイベント){//ビジネスロジッククラス製品Query Query Query Query Information Applicationアプリケーション情報コンテキスト=新しいClassPathxMlapplicationContext Productservice =(Productservice)Context.getBean( "Productervice"); System.out.println(Productservice); //出力するかどうかを確認するための//次のものは特定のProductservice関連操作です...}}この方法は完全に問題あり、アイデアは非常に明確です。最初に構成ファイルBeans.xmlをロードしてから、Beanを取得します。ただし、Tomcatを開始した後、コンソールからの情報出力を見てみましょう。
この時点で、この方法の欠点を見つける必要があります。構成ファイルは2回ロードされたため、これらの豆が2回インスタンス化されました。印刷された情報から判断すると、構成ファイルを自分でロードし、インスタンス化された豆を手に入れました。この方法は明らかに望ましくありません。
3。servletcontextから取得します
上記の方法から、少なくともSpringがリスナーを通じて構成ファイルを1回ロードしたことを知ることができます。もう一度ロードする必要はありません。 Springがどこにロードされているかを知っていれば、そこから構成ファイルを取得できると考えるのは簡単です。春に構成ファイルをロードするプロセスを見てみましょう。
上記の図(無関係なコードは省略されています)では、contextloaderListenerはWeb.xmlで構成したスプリングリスナーです。また、ServletContextListenerを実装し、コンテキストローダーを継承します。リスナーでは、構成ファイルは主にinitWebApplicationContextメソッドを介して取得され、WebApplicationContextオブジェクトを作成します。 initWeBapplicationContextメソッドでは、2つの主なことが行われます。1つはスプリングコンテキストを取得することであり、もう1つはスプリングコンテキストをservletContextに入れることです。キーは、webapplicationcontext.root_web_applicate_context_attributeです。では、どのようにして春のコンテキストを取得しますか? web.xmlで構成されたスプリングのパスを取得することです。 config_location_parmは実際には文字列定数であり、これはWeb.xmlで次の設定されたスプリングリスナーです。
<context-param> <param-name> contextconfiglocation </param-name> <! - config_location_parmはcontextconfiglocation-> <param-value> classpath:beans.xml </param-value> </context-param>
したがって、Web.xmlで構成されたパスを介してBeans.xmlを取得し、この構成ファイルをロードしてBeanをインスタンス化することは明らかです。
Springが構成ファイルを読み込んでServletContextに配置した後、ここに行き、直接入手できることがわかったので!
//@component //リスナーはWebレイヤーのコンポーネントです。春ではなく、Tomcatによってインスタンス化されています。春の公開クラスに置くことはできませんinitdatalistener servletcontextlistener {private productservice productservice = null; @Override public void contextDestroyed(servletContextevent Event){// todo auto-denerated method stub} @override public void contextInitialized(servletcontextexteventイベント){//ビジネスロジッククエリ製品情報を取得//ソリューション2:プロジェクトが開始されると、スプリングリスナーを介してスプリングの構成が開始されます。 ServletContextで取得する必要があります。 ApproachContext Context =(ApproachContext)Event.getServletContext().GetAttribute(webApplicationContext.Root_Web_Application_Context_attribute); Productservice =(Productservice)Context.getBean( "Productervice"); System.out.println(Productservice); }}このようにして、生産者サービスのインスタンス化されたオブジェクトを取得できます。この方法は良好ですが、getattributeのパラメーターは長すぎます。その時点でプログラマーの額が切り取られていたかどうかはわかりません。私は彼が他のより適切な名前を考えることができなかったと思います〜
4。Spring<Br />によって提供されるツールクラスを読み込むことで、 Springを開発した大物もこのパラメーターの名前が長すぎることに気付いたため、構成ファイルをロードできるメソッドクラスを提供しました。
パブリッククラスinitdatalistenerは、servletcontextListener {private productservice productservice = null; @Override public void contextDestroyed(servletContextevent Event){// Todo auto-enerated method stub} @override public contextInitialized(servletcontextextevent event){//ビジネスロジッククエリ製品情報情報webApplicationcontext context = webapplicextutils.getwebapplicedcontext( Productservice =(Productservice)Context.getBean( "Productervice"); System.out.println(Productservice); }}実際、ここのgetWebApplicationContextメソッドは、上記の方法をカプセル化するだけです。この方法のソースコードを見てみましょう。
public Static WebApplicationContext getWebApplicationContext(servletContext sc){return getWebApplicationContext(sc、webapplicationContext.root_web_application_context_attribute); }これは、プログラマーが呼び出す方が便利です。それがすべてです...したがって、通常、3番目の方法を使用してSpringの構成ファイルを取得し、それによって対応するインスタンス化されたBeanを取得します。
オリジナルリンク:http://blog.csdn.net/eson_15/article/details/51373937
上記は、iPhone 6splus Wechatクラッシュの解決策です。私はそれが誰にでも役立つことを願っています。また、誰もがwulin.comをサポートし、wulin.comのよりエキサイティングなコンテンツにもっと注意を払うことを願っています。