Давайте начнем создавать клиентскую службу SpringCloud.
Во-первых, проект springboot также создается онлайн.
URL-адрес в Интернете:start.spring.io/
Загруженный пакет представляет собой сжатый пакет. После распаковки используйте компилятор IDEA, чтобы открыть службу. Потому что я когда-то создал spingCloud+eureka+swagger+mybatisPlus, так что на этот раз я покажу его всем одновременно.Кроме того, поскольку на этот раз мы не ограничиваемся только этими тремя файлами конфигурации, но также и некоторыми новыми файлами конфигурации, я покажу вам каталог сервисов, которые были успешно созданы:
Во-первых, это файл pom.xml:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--引入mybatis依赖-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.2.0</version>
</dependency>
<!--引入mybatisPlus依赖-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatisplus-spring-boot-starter</artifactId>
<version>1.0.5</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>2.1.8</version>
</dependency>
<!-- 模板引擎 代码生成 -->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity</artifactId>
<version>1.7</version>
</dependency>
<!-- mysql驱动器依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<!--springboot的web依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--Herbnate实体依赖-->
<dependency>
<groupId>javax.persistence</groupId>
<artifactId>persistence-api</artifactId>
<version>1.0.2</version>
</dependency>
<!-- redis依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
<!-- 引入Lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
<!--springCloud启动依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter</artifactId>
</dependency>
<!--srpingCloud的eureka服务依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<!--srpingCloud的eureka服务注册依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
<version>2.0.0.RELEASE</version>
</dependency>
<!--新增依赖,swaggerUI-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.7.0</version>
</dependency>
<!-- alibaba fastjson 格式化对 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.1.41</version>
</dependency>
<!-- jwt认证协议依赖 -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.0</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
<dependency>
<groupId>com.netflix.hystrix</groupId>
<artifactId>hystrix-javanica</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
</dependencies>
<!-- 引入spring cloud的依赖,不能少,主要用来管理Spring Cloud生态各组件的版本 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Edgware.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
<resources>
<resource>
<!--需要打包的目录-->
<directory>src/main/resources</directory>
<!--目录中的文件类型-->
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
В этом файле pom также есть зависимость redis, которую я добавлю позже, но на данном этапе она еще не добавлена.
файл application.properties
#服务名
spring.application.name=permission
#端口
server.port=2222
################################################################################################################
#数据库信息
spring.datasource.url: jdbc:mysql://localhost:3306/myblog?useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.datasource.username: root
spring.datasource.password: 123456(请填入你的数据库密码)
spring.datasource.driver-class-name: com.mysql.jdbc.Driver
#################################################################################################################
spring.jmx.default-domain=${spring.application.name}
spring.jpa.open-in-view=false
# springframework.web日志以DEBUG级别输出
logging.level.org.springframework.web=info
###############################################################################################################
# 如果是放在src/main/java目录下 classpath:/com/blog/*/mapper/*Mapper.xml
# 如果是放在resource目录 classpath:/mapper/*Mapper.xml
mybatis-plus.mapper-locations=classpath:/mapper/*Mapper.xml
#实体扫描,多个package用逗号或者分号分隔
mybatis-plus.type-aliases-package=com.blog.*.entity
#驼峰下划线转换
mybatis-plus.global-config.db-column-underline=true
#刷新mapper 调试神器
mybatis-plus.global-config.refresh-mapper=false
#数据库大写下划线转换
mybatis-plus.global-config.capital-mode=true
#################################################################################################################
#配置Swagger相关信息(从eureka跳到swagger页面)
eureka.instance.prefer-ip-address=true
eureka.instance.hostname=:${spring.cloud.client.ipAddress}
eureka.instance.status-page-url:http://${spring.cloud.client.ipAddress}:${server.port}/swagger-ui.html
####################################################################################################################
#eureka注册中心路径
eureka.client.service-url.defaultZone=http://localhost:1111/eureka/
#表示本服务发送给eureka服务端的心跳时间
eureka.instance.leaseRenewalIntervalInSeconds: 10
#当本服务掉线后,eureka服务端取掉本服务的缓存的时间
eureka.instance.leaseExpirationDurationInSeconds: 2
#注册到eureka上的服务的名字
eureka.instance.instance-id=http://${spring.cloud.client.ipAddress}:${server.port}/${spring.application.name}
#######################################################################################################################
#逻辑删除配置(下面3个配置),不是真实删除数据,只是逻辑删除数据
mybatis-plus.global-config.logic-delete-value=1
mybatis-plus.global-config.logic-not-delete-value=0
mybatis-plus.global-config.sql-injector=com.baomidou.mybatisplus.mapper.LogicSqlInjector
##############################################################################################################
mybatis-plus.global-config.meta-object-handler=com.blog.permission.mabatisPlus.MyMetaObjectHandler
mybatis-plus.configuration.map-underscore-to-camel-case=true
mybatis-plus.configuration.cache-enabled=false
mybatis-plus.configuration.jdbc-type-for-null=null
mybatis-plus.typeAliasesPackage=com.blog.permission.entity
mybatis-plus.global-config.id-type=3
mybatis-plus.global-config.field-strategy=2
mybatis-plus.global-config.key-generator=com.baomidou.mybatisplus.incrementer.OracleKeyGenerator
Файл класса Startup PermissionApplication.java
картина:
Код:@EnableWebSecurity
@SpringCloudApplication
@EnableTransactionManagement
@EnableFeignClients
@ComponentScan(basePackages = "com.blog.permission")
@EnableAsync
@EnableScheduling
@EnableSwagger2
@EnableWebMvc
public class PermissionApplication {
public static void main(String[] args) {
SpringApplication.run(PermissionApplication.class, args);;
}
}
Затем начните добавлять файлы конфигурации.
конфигурационный файл swagger.
Новый файл конфигурации: Swagger2.java
@Configuration
@EnableSwagger2
public class Swagger2 {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("com.blog.permission.controller"))
.paths(Predicates.not(PathSelectors.regex("/error.*")))//错误路径不监控
.paths(PathSelectors.regex("/.*"))// 对根下所有路径进行监控
.build();
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
//页面标题
.title("登录以及权限管理20190926")
//描述
.description("项目API文档")
//创建人
.contact("就是作者我")
//版本号
.version("1.0")
.build();
}
}
Новый файл конфигурации: WebMvcConfig.java
@Configuration
@EnableWebMvc
class WebMvcConfig extends WebMvcConfigurerAdapter {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("swagger-ui.html")
.addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/");
}
//设置swagger里面返回的responsebody的值为json字符串
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters){
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
List<MediaType> list=new ArrayList<MediaType>();
list.add(MediaType.APPLICATION_JSON_UTF8);
list.add(new MediaType("text","html", Charset.forName("UTF-8")));
list.add(new MediaType("application","*+json",Charset.forName("UTF-8")));
converter.setSupportedMediaTypes(list);
converters.add(converter);
}
}
конфигурационный файл mybatisPlus
Новый файл конфигурации: MybatisPlusConfig, java
@EnableTransactionManagement
@Configuration
@MapperScan("com.blog.*.mapper")
public class MybatisPlusConfig {
/**
* mybatis-plus SQL执行效率插件【生产环境可以关闭】
*/
@Bean
public PerformanceInterceptor performanceInterceptor() {
return new PerformanceInterceptor();
}
/*
* 分页插件,自动识别数据库类型 多租户,请参考官网【插件扩展】
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
@Bean
public MetaObjectHandler metaObjectHandler() {
return new MyMetaObjectHandler();
}
/**
* 注入主键生成器
*/
@Bean
public IKeyGenerator keyGenerator() {
return new H2KeyGenerator();
}
/**
* 注入sql注入器
*/
@Bean
public ISqlInjector sqlInjector() {
return new LogicSqlInjector();
}
}
Новый файл конфигурации: MybatisPlusSql.java
public class MybatisPlusSql implements FactoryBean<SqlSessionFactory>, InitializingBean, ApplicationListener<ApplicationEvent> {
private static final Log LOGGER = LogFactory.getLog(SqlSessionFactoryBean.class);
private Resource configLocation;
private Configuration configuration;
private Resource[] mapperLocations;
private DataSource dataSource;
private TransactionFactory transactionFactory;
private Properties configurationProperties;
private SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
private SqlSessionFactory sqlSessionFactory;
private String environment = SqlSessionFactoryBean.class.getSimpleName();
private boolean failFast;
private Interceptor[] plugins;
private TypeHandler<?>[] typeHandlers;
private String typeHandlersPackage;
private Class<?>[] typeAliases;
private String typeAliasesPackage;
private Class<?> typeAliasesSuperType;
private DatabaseIdProvider databaseIdProvider;
private Class<? extends VFS> vfs;
private Cache cache;
private ObjectFactory objectFactory;
private ObjectWrapperFactory objectWrapperFactory;
@Override
public SqlSessionFactory getObject() throws Exception {
return null;
}
@Override
public Class<?> getObjectType() {
return null;
}
@Override
public boolean isSingleton() {
return false;
}
@Override
public void afterPropertiesSet() throws Exception {
}
@Override
public void onApplicationEvent(ApplicationEvent applicationEvent) {
}
}
Новый файл конфигурации: MyMetaObjectHandler.java
@Component
public class MyMetaObjectHandler extends MetaObjectHandler {
protected final static Logger logger = LoggerFactory.getLogger(Application.class);
@Override
public void insertFill(MetaObject metaObject) {
logger.info("新增数据库:");
}
@Override
public void updateFill(MetaObject metaObject) {
logger.info("修改数据库:");
}
}
Чтобы избежать некоторых ошибок при запуске, я также создал новый пустой файл config.properties, в котором ничего не было.
Хорошо, файл конфигурации в основном готов, но если вы запустите службу в это время, она все равно сообщит об ошибке, потому что у вас нет поддерживающего контроллера, службы, маппера и других файлов.
Поэтому я создал класс сущностей специально для генерации кода.
Генератор кода: CreateCodeMethod.java
@Component
public class CreateCodeMethod {
/**
*
* @Title: main
* @Description: 生成
* @param args
*/
public static void main(String[] args) {
AutoGenerator mpg = new AutoGenerator();
// 全局配置
GlobalConfig gc = new GlobalConfig();
gc.setOutputDir("D://"); //输出文件路径
gc.setFileOverride(true);
gc.setActiveRecord(false);// 不需要ActiveRecord特性的请改为false
gc.setEnableCache(false);// XML 二级缓存
gc.setBaseResultMap(true);// XML ResultMap
gc.setBaseColumnList(false);// XML columList
gc.setAuthor("wuchong");// 作者
// 自定义文件命名,注意 %s 会自动填充表实体属性!
gc.setControllerName("%sController");
gc.setServiceName("%sService");
gc.setServiceImplName("%sServiceImpl");
gc.setMapperName("%sMapper");
gc.setXmlName("%sMapper");
mpg.setGlobalConfig(gc);
// 数据源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setDbType(DbType.MYSQL);
dsc.setDriverName("com.mysql.jdbc.Driver");
dsc.setUsername("root");
dsc.setPassword("123456");
dsc.setUrl("jdbc:mysql://localhost:3306/myblog");
mpg.setDataSource(dsc);
// 策略配置
StrategyConfig strategy = new StrategyConfig();
// strategy.setTablePrefix(new String[] { "sys_" });// 此处可以修改为您的表前缀
strategy.setNaming(NamingStrategy.underline_to_camel);// 表名生成策略
strategy.setInclude(new String[] { "permission","permission_manage","user"}); // 需要生成的表
strategy.setLogicDeleteFieldName("record_status");//设置逻辑删除的字段
strategy.setSuperServiceClass(null);
strategy.setEntityLombokModel(true);
strategy.setSuperServiceImplClass(null);
strategy.setSuperMapperClass(null);
mpg.setStrategy(strategy);
// 包配置
PackageConfig pc = new PackageConfig();
pc.setParent("blog");
pc.setController("controller");
pc.setService("service");
pc.setServiceImpl("service.impl");
pc.setMapper("mapper");
pc.setEntity("entity");
pc.setXml("xml");
mpg.setPackageInfo(pc);
// 执行生成
mpg.execute();
}
}
Здесь я должен рассказать о своей структуре таблицы.В качестве примера возьмем мою структуру таблицы mysql:
Видно что в таблице user моей БД есть поле record_status.Это поле используется мной для логического удаления.Я думаю мелкие партнеры которые часто развивают бизнес знают что общие данные таблицы физически не удалятся,только Надгробие, а mybatisPlus может просто инкапсулировать это надгробие, при использовании генератора кода обратите внимание на мой снимок экрана ниже: Фрагмент кода, который я создал, предназначен для обеспечения того, чтобы при создании класса сущности поле record_status имело определенную аннотацию:@TableLogicС этой аннотацией, когда вы вызываете метод удаления mybatisPlus, он логически удалит ваши данные.
Хорошо, я настроил сгенерированные java-файлы в папке блога на диске D, вынул их и поместил в проект.
как показано на рисунке:
файл контроллера: служебный файл: Файл ServiceImpl: маппер файл: файл mapper.xml: На этом этапе вы можете запустить службу.Откройте веб-страницу и введите URL-адрес: localhost:1111 (ps: Этот сервер eureka был установлен в предыдущей статье.Сначала давайте поговорим о запуске сервера eureka, а затем запустим только что созданный нами клиент eureka.)
Как видите, наш сервис зарегистрирован в eureka. Вы можете проверить, является ли наша конфигурация полной и осуществимой.Суммировать
Клиент eureka, который я создал, действительно может удовлетворить потребности в разработке, если я просто играю в одиночку.
Следует отметить, что вы можете создавать файлы по своему усмотрению, но обязательно обратите внимание на файлы конфигурации.Например, у вас есть такая конфигурация в файле application.properties:
Файл, соответствующий этой конфигурации, находится там, где находится созданный мной файл конфигурации MyMetaObjectHandler.java. Поэтому, когда вы будете готовы приступить к сборке собственного springCloud, обязательно обратите внимание на все файлы конфигурации. Вы должны прочитать все файлы конфигурации, как следует. Лучше всего собрать точно так же, как в моей статье, а затем следовать Это не проблема, чтобы играть с вашими идеями.