1. 程式人生 > 其它 >3.配置一個簡單的springcloud專案

3.配置一個簡單的springcloud專案

1.先建立一個父專案

1.父專案的作品是指定子專案相同依賴的版本,和springboot的版本仲裁功能類似
建立一個maven工程,刪除掉裡面的src等目錄,只留下一個pom檔案
    pom檔案解析:
    <project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>cn.com.springcloud</groupId>
    <artifactId>springcloud</artifactId>
    <!--說明當前專案是父型別專案:因為專案的打包型別有:pom、jar、war-->
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <!--同一管理jar包的版本-->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <junit.version>4.12</junit.version>
        <log4j.version>1.2.17</log4j.version>
        <lombok.version>1.16.18</lombok.version>
        <mysql.version>5.1.47</mysql.version>
        <druid.version>1.1.16</druid.version>
        <mybatis.spring.boot.version>1.3.0</mybatis.spring.boot.version>
    </properties>
    <!--子模組繼承之後,提供作用:所並本本+子modlue,不用寫groupID和version-->
    <!--重點1:dependencyManagement裡面的依賴只是設定了子類專案依賴的版本,並不會在父類專案中下載-->
    <dependencyManagement>
        <dependencies>
            <!--springboot2.2.2-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.2.2.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--springcloud Hoxton.Sr1-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.1.0.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>${mysql.version}</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>${druid.version}</version>
            </dependency>
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>${mybatis.spring.boot.version}</version>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>${junit.version}</version>
            </dependency>
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>${log4j.version}</version>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${lombok.version}</version>
                <optional>true</optional>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <fork>true</fork>
                    <addResources>true</addResources>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>


結論:
    重點1:<packaging>pom</packaging>表明當前專案是父專案
    重點2:父專案中的只是表明依賴版本,並不會下載!當子類專案引入時才會下載!
        <dependencyManagement>
            <dependencies>
                。。。
            <dependencies>
        <dependencyManagement>

公共程式碼

公共程式碼裡包含了各個子類模組使用的工共程式碼:如共同的實體類,工共的工具類等等!

服務提供端程式碼:

提供了對資料庫表的各項操作:
專案結構如下:
注意體會到什麼是面向介面程式設計!
1.控制層(controller)
    @RestController
    @Slf4j
    public class UserController {
        重點1:此處引入的依賴是service的介面,並不是介面的實現類,並且servcie的介面並沒有加上註解!其實現類加上了@service註解!後面會說..
        @Autowired
        private UserService userService;
        @GetMapping("/producer/queryUserById/{id}")
        public CommResult queryUserById(@PathVariable("id") int id){
            User user=userService.queryUserByid(id);
            if (user!=null){
                log.info("id:"+id+" 查詢使用者成功!");
                重點2:此處返回的是CommResult,並傳入user,因為CommResult有個屬性是泛型,可以傳入任何型別的引數!高!實在是高!
                return new CommResult(200,"成功",user);
            }else {
                log.info("id:"+id+" 查詢使用者失敗!");
                return new CommResult(444,"查詢失敗!id:"+id);
            }
        }
    }
2.service層
    2.1介面:重點1:介面上沒有加任何的註解
        public interface UserService {
            User queryUserByid(int id);
            int saveUser(User user);
        }
    2.2介面實現類:
        重點1:在介面實現類上加上了@service註解
        @Service
        public class UserServiceImp implements UserService {
            重點2:dao層介面的依賴注入
            @Autowired
            private UserMapper userMapper;
            @Override
            public User queryUserByid(int id) {
                User user = userMapper.queryUserByid(id);
                return user;
            }
        }
        
4.dao層:
    重點:此處有兩種方式,因為採用的是mybatis訪問資料庫
        1.在介面上使用@mapper註解去標註當前介面為mybatis的繫結介面(和mapper.xml)
        2.在springboot的啟動類上加上@mapperscan(dao層介面包名)去批量加入
        加上這兩個註解後,可以在介面方法上使用標籤@select/@insert/@update/@delete
    public interface UserMapper {
        User queryUserByid(@Param("id") int id);
        int saveUser(User user);
    }
6.繫結的mapper.xml:綁定了dao層介面,並綁定了其中的方法
    <mapper namespace="cn.com.springcloud.producer.dao.UserMapper">
        重點1:資料庫查詢出的欄位和實體類欄位不對應,使用該標籤一一對應,具體參考mybatis筆記!
        <resultMap id="queryUserById_toUser" type="com.cn.entities.User">
            <result property="id" column="id"/>
            <result property="name" column="name"/>
            <result property="pwd" column="pwd"/>
        </resultMap>
        <select id="queryUserByid" resultMap="queryUserById_toUser">
            select * from public."user" where id=#{id}
        </select>
        <insert id="saveUser" parameterType="com.cn.entities.User" useGeneratedKeys="true" keyProperty="id">
            insert into public."user"(name, pwd) values (#{name},#{pwd})
        </insert>
    </mapper>
7.springboot啟動類程式碼
    @SpringBootApplication
    重點1:使用@mappersacn批量匯入mybatis的dao層介面
    @MapperScan(value = "cn.com.springcloud.producer.dao")
    public class ProducerUserApiApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(ProducerUserApiApplication.class, args);
        }
    
    }
8.springboot的配置檔案程式碼:
server:
  port: 8081

spring:
  application:
    name: springcloud練習:服務提供端
  datasource:
    #資料來源基本配置
    username: root
    password: Ustcinfo@2020
    driver-class-name: org.postgresql.Driver
    url: jdbc:postgresql://133.64.181.208:18921/wmd_test?currentSchema=public
    type: com.alibaba.druid.pool.DruidDataSource
重點1:
mybatis-plus:
  指定mybatis的mapper.xml檔案位置
  mapper-locations: classpath*:/mapper/**/*.xml
  使用別名,掃描別名類的包,不太好用,配置了這個,在mapper.xml中使用別名會爆紅,雖然不影響執行,但是沒有提醒等功能,也不好看。暫時不推薦使用!
  type-aliases-package: com.cn.entities

服務呼叫方法程式碼

服務呼叫方呼叫提供放程式碼,返回結果!
重點1:匯入共同依賴common,這樣就可以使用公共類CommResult和User類
重點2:採用的是RestTemplate進行遠端呼叫並返回,所以需要配置RestTemplate並載入到容器中!
1.自己的配置類
    @Configuration
    public class MyConfig {
        重點1:在自己的配置類中加入RestTemplate
        @Bean
        public RestTemplate getRestTemplate(){
            return new RestTemplate();
        }
    }
2.控制層程式碼:
    @RestController
    @Slf4j
    public class UserController {
        private final static String PRODUCER_PATH="http://localhost:8081/producer/";
        @Autowired
        private RestTemplate restTemplate;
        @PostMapping("/customer/saveUser")
        public CommResult saveUser(User user){
            log.info("客戶端:插入的使用者資訊->"+user);
            重點1:使用restTemplate的各種方法(支援rest形式)去進行呼叫和返回
            CommResult result = restTemplate.postForObject(PRODUCER_PATH + "saveUser", user, CommResult.class);
            return result;
        }
    }