03_Spring

15956 ワード

今日の内容
  • SpringフレームワークのAOPの注釈の仕方
  • SpringフレームのJDBCテンプレート
  • Springフレームワークの事務管理
  • ケース1:SpringフレームワークのAOP技術を用いてDAO層の機能を強化する
  • SpringフレームワークのAOP技術を用いてDAO層の機能を強化
  • 技術分析その:SpringフレームワークのAOP技術(注釈方式)1,ステップ1:JavaWEBプロジェクト(本例名day37_aop)を作成し,具体的な開発のjarパッケージを導入する
  • Springフレームワーク開発の基本開発パッケージを先に導入
  • Springフレームワークを再導入したAOPの開発パッケージ
  • springの伝統AOPの開発パッケージspring-aop-4.2.4.RELEASE.jarcom.springsource.org.aopalliance-1.0.0.jar
  • aspectJの開発パッケージcom.springsource.org.aspectj.weaver-1.6.8.RELEASE.jarspring-aspects-4.2.4.RELEASE.jar
  • 2,ステップ2:Springのプロファイルを作成し,具体的なAOPのschema制約を導入する
     
     
     
    

    3,ステップ3:パケット構造の作成、特定のインタフェースと実装クラスの作成
  • com.itheima.demo1
  • CustomerDao--インターフェイス
  • CustomerDaoImpl--実装クラス
  • 4,ステップ4:Springにターゲットクラスを配置する5,手順5:切麺類を定義①切面と通知を追加する注記
  • @Aspect--切麺類を定義する注記
  • 通知タイプ(注記のパラメータは切り込み点の式)
  • @Before--前置き通知
  • @AfterReturing--後置通知
  • @Around--周回通知
  • @After--最終通知
  • @AfterThrowing--異常投げ出し通知
  • ②具体的なコードは以下の通り
     @Aspect
     public class MyAspectAnno {
     @Before(value="execution(public void com.itheima.demo1.CustomerDaoImpl.save())")
     public void log(){
     System.out.println("    ...");
     }
     }
    

    6,手順6:プロファイルに切麺類を定義する7,ステップ7:プロファイルで自動エージェントを開く8、テスト完了
     @RunWith(SpringJUnit4ClassRunner.class)
     @ContextConfiguration("classpath:applicationContext.xml")
     public class Demo1 {
     
     @Resource(name="customerDao")
     private CustomerDao customerDao;
     
     @Test
     public void run1(){
     customerDao.save();
     customerDao.update();
     }
     }
    
    

    例:注釈を用いるAspectJのAOP開発1を完了し、JavaWEBプロジェクト(本例名はday37_aop)2を新規作成し、jarパッケージをインポートし、上記の手順を参照して、本例はすべてのjarパッケージを以下のようにインポートする:com.springsource.org.aopalliance-1.0.0.jar com.springsource.org.apache.commons.logging-1.1.1.jar com.springsource.org.apache.log4j-1.2.15.jar com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar spring-aop-4.2.4.RELEASE.jar spring-aspects-4.2.4.RELEASE.jar spring-beans-4.2.4.RELEASE.jar spring-context-4.2.4.RELEASE.jar spring-core-4.2.4.RELEASE.jar spring-expression-4.2.4.RELEASE.jar spring-test-4.2.4.RELEASE.jar3、srcディレクトリの下にlog 4 jを導入する.properties,spring以前のノートを参照
    ### direct log messages to stdout ###
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.Target=System.err
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
    
    ### direct messages to file mylog.log ###
    log4j.appender.file=org.apache.log4j.FileAppender
    log4j.appender.file.File=c\:mylog.log
    log4j.appender.file.layout=org.apache.log4j.PatternLayout
    log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
    
    ### set log levels - for more verbose logging change 'info' to 'debug' ###
    
    log4j.rootLogger=info, stdout
    

    4、クラスとインタフェースは以下の通りです.
    package com.huachao.demo1;
    
    public interface CustomerDao {
        public void save();
        public void update();
    }
    
    
    public class CustomerDaoImp implements CustomerDao {
        @Override
        public void save() {
            System.out.println("     ...");
        }
        @Override
        public void update() {
            System.out.println("     ...");
        }
    }
    

    5,注記を使用した切麺類
    package com.huachao.demo1;
    
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    
    @Aspect
    public class MyAspectJAnnotation {
        @Before(value="execution(* com.huachao.demo1.CustomerDaoImp.save(..))")
        public void log()
        {
            System.out.println("    ...");
        }
    }
    

    6,srcディレクトリの下に新規作成applicationContext.xmlファイル
    
    
        
        
        
        
        
    
    

    7、テストクラスは以下の通りです.
    package com.huachao.demo1;
    
    import javax.annotation.Resource;
    
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration("classpath:applicationContext.xml")
    public class Demo1 {
        @Resource(name="customerDao")
        public CustomerDao customerDao;
        @Test
        public void Run1()
        {
            customerDao.save();
            customerDao.update();
        }
    }
    

    テクニカル分析の通知タイプ
  • 通知タイプ
  • @Before--前置き通知
  • @AfterReturing--後置通知
  • @Around--オービット通知(ターゲットメソッドはデフォルトでは実行されず、手動で実行する必要がある)
  • @After--最終通知
  • @AfterThrowing--異常投げ出し通知
  • 共通の切り込み点の配置
  • @Pointcutで共通の切り込み点を定義する
  •  @Aspect
     public class MyAspectAnno {
     @Before(value="MyAspectAnno.fn()")
     public void log(){
     System.out.println("    ...");
     }
     @Pointcut(value="execution(public void com.itheima.demo1.CustomerDaoImpl.save())")
     public void fn(){}
     }
    
    

    例:通知タイプ
    package com.huachao.demo1;
    
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.After;
    import org.aspectj.lang.annotation.Around;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    import org.aspectj.lang.annotation.Pointcut;
    
    @Aspect
    public class MyAspectJAnnotation {
        /*
         *     :@Before    (      )
         */
        //@Before(value="execution(* com.huachao.demo1.CustomerDaoImp.save(..))")
        /*
         *         
         */
        @Before(value="MyAspectJAnnotation.fn()")
        public void log()
        {
            System.out.println("    ...");
        }
        
        /**
         *     :            ,    
         */
        //@After(value="execution(* com.huachao.demo1.CustomerDaoImp.save(..))")
        /*
         *         
         */
        @After(value="MyAspectJAnnotation.fn()")
        public void after()
        {
            System.out.println("    ...");
        }
        
        /**
         *       
         *       ,         
         */
        @Pointcut(value="execution(* com.huachao.demo1.CustomerDaoImp.save(..))")
        public void fn(){}
        
        
        /**
         *     (            ,      )
         * @param joinPoint
         */
        @Around(value="MyAspectJAnnotation.fn()")
        public void around(ProceedingJoinPoint joinPoint)
        {
            System.out.println("   ...");
            try {
                joinPoint.proceed();
            } catch (Throwable e) {
                e.printStackTrace();
            }
            System.out.println("   ...");
        }
        
    }
    
    

    ケース2:Springフレームワークのトランザクション管理が完了した場合
    需要分析
  • 1つの振込機能を完了するには、トランザクションの管理が必要であり、Springのトランザクション管理で完了する
  • SpringフレームワークのJDBCテンプレート技術
    技術分析のSpringフレームワークのJDBCテンプレート技術概要
  • Springフレームワークにはプログラミングを簡略化するための永続層のテンプレートクラスが多数用意されており、テンプレートクラスを使用するとプログラムが簡単になる
  • JDBCテンプレート、Springフレームワーク提供
  • JdbcTemplate
  • SpringフレームはHibernateフレームを統合でき、テンプレートクラスも提供されている
  • HibernateTemplate

  • 技術分析のプレゼンテーションJDBCのテンプレートクラス1、ステップ1:データベースのテーブル構造を作成する
     create database spring_day03;
     use spring_day03;
     create table t_account(
     id int primary key auto_increment,
     name varchar(20),
     money double
     );
    

    2,開発したjarパッケージを導入する
  • IOC基本のjarバッグ6個を先に導入com.springsource.org.apache.commons.logging-1.1.1.jar com.springsource.org.apache.log4j-1.2.15.jar spring-beans-4.2.4.RELEASE.jar spring-context-4.2.4.RELEASE.jar spring-core-4.2.4.RELEASE.jar spring-expression-4.2.4.RELEASE.jar
  • Spring-aopのjarパッケージを再導入spring-aop-4.2.4.RELEASE.jar
  • 最後にJDBCテンプレートに必要なjarパッケージを導入
  • MySQLデータベースのドライバパッケージ本例ではmysqlを使用する:mysql-connector-java-5.1.7-bin.jar
  • Spring-jdbc.jar spring-jdbc-4.2.4.RELEASE.jar
  • Spring-tx.jar spring-tx-4.2.4.RELEASE.jar

  • 3,導入applicationContext.xmlおよびlog4j.propertiesプロファイル
    4,テストコードの作成(自分でnewオブジェクトを作成する方法)
    @Test
        public void Run1()
        {
            // Spring           ,      ,          
            DriverManagerDataSource dataSource = new DriverManagerDataSource();
            dataSource.setDriverClassName("com.mysql.jdbc.Driver");
            dataSource.setUrl("jdbc:mysql:///spring_day03");
            dataSource.setUsername("root");
            dataSource.setPassword("root");
            
            //     
            JdbcTemplate template = new JdbcTemplate();
            //     
            template.setDataSource(dataSource);
            //    
            template.update("insert into t_account values (null,?,?)","  ",1000);
        }
    
    

    技術分析ではSpringフレームワークを用いてテンプレートクラス1を管理するが,先ほど作成したコードはnew方式を用いており,これらのクラスをSpringフレームワークに渡して管理すべきである.2、修正の手順は以下の通りです.
  • 手順1:Spring管理内蔵接続プール
  • 
        
        
            
            
            
            
        
    
  • 手順2:Spring管理テンプレート類
  • 
    
        
            
        
    
  • 手順3:試験手順作成
  • package com.huachao.demo1;
    import javax.annotation.Resource;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.jdbc.core.JdbcTemplate;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration("classpath:applicationContext.xml")
    public class Demo2 {
        @Resource(name="jdbcTemplate")
        private JdbcTemplate template;
        @Test
        public void Run1()
        {
            template.update("insert into t_account values (null,?,?)","  2",1000);
        }
    }
    

    技術分析のSpringフレームワークはオープンソースの接続プール1を管理し、DBPP接続プールを管理する
  • DBPPの2つのjarパッケージを先に導入し、day35_Spring01\ \spring-framework-3.0.2.RELEASE-dependencies\org.apache.commons\com.springsource.org.apache.commons.dbcp\1.2.2.osgiday35_Spring01\ \spring-framework-3.0.2.RELEASE-dependencies\org.apache.commons\com.springsource.org.apache.commons.pool\1.5.3ディレクトリの下
  • com.springsource.org.apache.commons.dbcp-1.2.2.osgi.jar
  • com.springsource.org.apache.commons.pool-1.5.3.jar
  • プロファイル作成
  • 
        
        
            
            
            
            
        
    

    2,C 3 P 0接続プールの管理
  • C 3 P 0のjarパッケージを先に導入し、day35_Spring01\ \spring-framework-3.0.2.RELEASE-dependencies\com.mchange.c3p0\com.springsource.com.mchange.v2.c3p0\0.9.1.2ディレクトリ下
  • com.springsource.com.mchange.v2.c3p0-0.9.1.2.jar
  • プロファイル作成
  • 
        
        
            
            
            
            
        
    

    技術分析のSpringフレームワークのJDBCテンプレートの簡単な操作
  • 添削検査の操作
  • package com.huachao.demo1;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.List;
    import javax.annotation.Resource;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.jdbc.core.JdbcTemplate;
    import org.springframework.jdbc.core.RowMapper;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration("classpath:applicationContext.xml")
    public class Demo2 {
        @Resource(name="jdbcTemplate")
        private JdbcTemplate template;
        /**
         *   
         */
        @Test
        public void Run1()
        {
            template.update("insert into t_account values (null,?,?)","  4",1000);
        }
        /**
         *   
         */
        @Test
        public void Run2()
        {
            template.update("update t_account set name=? where id=?","  ",3);
        }
        /**
         *   
         */
        @Test
        public void Run3()
        {
            template.update("delete from t_account where id=?",4);
        }
        /**
         *       
         */
        @Test
        public void Run4()
        {
            Account ac = template.queryForObject("select * from t_account where id=?", new BeanMapper(), 1);
            System.out.println(ac.toString());
        }
        /**
         *       
         */
        @Test
        public void Run5()
        {
            List list = template.query("select * from t_account", new BeanMapper());
            System.out.println(list);
        }
        class BeanMapper implements RowMapper{
            @Override
            public Account mapRow(ResultSet rs, int rowNum) throws SQLException {
                Account account = new Account();
                account.setId(rs.getInt("id"));
                account.setName(rs.getString("name"));
                account.setMoney(rs.getDouble("money"));
                return account;
            }
        }
    }
    

    技術分析のSpringフレームワークのトランザクション管理
    テクノロジー分析のトランザクションの回顧
  • トランザクション:論理上の一連のオペレーションを指し、そのトランザクションを構成する各実行ユニットは、一緒に成功するか、一緒に失敗するかのどちらかである.
  • 事務の特性
  • 原子性
  • 整合性
  • 隔離性
  • 耐久性
  • 隔離性を考慮しないと安全性に問題が生じる
  • 読解問題:①汚読:②繰り返し不可:③虚読:
  • 書き込み問題:①紛失更新:
  • セキュリティ問題の解決方法
  • 読解問題解決、データベース独立性レベル設定
  • 書き込み問題解決は悲観ロックと楽観ロックで解決可能