【読書ノート】「ライト級JavaEE企業応用実戦」(第八章)

11900 ワード

この章は主にSpringのAOPとSpringとHibernateとStrutsを含んでいます.
バックプロセッサ
ビーン後、プロセッサは、ビーンインスタンスの作成に成功した後、ビーンエンティティをさらに強化する処理を行う.Bean後プロセッサは、2つの方法postProcessor InitiazationとpostProcess Before Initializationを含み、それぞれが初期化後に実行と初期化の前に実行することを表し、以下は小さな例である.
package com.util;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;

public class MyProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        // TODO Auto-generated method stub
        System.out.println("Bean     postProcessAfterInitialization  ");
        System.out.println("beanName=" + beanName);
        return bean;
    }

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        // TODO Auto-generated method stub
        System.out.println("Bean     postProcessBeforeInitialization  ");
        System.out.println("beanName=" + beanName);
        return bean;
    }

}
このbeanの初期化方法をbeanタグのinit-methodに設定し、destory-methodでこのbeanの廃棄方法を設定することもできます.これらの方法はこのbeanに対応するクラスに書いてあります.
容器後プロセッサ
ビーンを作成するリアプロセッサ以外にもSpring容器のリアプロセッサを作成できます.ビーンFactoryPostProcessorインターフェースを実現するだけでいいです.その中にはpostProcessBenFactory方法があります.方法パラメータCofigrable Listable BenFactoryはSpring容器です.
属性のプレースホルダの設定
xmlファイルで使いたいです.propertiestファイルの内容は下記のコードをご覧ください.appication.xmlファイルに追加する
    
        
            
                classpath:dbconn.properties
            
        
    
    
    
    
その後srcフォルダの下でdbconn.propertiesを作成します.そのファイルの内容は
dataSource.driverClass = com.mysql.jdbc.Driver
dataSource.user = root
dataSource.password = root
dataSource.jdbcUrl = jdbc:mysql://localhost/spring
dataSource.maxPoolSize = 40
dataSource.minPoolSize = 2
dataSource.initialPoolSize=2
dataSource.maxIdleTime=30
Springの「ゼロプロファイル」サポート
xmlで構成したくないなら、annotationを使って、SpringでSpring Bern類を配置するいくつかのannotationを提供します.
  • @Component:普通のスプリングビーム
  • を表示します.
  • @Controller:コントローラのコンポーネントクラス
  • を表示します.
  • @Service:業務論理コンポーネント類を表示する
  • @Repository:DAOコンポーネント類は、これらのannotationを構成した後、appication.xmlファイルにを追加して、Spring自動検索のこれらのパケットの下のJavaクラスを指定し、注釈でBeanインスタンスを生成する必要があります.使う時に注意するのは
  • です.
  • @Componentは文字列タイプのパラメータを持ってbeanのid
  • として使用できます.
  • @Scopeは、「prototype」または他の範囲を持って、beanの使用範囲を指定することができます.
  • @Resource(name=「beanName」)は、依存関係を構成するために使用されてもよい
  • @PostConstructと@Predestroyはカスタムライフサイクルの動作を設定します.例えば、initとclose
  • @Lazyは、ブーメランタイプのパラメータを持つことができ、trueであれば、このビーン
  • を初期化しない.
  • @Dependown({beanName 1,beanName 2})は、bean 1とbean 2を強制的に初期化することができます.たとえbean 1、bean 2が@Lazy(true)
  • に設定されていても、
  • @Autowiredは自動的に組み立てるためのもので、beanのset方法に@Autowiredを入れたり、構造関数に加えたりして、パラメータが複数あっても大丈夫です.Springは自動的にタイプ別に適切なbeanを検索します.@Autowiredは正確にタイプ(汎型)を利用して自動組立を行うことができますが、もし二つの異なるbeanがあれば、彼らのタイプは同じです.この時、私達は@Qualfierを通してbeanのidを自動組立します.
  • リソースアクセス
    アクセスクラスのロードパスのリソース
    book.xmlファイルはsrcファイルの下に置いてあります.
            ClassPathResource resource = new ClassPathResource("book.xml");
            System.out.println(resource.getFilename());
            System.out.println(resource.getDescription());
            SAXReader reader = new SAXReader();
            Document document = reader.read(resource.getFile());
            Element root = document.getRootElement();
            System.out.println("root="+root.getText());
            List list = root.elements();
            for(int i = 0; i < list.size(); i++) {
                Element book = (Element) list.get(i);
                System.out.println(i+":"+book.getText());
            }
    
    ファイルシステムのリソースにアクセス
    book.xmlはWebContentフォルダと同じレベルにあります.
    FileSystemResource resource = new FileSystemResource("book.xml");
    
    ネットワークリソースにアクセス
    ネットワークリソースは、InputStreamストリームを使用してデータを読み込む必要があります.直接getFileの
                UrlResource resource = new      UrlResource("http://hxu0170466.my3w.com/book.xml");
            System.out.println(resource.getFilename());
            System.out.println(resource.getDescription());
            SAXReader reader = new SAXReader();
            Document document = reader.read(resource.getInputStream());
            Element root = document.getRootElement();
            System.out.println("root="+root.getText());
            List list = root.elements();
            for(int i = 0; i < list.size(); i++) {
                Element book = (Element) list.get(i);
                System.out.println(i+":"+book.getText());
            }
    
    同様に、Servlet ContactextResourceアクセスは、Servlet Contect経路に対するリソース、InputStreamResourceアクセス入力ストリームリソース、ByteArayResourceアクセスバイト配列リソースである.
    Resourceを属性とします.
    ビーンの中にあるファイルの内容を使用する必要がある場合、このビーンの中に自動的にResourceのインスタンスを注入して、ビーンを構成するタグにp:res="classpath:book.xml"を追加して、このビーンの中でクラスローディング経路の下のbook.xmlファイルの内容を取得することができます.
    Application Contectで資源を使う
    Resource r = applicationContext.getResource("book.xml")
    
    book.xmlのファイルの内容を得ることができます.これはappication Contectのアクセスポリシーで判定されます.appication Contectはclassit pathで作成されたものです.book.xmlはclassロード経路の下に置くべきです.
    SpringのAOP
    AOP(Asppect Orient Prograamming)とは、面に向かってプログラミングすることを意味します.オブジェクト指向プログラミングと比較すると、オブジェクト指向は静的な観点からプログラム構造を考え、面向けプログラミングは動的な観点からプログラムの実行過程を考えるということができます.
    なぜAOPが必要ですか
    AOPはソースコードを修正しない前提でシステムの機能を増やすことができます.OOPを使うだけであれば、あるモジュールにユーザーの合法的な検証を追加するには、検証が必要なクラスに検証コードを追加する必要があります.この種類が多いと修正が面倒です.この時、AOPを使う方式で新しい機能を追加できます.(ブロックも同じ効果があると思いますが)常にAOPを使って、横方向の性質を持つシステムレベルのサービスを処理しています.例えば、事物管理、安全検査、キャッシュ、対象プール管理などです.つまり、AOPが達成する効果は、プログラマがソースコードを修正しないという前提で、ビットシステムにおける業務コンポーネントの複数の業務方法に何らかの汎用的な機能を追加することを保証します.しかし、AOPの本質は、依然として業務コンポーネントの修正に行きます.複数の業務方法のソースコード――ただこの修正はAOPフレームで完成されます.プログラマではありません.
    AOPの基本概念
    AOPフレームの二つの特徴
  • 各ステップ間の良好な分離性
  • ソースコード無関係性
  • 面に向かってプログラミングするいくつかの用語
  • うどん(Asppect):うどんは複数のAdviceを組織するために使用され、Adviceはそばに置いて
  • を定義します.
  • 接続点(Joinpoint):プログラム実行中に明確な点、例えば、方法の呼び出しや異常な投げ出し.Spring AOPでは、接続点いつもメソッドの呼び出し
  • エンハンスメント処理(Advice):AOPフレームは特定のエントリポイントで実行されるエンハンスメント処理である.処理は「around」、「before」、「after」などのタイプ
  • である.
  • 切り込み点(Pointcut):拡張処理の接続点を挿入することができます.つまり、ある接続点が指定された要求を満たしている場合、この接続点は拡張処理が追加され、この接続点は切込み点になります.
  • は、処理されたクラスに方法またはフィールドを追加するために導入される.
  • ターゲット:AOPフレームにより強調処理されるオブジェクト.
  • AOPエージェント:AOPフレームで作成されたオブジェクトは、簡単に言えば、エージェントはターゲットオブジェクトの強化である.
  • を織り込む(Weaving):拡張処理を対象オブジェクトに追加し、拡張対象(AOPエージェント)を作成するプロセスが織り込まれます.
    SpringのAOPサポート
    Spring AOPは、AsppectJが採用しているコンパイル時に強化されたソリューションとは異なり、AOPエージェントの方法=補強処理+対象となる方法を採用しています.
    注釈に基づく「ゼロ構成」方式(小例)
    beans.xmlファイル
    
    
        
        
        
            
        
        
        
    
    
    Birtish.java
    package service;
    
    import org.springframework.beans.factory.BeanNameAware;
    import org.springframework.beans.factory.DisposableBean;
    import org.springframework.beans.factory.InitializingBean;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.ApplicationContextAware;
    
    public class British implements Person{
        private Axe axe;
        
        public void setAxe(Axe axe) {
            System.out.println("Spring  setAxe      ");
            this.axe = axe;
        }
        @Override
        public String useAxe() {
            // TODO Auto-generated method stub
            System.out.println(axe.chop());
            return "Slience";
        }
    }
    
    Asppectクラス
    package com.aspect;
    
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.After;
    import org.aspectj.lang.annotation.AfterReturning;
    import org.aspectj.lang.annotation.Around;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    
    @Aspect
    public class AuthAspect {
        @Before("execution(* service.*.*(..))")
        public void before() {
            System.out.println("before");
        }
        @After("execution(* service.*.*(..))")
        public void after() {
            System.out.println("after");
        }
        @AfterReturning(returning="rvt", pointcut="execution(* service.*.*(..))") 
        public void afterReturning(Object rvt) {
            System.out.println("afterReturning,    :" + rvt);
        }
        @Around("execution(* service.*.*(..))")
        public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
            System.out.println("around,    ");
            Object rvt = joinPoint.proceed();
            System.out.println("around,    ,    :" + rvt);
            //around           
            rvt = "Hello World";
            return rvt;
        }
    }
    
    その中で機能が強いのが@Arondです.目標方法の前に編入しても目標方法の後に編入してもいいし、目標方法を決めることもできます.目標方法の実行を完全に遮断することもできますが、@Afterと@Beforeを使うなら、@Aoundを使うべきです.戻り値を変えるなら@Arondだけで実現できます.複数のAsppectがあれば@Order(value=1)を使用できます.これにより、順番に実行することができます.valueが大きいほど先に実行されます.このように@AfterReturning("execution(* service.*.*(..)) && args(arg0, arg1)")を書いた後に、次の方法でpublic void before(Object rvt, String arg0, String arg1)を取得すると、その方法の第1および第2のパラメータが得られます.execution(* service.*.*(..)) && args(arg0, arg1)を書くたびに面倒くさいと思ったら、Aspectクラスにこれを書くことができます.
        @Pointcut("execution(* service.*.*(..))")
        public void myPointcut(){};
    
    その後、このexecutionを呼び出しても良いです.他のAspect類もこのAsppect類のmyPointcut()で定義されているexecutionを使用したいなら、このようにして@Before("myPointcut()")を類名で書くことができます.方法名で実現します.
    XMLプロファイルによる管理方式
    上記の注釈を使った例をXML配置に変更すれば、このようになります.
        
        
            
                
                
            
        
    
    その中のmethodとは方法の名前です.
    Spring 3.1新規キャッシュメカニズム