网上看到一句这样的描述:
Spring Boot可以说是至少近5年来Spring乃至整个Java社区最有影响力的项目之一,也被人看作是:Java EE开发的颠覆者
本人深表同意
使用springBoot是一个很容易的事
但要基于springBoot的简单理论去搭建自己的整体框架,就需要学习和理解springBoot-Plugin,以它的方式来构建,让自己也能够享受到springBoot的优雅
实践的价值,一定要简单,且突然核心目标,我这边使用三个工程就是基于这个理念编写,分别是 jdbc,query,queryExample (顺序体现了依赖过程)
1、 jdbc工程为核心工程,它体现spring-boot的优雅的配置和代码的结合
maven 依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>2.5.0</version>
</dependency>
</dependencies>
自动装载properties的简单对象
package com.riso.jdbc.common.object;
import org.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties(prefix = "jdbc.custom")
public class CustomProperties {
private String url;
private String user;
private String password;
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;
}
@Override
public String toString() {
return "CustomProperties{" +
"url='" + url + '\'' +
", user='" + user + '\'' +
", password='" + password + '\'' +
'}';
}
}
极简的核心加载配置的代码,省略了实现
package com.riso.jdbc.common;
import com.riso.jdbc.common.object.CustomProperties;
import org.springframework.stereotype.Component;
@Component
public class ConnectionManager {
private boolean LOAD = false;
public boolean isLoad() {
return LOAD;
}
/** * 建立工厂 */
public void establishFactory(CustomProperties customProperties) {
LOAD = true;
System.out.println("establishFactory param:" + customProperties.toString());
//...
}
}
自动加载类
package com.riso.jdbc;
import com.riso.jdbc.common.ConnectionManager;
import com.riso.jdbc.common.object.CustomProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@ConditionalOnProperty(value = "jdbc.custom.url", matchIfMissing = false)
@Configuration
@EnableConfigurationProperties({CustomProperties.class})
public class JdbcAutoConfigure {
@Autowired
private CustomProperties customProperties;
@Autowired
private ConnectionManager connectionManager;
@Bean(name = "customConnectionManager")
public ConnectionManager customConnectionManager() {
System.out.println("jdbc try init");
if (connectionManager.isLoad()) {
System.out.println("jdbc get manager");
return connectionManager;
}
System.out.println("jdbc init");
connectionManager.establishFactory(customProperties);
return connectionManager;
}
}
在resources\META-INF 新建spring.factories 文件,内容如下
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.riso.jdbc.JdbcAutoConfigure
2、 query 基于jdbc 最核心的配置的另一种也是体现工程拆分的理念,它实现了查询数据库的场景
maven 引入jdbc既可
<dependencies>
<dependency>
<groupId>com.riso</groupId>
<artifactId>jdbc</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
</dependencies>
实现jdbc的查询bean
package com.riso.query.dao;
import com.riso.jdbc.common.ConnectionManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.List;
@Component
public class Query {
@Autowired
private ConnectionManager connectionManager;
public List<?> all() {
if (connectionManager.isLoad() == false) {
throw new RuntimeException("not init");
}
System.out.println("all data");
return Arrays.asList("testData");
}
}
3、 query-example 例子工程,体现如何使用自定义的plugin
maven依赖,关联query既可
<dependencies>
<dependency>
<groupId>com.riso</groupId>
<artifactId>query</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
</dependencies>
配置 resources/application.properties 文件
如果jdbc.custom.url 配置项不存在,不会自载加载jdbc 的代码逻辑
jdbc.custom.url=jdbc.mysql.test
jdbc.custom.user=testUser
jdbc.custom.password=testPassword
一个独立的springboot 工程的初始化类 并附加一个运行查询逻辑功能,最简化的example
package com.riso;
import com.riso.query.dao.Query;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import java.util.List;
@SpringBootApplication
public class QueryExampleApplication {
public static void main(String[] args) {
System.out.println("queryExampleBefore");
ConfigurableApplicationContext context = SpringApplication.run(QueryExampleApplication.class, args);
//查询尝试
Query query = context.getBean(Query.class);
List<?> list = query.all();
System.out.println("queryData listSize:" + list.size());
System.out.println("queryExampleAfter");
}
}
run QueryExampleApplication 后的日志:
queryExampleBefore
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.5.0)
[2021-06-27 22:54:06.985] - 14452 信息 [main] --- com.riso.QueryExampleApplication: Starting QueryExampleApplication using Java 1.8.0_131 on DESKTOP-MMHNK85 with PID 14452 (D:\code\riso\github\riso-jay\riso\riso-parent\springboot-plugin-example\query-example\target\classes started by ok in d:\IdeaProjects\githup-jack)
[2021-06-27 22:54:06.996] - 14452 信息 [main] --- com.riso.QueryExampleApplication: No active profile set, falling back to default profiles: default
jdbc try init
jdbc init
establishFactory param:CustomProperties{url='jdbc.mysql.test', user='testUser', password='testPassword'}
[2021-06-27 22:54:07.596] - 14452 信息 [main] --- com.riso.QueryExampleApplication: Started QueryExampleApplication in 1.032 seconds (JVM running for 1.421)
[2021-06-27 22:54:07.598] - 14452 信息 [main] --- org.springframework.boot.availability.ApplicationAvailabilityBean: Application availability state LivenessState changed to CORRECT
[2021-06-27 22:54:07.600] - 14452 信息 [main] --- org.springframework.boot.availability.ApplicationAvailabilityBean: Application availability state ReadinessState changed to ACCEPTING_TRAFFIC
all data
queryData listSize:1
queryExampleAfter
Process finished with exit code 0
大部分工程,随着项目的迭代,不同技术人员变更,工程质量越来越没有保证
以前我借鉴spring 全家桶思维 在工程进行实践和反省,所以我推荐应该要切换到spring-boot plugin思路来进行工程实践 ,它是一个更优秀的业务框架
所以学习springboot,掌握springboot-plugin的知识并实践在项目中,是非常有必要的。
本章主要还是围绕着配置这块,后续章结还有plugin部署、测试等实践
作者:朱杰 又称 杰克码
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/vipshop_fin_dev/article/details/118281656
内容来源于网络,如有侵权,请联系作者删除!