天天看點

springboot自定義start解析(start中配置從資料源)

springboot自定義start解析(start中配置從資料源)

在springboot相比于springmvc提供了一個極為重要的功能,就是自定義start(自定義jar包),同時spring也提供了一大波start。如spring-boot-starter-data-redis,spring-boot-starter-amqp。本文将教你如何自定義start。例子為從start中擷取資料源。

1.自定義start能幹什麼

在架構考慮時,或許有一些通用方法抽取成start,在項目中使用時,直接引入即可。

2.建立自定義start

1.建立一個新的maven項目

建立一個普通的maven項目,作為start的開發環境

2.建立application.properties

在maven中建立application.properties檔案。同時添加以下代碼,作為常量配置。

login.className = com.mysql.jdbc.Driver
login.url=jdbc:mysql://localhost:3306/humanresource?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
login.user=root
login.password=root      

3.建立LoginCheckProperties

建立類LoginCheckProperties,其中需要@ConfigurationProperties注解,prefix = “login” 的意思是調用項目中 ,application.properties中配置的參數。

@ConfigurationProperties(prefix = "login")
public class LoginCheckProperties {

    private String className;
    private String url;
    private String user;
    private String password;

    public String getClassName() {
        return className;
    }

    public void setClassName(String className) {
        this.className = className;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getUser() {
        return user;
    }

    public void setUser(String user) {
        this.user = user;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}      

4.Config類

其中@EnableConfigurationProperties(LoginCheckProperties.class) 注解為固定寫法,意義是實作自動配置上文中的Properties類。

@Configuration
@EnableConfigurationProperties(LoginCheckProperties.class)
@MapperScan(basePackages = MasterDataSourceConfig.PACKAGE, sqlSessionFactoryRef = "masterSqlSessionFactory")
public class MasterDataSourceConfig {

    // 精确到 master 目錄,以便跟其他資料源隔離
    static final String PACKAGE = "com.airboot.bootdemo.dao.master";
    static final String MAPPER_LOCATION = "classpath*:mapper/master/*.xml";

    private String className;
    private String url;
    private String user;
    private String password;

    public MasterDataSourceConfig(LoginCheckProperties loginCheckProperties) {
        this.className = loginCheckProperties.getClassName();
        this.url = loginCheckProperties.getUrl();
        this.user = loginCheckProperties.getUser();
        this.password = loginCheckProperties.getPassword();
    }

    @Bean(name = "masterDataSource")
    public DataSource masterDataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(className);
        dataSource.setUrl(url);
        dataSource.setUsername(user);
        dataSource.setPassword(password);
        return dataSource;
    }

    @Bean(name = "masterTransactionManager")
    public DataSourceTransactionManager masterTransactionManager() {
        return new DataSourceTransactionManager(masterDataSource());
    }

    @Bean(name = "masterSqlSessionFactory")
    public SqlSessionFactory masterSqlSessionFactory(@Qualifier("masterDataSource") DataSource masterDataSource)
            throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(masterDataSource);
        sessionFactory.setMapperLocations(
                new PathMatchingResourcePatternResolver().getResources(MasterDataSourceConfig.MAPPER_LOCATION));
        return sessionFactory.getObject();
    }  
}      

5.添加META-INF/spring.factories

最後在resources中建立檔案夾META-INF,在其中建立檔案spring.factories路徑為上文Config中的路徑。(需要向被引用者暴露)

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.*.*.*.*A,\
com.*.*.*.*B,\
com.*.*.*.*C,\
com.*.*.*.*D,\
com.*.*.*.*Util      

6.顯示start注釋(選讀)

如果想要在jar中加入注釋 則需要在pom檔案中修改以下代碼 這樣會生成一個 .jar 和一個:source.jar 需要将這兩個jar包都加入項目中。

<build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-source-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <aggregate>true</aggregate>
                </configuration>
                <executions>
                    <execution>
                        <id>attach-javadocs</id>
                        <goals>
                            <goal>jar</goal>
                        </goals>
                        <configuration>
                            <additionalparam>-Xdoclint:none</additionalparam>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
      

7.打包

使用指令mvn install。即可生成jar包。

8.引入jar包

<dependency>
            <groupId>cn.baocl</groupId>
            <artifactId>check-spring-boot-starter</artifactId>
            <version>1.1-SNAPSHOT</version>
        </dependency>      

在引用項目中的pom檔案配置groupId,artifactId,version即可。下文為start中的pom。與上文配置需要對應。

<?xml version="1.0" encoding="UTF-8"?>
<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.baocl</groupId>
    <artifactId>check-spring-boot-starter</artifactId>
    <version>1.1-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.2.1.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.2</version>
        </dependency>
        <!-- Druid 資料連接配接池依賴 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.17</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <version>2.2.1.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
            <version>8.0.16</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
            <version>2.2.1.RELEASE</version>
        </dependency>
    </dependencies>

</project>
              

9.使用

然後就可以使用了,本文實作的為主項目定義一個從資料源。是以在主項目中就可以使用上文定義的資料源啦。

10.項目結構

springboot自定義start解析(start中配置從資料源)