Spring学習ノート-Spring容器

14046 ワード

Spring容器は名前の通り、ものを入れるためのものです.Spring容器はビーンの作成、配置、管理を担当しています.Spring容器には二つのコアインターフェースがあります.BeanFactoryとAppplication Contectインターフェース、後者は前者のサブインターフェースです.SpringベースのJava EEプログラムでは、全てのコンポーネントをBeanとして処理しており、データソースオブジェクト、HibernatedのSession Factory、事務管理などを含み、プログラム中のjava類はすべてSpring容器中のBeanとして利用できます.
1.スプリング容器
Spring容器のコアインターフェースはBenFactoryであり、サブインターフェースはAppleicationContectである.Apple ContectはSpringコンテキストとも呼ばれる.
使用者はgetBen()法を使用するだけで、指定されたBeanの参照が得られる.ほとんどのJava EEプログラムに対して、Application ContextをSpring容器として使うのが便利です.その一般的な実装クラスは、FileSystemXlAppliation Contect、Class PathXml Appliation Contect、AnnotationConfigXml Appliation Contectがあります.Java WebでSpring容器を使用すると、Xml WebAppleication Conteet、AnnotationConfigWebAppliation Contectの2つのコンテナが通常あります.
Spring容器を作成する場合は、Spring容器管理のBeanのプロファイル、すなわちSpring Xmlのプロファイルを提供しなければなりません.したがって、BenFactoryを作成する際に、パラメータとしてプロファイルが導入されます.Xml設定ファイルは一般にResourceオブジェクトで入力されます.ResourceはSpringが提供するリソースアクセスインターフェースであり、このインターフェースSpringを通じてディスク、ネットワークシステム、およびクラスパスに簡単にアクセスできる.
独立したJava EEアプリケーションについては、BenFactoryを以下の方法で実装することができます.
//               
ApplicationContext appContext = new ClassPathXmlApplicationContext("beans_7_3_3.xml");
//           
appContext = new FileSystemXmlApplicationContext("D:\\spring-tool-workspace\\myspring\\src\\beans_7_3_3.xml");
//  chinese Bean,        Chinese
Person chinese = appContext.getBean("chinese", Chinese.class);
chinese.useAxe();
2.Application Contectを使う
ほとんどの場合、BenFactoryの例はSpring容器として使われず、Apple ContectをSpring容器として使用するので、Spring容器もSpringコンテキストと呼ばれています.Apple ContectはBenFactoryの機能を強化し、多くの有用で便利な開発機能を提供しています.Webでは、Contect Loaderのようなサポート類を利用して、Webアプリケーションが起動したときに自動的にApplication Comptextを作成することができます.BeanFactoryがサポートしているすべての機能を提供する以外に、Applicationは以下のような機能を提供しています.
  • Apple Contectは、デフォルトですべてのsingleton Beanを初期化し、構成によってキャンセルすることもできます.
  • Apple ContectはMessage Sourceインターフェースを継承していますので、国際化サポートを提供しています.
  • リソースアクセス、例えばURLとファイル.
  • 事件のメカニズム.
  • は、複数の構成ファイルを同時にロードする.
  • は音明式で起動し、Spring容器を作成する.Application ContectはBeanFactoryのすべての機能を含んでいます.いくつかの追加の供給を提供しています.一回は優先的にApplication Contectを使用することを提案します.いくつかのメモリに対してメモリの消費が気になる場合は、BeanFactoryを使うことを考えます.システムがAppleicationContectコンテナを作成すると、デフォルトでsingleton Beanを初期化し、デバイスを呼び出してビーンを作成する例を含み、要素駆動Springによってsetterを呼び出す方法で依存するオブジェクトを注入する.これは、システム初期作成Application Contectが大きなオーバーヘッドを有することを意味するが、初期化が完了すると、ビーン取得後のインスタンスがより良い性能を持つことになる.Application ContectをSpring容器として使用することを阻止するために、singleton Beanは元素にlazy-nit="true"属性を追加することができます.
  • 3.Application Contectの国際化サポート
    Apple ContectインターフェースはMessage Sourceインターフェースを継承していますので、国際化機能を備えています.String getMessage(String code,Object[]args,Locall loc)とStering getMessage(String code,Object[]args,String default,Locale loc)はMessage Sourceインターフェースが提供する国際化の2つの方法です.
    Spring国際化の支援は、Java国際化の基礎の上に成り立っています.その核心の構想はプログラムの中で国際化の情報を必要として資源のファイルに書き込んで、コードの中でただ国際化の情報の相応するKeyを使います.
    4.Application Contectのイベントメカニズム
    Application Contectのイベントメカニズムは、観察者デザインモードの実現である.Application EventとApplication Listerenインターフェースによって実現され、前者は観察者であり、後者は観察者である.Springイベントのフレームワークには二つのコアのインターフェースがあります.Appliation Event(イベント):Application Contextでリリースしなければなりません.Application Listener:このインターフェースを実現すれば、容器の中のモニターBeanを担当することができます.実際には、Springのイベントメカニズムとすべてのイベントメカニズムはほぼ同じである.イベント(Aplication Eventインターフェースを実現するクラス)、イベントソース(すなわちSpringコンテナであり、Javaコード表示のトリガがあります)、モニター(Appliation Listenerインターフェース実現クラス)です.これは私たちがページでブットオンをクリックしたようです.buttonはイベントソースです.クリックしたこの動作はイベントです.処理関数はモニターです.
    Springイベント機構をコードで実証した.
    /** *     Spring ApplicationContext  * @author hsoft3 * */
    public class EmailEvent extends ApplicationEvent {
    
        private String address;
        private String text;
    
        public EmailEvent(Object source){
            super(source);
        }
    
        public EmailEvent(Object source, String address, String text){
            super(source);
            this.address = address;
            this.text = text;
        }
    
        public String getAddress() {
            return address;
        }
        public void setAddress(String address) {
            this.address = address;
        }
        public String getText() {
            return text;
        }
        public void setText(String text) {
            this.text = text;
        }
    }
    
    /** *      Spring ApplicationListener  * @author hsoft3 * */
    public class EmailNotifier implements ApplicationListener<ApplicationEvent> {
    
        @Override
        public void onApplicationEvent(ApplicationEvent event) {
    
            //  EmailEvent  
            if(event instanceof EmailEvent){
                EmailEvent email = (EmailEvent)event;
                System.out.print(email.getAddress()+" "+email.getText());
            }else{
                //  Spring       
                System.out.println("    :"+event);
            }
        }
    
        public static void main(String [] args){
            ApplicationContext appContext = new ClassPathXmlApplicationContext("beans_7_4_4.xml");
            //EmailEvent emailEvent = new EmailEvent("test", "   ", "  ");
            EmailEvent emailEvent = appContext.getBean("emailEvent", EmailEvent.class);
            appContext.publishEvent(emailEvent);
        }
    
    }
    Springプロファイル:
            <bean class="com.ssh.zxy.chapter7_4_4.EmailNotifier"></bean>
            <bean id="emailEvent" class="com.ssh.zxy.chapter7_4_4.EmailEvent">
                <constructor-arg value="test"></constructor-arg>
                <constructor-arg value="[email protected]"></constructor-arg>
                <constructor-arg value="this is a test"></constructor-arg>
            </bean>
    上記のコードから分かるように、イベントモニターは私達のプログラムのトリガーのイベントを傍受しただけでなく、Spring容器内のイベントを傍受しました.実際の開発が必要であれば、Spring容器を初期化したり、廃棄したりする時にカスタム方法を調整して、上記のイベントモニター機構によって完成できます.Springは以下のいくつかの内蔵イベントを提供しています.
    5.ビームにSpring容器を取得させる
    いくつかの事例では、プログラムはApplication Contectを通じてSpring容器を作成し、Spring容器のget Bean()メソッドを呼び出して、Beanを獲得しています.この場合、プログラムは常にSpring容器の参照を持っています.しかし、Webアプリケーションでは、宣言式の方法でSpring容器を作成することができます.web.xmlファイルにリスニングディレクターを配置して、このリスニングクラスにSpring容器を作成してもらえます.フロントエンドMVCフレームは直接にBeanを呼び出すことができます.
    いくつかの特殊な場合には、Beanはある機能を実現する必要があります(例えば、Beanは国際的な情報を出力したり、Spring容器にイベントを発表したりする必要があります).これらの機能はすべてSpring容器によって完成されます.つまり、私たちはSpring容器を他のビームにもビームとして注入する必要があります.ただし、Spring容器Beanは容器レベルのBeanです.
    ビーンがその入れ物の引用を得るために、ビーンにビーンファクトリーAwareインターフェースを実現させることができます.このインターフェースは一つの方法しかないsetBenFactory方法で、方法のbeanFactoryパラメータはSpring容器を指し、Spring容器から注入されます.これを見て、私たちは奇妙な感じがします.ビーンでsetter方法を定義した後、通常は配置ファイルの中に要素を配置してSpring容器を駆動してビーンに依存する注入をしますが、ここではしていません.これはビーンがビーンFactoryインターフェースを実現すれば、Springがビーンを作成する時、Spring容器自体に自動的に注入されるからです.BenFactoryAwareインターフェースと似ているのはBeanNameAware、Resource Loader Awareインターフェースです.これらのインターフェースはいずれも似たようなsetter方法を提供しています.これらの方法はSpring容器から注入されます.
    この例では、PersonクラスのsayHi()方法が国際化メッセージを出力する例を示します.これはPersonがSpring容器を取得し、Spring容器を介して国際化を達成するために必要です.
            <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
                <property name="basenames">
                    <list>
                        <value>com/ssh/zxy/chapter7_4_5/messages/message</value>
                    </list>
                </property>
            </bean>
    
            <bean id="person" class="com.ssh.zxy.chapter7_4_5.Person"></bean>
    //     ApplicationContextAware     BeanFactoryAware  
    public class Person implements ApplicationContextAware {
    
        private ApplicationContext appContext;
    
        @Override
        public void setApplicationContext(ApplicationContext applicationContext)
                throws BeansException {
            this.appContext= applicationContext;
        }
    
        public void sayHi(String name){
            Locale locale = Locale.getDefault(Locale.Category.FORMAT);
            String myName = appContext.getMessage("name", new String[]{name}, locale);
            System.out.println(myName);
    
            myName = appContext.getMessage("name", new String[]{name}, Locale.US);
            System.out.println(myName);
    
        }
    
        public static void main(String [] args){
            System.out.print(Person.class.getClassLoader().getResource(".").getPath());
            ApplicationContext appContextMain = new ClassPathXmlApplicationContext("beans_7_4_5.xml");
            Person p = appContextMain.getBean("person", Person.class);
            p.sayHi("  ");
        }
    
    }
    
    メッセージzhCN.properties国際資源ファイル
    name=CH \u4F60\u597D,{0}
    メッセージenUS.properties国際資源ファイル
    name=US hi,{0}