〹Spring練習ioc、aop

16693 ワード

Springトレーニング
スプリングの基礎知識を学ぶことによって、SpringはJava開発の複雑さを低減するために、以下の4つの重要な戦略をとっていることが分かりました.
  • POJOの軽量級と最小侵入性に基づいてプログラミングする.
  • は、注入とインターフェースに依存して松結合を実現する.
  • は、接面および慣例に基づいて声明式プログラミングを行う.
  • は、スライスとテンプレートによってサンプルコードを減少させる.
  • 次はspringの練習デモをして、更にspringのiocとaopの使用方法を熟知して、springテンプレートを使う長所.
    デモ説明
    プロジェクトを階層化し、springのiocの特性に依存して注入するユーザによる更なる修正調査項目を構築する.そしてaop特性を使ってログ操作を追加します.データベース操作はspringのjdbcTemplateを使ってデータベース操作を簡略化します.
    プロジェクト構造
    mavenプロジェクトを作成し、次のフォルダを構築します.
    --springdemo
        --src
            --main
                --java
                    --aop
                    --conf
                    --dao
                    --service
                    --entity
                --resources
            --test
                --java
                    --service
        pom.xml
    使用した依存はスプリング、slaf 4 j、log 4 j、mysql-connectorなどがあります.
    pom.xmlは以下の通りです
    
    
    
      4.0.0
    
      com.tong
      spring-demo
      1.0-SNAPSHOT
    
      spring-demo
      
      http://www.example.com
    
      
        UTF-8
        1.8
        1.8
          4.3.2.RELEASE
          1.7.24
      
    
      
        
          junit
          junit
          4.12
          test
        
          
          
              org.springframework
              spring-context
              ${spring.version}
          
          
              org.springframework
              spring-beans
              ${spring.version}
          
          
              org.springframework
              spring-core
              ${spring.version}
          
          
              org.springframework
              spring-context-support
              ${spring.version}
          
          
              org.springframework
              spring-expression
              ${spring.version}
          
          
          
              org.springframework
              spring-aop
              ${spring.version}
          
          
              org.aspectj
              aspectjweaver
              1.8.8
          
          
          
              org.springframework
              spring-test
              ${spring.version}
          
          
          
              org.springframework
              spring-jdbc
              ${spring.version}
          
          
          
              mysql
              mysql-connector-java
              5.1.22
          
          
          
              org.slf4j
              slf4j-api
              ${slf4j.version}
          
          
              org.slf4j
              slf4j-log4j12
              ${slf4j.version}
          
      
    
      
        
          
            
            
              maven-clean-plugin
              3.1.0
            
            
            
              maven-resources-plugin
              3.0.2
            
            
              maven-compiler-plugin
              3.8.0
            
            
              maven-surefire-plugin
              2.22.1
            
            
              maven-jar-plugin
              3.0.2
            
            
              maven-install-plugin
              2.5.2
            
            
              maven-deploy-plugin
              2.8.2
            
            
            
              maven-site-plugin
              3.7.1
            
            
              maven-project-info-reports-plugin
              3.0.0
            
          
        
      
    
    プロジェクト階層説明
    イベント層
    entity層はUser.javeエンティティ類を含み、POJO類であり、属性、コンストラクタとsetterのみを含み、getter方法である.
    以下のとおりです
    package com.tong.entity;
    
    /**
     * User   
     *
     * @author tongl
     * @version 1.0 11/11/2019
     */
    public class User {
        Integer id;
        String name;
        String sex;
        Integer age;
    
        public User() {
        }
    
        public User(Integer id, String name, String sex, Integer age) {
            this.id = id;
            this.name = name;
            this.sex = sex;
            this.age = age;
        }
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getSex() {
            return sex;
        }
    
        public void setSex(String sex) {
            this.sex = sex;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    
        @Override
        public String toString() {
            return "User{" + "id=" + this.id + ", name='" + this.name + '\'' + ", sex='" + this.sex + '\'' + ", age=" + this.age + '}';
        }
    }
    ダオ層
    DAO層は主にデータの持続層の仕事をしています.データベースと連絡するいくつかのタスクはここにカプセル化されています.DAO層の設計はまずDAOのインターフェースを設計して、Springの配置ファイルの中でこのインターフェースの実現類を定義して、モジュールの中でこのインターフェースを呼び出してデータ業務の処理を行うことができます.構造が非常に明確であり、DAO層のデータソース構成及びデータベース接続に関するパラメータはSpringのプロファイルに配置されている.
    インターフェースと実装を含む.
    UserDao.java
    package com.tong.dao;
    
    import com.tong.entity.User;
    
    /**
     *         
     *
     * @author tongl
     */
    public interface UserDao {
    
    
        /**
         *     
         *
         * @param user   
         */
        void addUser(User user);
    
        /**
         *   id    
         *
         * @param id id
         */
        void deleteUser(int id);
    
        /**
         *   id    
         *
         * @param id   id
         */
        User getUser(int id);
    
        /**
         *       
         *
         * @param user   
         */
        void updateUser(User user);
    
    
    }
    UserDaoImpl.java
    package com.tong.dao.impl;
    
    import com.tong.dao.UserDao;
    import com.tong.entity.User;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.jdbc.core.BeanPropertyRowMapper;
    import org.springframework.jdbc.core.JdbcTemplate;
    import org.springframework.stereotype.Repository;
    
    import java.util.List;
    
    /**
     *         
     *
     * @author tongl
     */
    @Repository
    public class UserDaoImpl implements UserDao {
    
        @Autowired
        private JdbcTemplate jdbcTemplate;
    
        /**
         *     
         *
         * @param user   
         */
        @Override
        public void addUser(User user) {
            jdbcTemplate.update("insert into t_user values(?,?,?,?)", user.getId(), user.getName(), user.getSex(), user.getAge());
        }
    
        /**
         *   id    
         *
         * @param id id
         */
        @Override
        public void deleteUser(int id) {
            jdbcTemplate.update("delete from t_user where id = ?", id);
        }
    
        /**
         *   id    
         *
         * @param id   id
         * @return user
         */
        @Override
        public User getUser(int id) {
            List users = jdbcTemplate.query("select * from t_user where id = ?",
                    new BeanPropertyRowMapper(User.class), id);
            if (users != null && users.size() > 0) {
                return users.get(0);
            }
            return null;
        }
    
        /**
         *     
         *
         * @param user   
         */
        @Override
        public void updateUser(User user) {
            jdbcTemplate.update("update t_user set name = ?, age = ?, sex = ? where id = ?",
                    user.getName(), user.getAge(), user.getSex(), user.getId());
        }
    
    }
    サービス層
    Service層は主に業務モジュールの論理応用設計を担当しています.同様に、まずインターフェースを設計し、その実現されたクラスを設計し、次にSpringの配置ファイルにその実現された関連を配置する.このように、私たちはサービスインターフェースをアプリケーションに呼び出して、業務処理を行うことができます.Service層の業務実現は、定義されたDAO層のインターフェースを具体的に呼び出し、Service層を実装するトラヒックロジックは、汎用的なトラヒックロジックの独立性と重複利用性に寄与し、プログラムは非常に簡潔である.
    UserService.java
    package com.tong.service;
    
    import com.tong.entity.User;
    
    /**
     *      
     *
     * @author tongl
     * @version 1.0 10/10/2019
     */
    public interface UserService {
    
        /**
         *       
         *
         * @param user   
         */
        void saveUser(User user);
    
        /**
         *     
         *
         * @param id   id
         */
        void deleteUser(int id);
    }
    UserServiceImpl.java
    package com.tong.service.impl;
    
    import com.tong.dao.UserDao;
    import com.tong.entity.User;
    import com.tong.service.UserService;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    /**
     *      
     *
     * @author tongl
     */
    @Service
    public class UserServiceImpl implements UserService {
    
        @Autowired
        private UserDao userDao;
    
        Logger logger = LoggerFactory.getLogger(UserServiceImpl.class);
    
        /**
         *       
         *
         * @param user   
         */
        @Override
        public void saveUser(User user) {
            Integer id = user.getId();
            User u = userDao.getUser(id);
            if (u == null) {
                //     user  ,      
                userDao.addUser(user);
                logger.info("    :{}", user);
            } else {
                //   user   ,      
                userDao.updateUser(user);
                logger.info("      :{}", user);
            }
        }
    
        /**
         *     
         *
         * @param id   id
         */
        @Override
        public void deleteUser(int id) {
    
            User user = userDao.getUser(id);
            userDao.deleteUser(id);
    
            logger.info("    :{}", user);
        }
    
    }
    
    aop層
    ログカットを実現
    Log.java
    package com.tong.aop;
    
    import org.aspectj.lang.annotation.AfterReturning;
    import org.aspectj.lang.annotation.Aspect;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.EnableAspectJAutoProxy;
    import org.springframework.stereotype.Component;
    
    /**
     *     
     *
     * @author tongl
     */
    @Component
    @ComponentScan(basePackages = {"com.fiberhome"})
    @Aspect
    @EnableAspectJAutoProxy
    public class Log {
        Logger logger = LoggerFactory.getLogger(Log.class);
    
        /**
         *       :  /        
         */
        @AfterReturning("execution(* com.tong.service.*.saveUser(..))")
        public void addLog() {
            logger.info("  /      -    ");
        }
    
        /**
         *       :        
         */
        @AfterReturning("execution(* com.tong.service.*.deleteUser(..))")
        public void deleteLog() {
            logger.info("      -    ");
        }
    }
    config
    本プロジェクトはJavaプロファイルを使用しています.ここはJavaプロファイルです.
    DataConfig.java
    package com.tong.conf;
    
    import javax.sql.DataSource;
    
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.*;
    import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
    import org.springframework.jdbc.core.JdbcTemplate;
    import org.springframework.jdbc.datasource.DriverManagerDataSource;
    
    
    @Configuration
    @ComponentScan(basePackages = {"com.tong"})
    @PropertySource(value = "classpath:db.properties")
    @Scope("singleton")
    public class DataConfig {
    
        @Value("${jdbc.driver}")
        private String driver;
        @Value("${jdbc.url}")
        private String url;
        @Value("${jdbc.username}")
        private String username;
        @Value("${jdbc.password}")
        private String password;
    
        /**
         *      
         *
         * @return dataSource
         */
        @Bean
        public DataSource dataSource() {
            DriverManagerDataSource dataSource = new DriverManagerDataSource();
            dataSource.setDriverClassName(driver);
            dataSource.setUrl(url);
            dataSource.setUsername(username);
            dataSource.setPassword(password);
            return dataSource;
        }
    
        @Bean
        public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
            return new PropertySourcesPlaceholderConfigurer();
        }
    
        @Bean
        public JdbcTemplate getJdbcTemplate(DataSource dataSource) {
            return new JdbcTemplate(dataSource);
        }
    
    }
    テストクラス
    UserServiceTest
    package com.tong.service;
    
    import com.tong.conf.DataConfig;
    import com.tong.entity.User;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    
    
    /**
     *        
     * @author tongl
     */
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(classes = {DataConfig.class})
    public class UserServiceTest {
    
        @Autowired
        private UserService userService;
    
        /**
         *       
         */
        @Test
        public void testAddUser(){
            User user = new User(1001,"  "," ",17);
            User user2 = new User(1001,"  "," ",20);
            User user3 = new User(1012,"  "," ",18);
            //System.out.println(user);
            userService.saveUser(user);
            userService.saveUser(user2);
            userService.saveUser(user3);
        }
    
        /**
         *       
         */
        @Test
        public void testDeleteUser(){
    
            userService.deleteUser(1001);
            userService.deleteUser(1002);
        }
    }
    レスキューファイル
    db.properties
    jdbc.driver=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql:///user?useUnicode=true&characterEncoding=utf-8
    jdbc.username=root
    jdbc.password=root
    log 4 j.properties
    ###   ###
    log4j.rootLogger = info,stdout,D,E
    
    ###          ###
    log4j.appender.stdout = org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.Target = System.out
    log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
    
    ###   DEBUG         logs/debug.log ###
    log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
    log4j.appender.D.File = logs/debug.log
    log4j.appender.D.Append = true
    log4j.appender.D.Threshold = DEBUG 
    log4j.appender.D.layout = org.apache.log4j.PatternLayout
    log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n
    
    ###   ERROR         logs/error.log ###
    log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
    log4j.appender.E.File =logs/error.log
    log4j.appender.E.Append = true
    log4j.appender.E.Threshold = ERROR 
    log4j.appender.E.layout = org.apache.log4j.PatternLayout
    log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n
    ソースコード
    spring-demo