七.SpringBoot集成实例系列-多数据源mongodb+lombok(二)
2017-10-15 11:10
585 查看
文章列表
本系列将通过实例分别实现Springboot集成mybatis(mysql),mail,mongodb,cassandra,scheduler,redis,kafka,shiro,websocket。
具体文章系列如下:
一.SpringBoot集成实例系列-xml型单数据源mybatis
二.SpringBoot集成实例系列-xml型多数据源mybatis
三.SpringBoot集成实例系列-注解型单数据源mybatis
四.SpringBoot集成实例系列-注解型多数据源mybatis
五.SpringBoot集成实例系列-邮件email
六.SpringBoot集成实例系列-单数据源mongodb
七.SpringBoot集成实例系列-多数据源mongodb(一)
七.SpringBoot集成实例系列-多数据源mongodb(二)
八.SpringBoot集成实例系列-缓存redis
九.SpringBoot集成实例系列-数据库cassandra
十.SpringBoot集成实例系列-定时任务scheduler
十一.SpringBoot集成实例系列-消息队列kafka
十二.SpringBoot集成实例系列-消息推送websocket
上一章我们通过分别加载MongoDbFactory实现springboot集成多数据源的mongodb。本章将通过lombok+MongoProperties+配置注解的方式实现多数据源mongodb。
lombok:简单来说就是通过注解的方式将javabean代码简化,省去我们手动创建getter和setter方法的麻烦,它能够在我们编译源码的时候自动帮我们生成getter和setter方法.
原理:lombok利用了JDK6的新特性:JSR-000269 Pluggable Annotation Processing API(插入式注解API)。
Javac在编译过程变成:
a) 先对源码分析,生成一棵抽象语法树,
b) 再不断调用实现了JAR 269 API的程序,根据注解修改了抽象语法树,直到语法树不再被修改为止
c) javac根据修改后的抽象语法树生成.class字节码
详情见:https://my.oschina.net/darkness/blog/510808
由于本文实例开发IDE是eclipse,以此eclipse需要安装lombok插件,才能正常显示lombok注解的方法。
lombok插件下载:https://projectlombok.org/download
lombok常用注解,具体见官网:
@val
如果你要定义一个final的变量,并且不想写类型,这个可以帮到你。但是,在实际项目中,完全没有使用到。
@NonNull
这个在参数中使用,如果调用时传了null,就直接抛空指针。
@Data、@ToString、@EqualsAndHashCode、@Getter、@Setter和@RequiredArgsConstructor注解的集合。
@Getter与@Setter
作用于属性和类上,自动生成属性的getXXX()和setXXX()方法。若在类上,则对所有属性有效。并可通过AccessLevel参数控制方法的访问级别。
@ToString
作用于类,自动重写类的ToString()方法。常用的参数有exclude(指定方法中不包含的属性)、callSuper(方法中是否包含父类ToString()方法返回的值)
@EqualsAndHashCode
作用于类,自动重写类的equals()、hashCode()方法。常用的参数有exclude(指定方法中不包含的属性)、callSuper(方法中是否包含父类ToString()方法返回的值)
@NoArgsConstructor, @RequiredArgsConstructor和@AllArgsConstructor
作用于类,@NoArgsConstructor自动生成不带参数的构造方法;@RequiredArgsConstructor自动生成带参数的构造方法,主要针对一些需要特殊处理的属性,比如未初始化的final属性;@AllArgsConstructor自动生成包含所有属性的构造方法。
@Synchronized
作用于方法,可锁定指定的对象,如果不指定,则默认创建创建一个对象锁定。
@Log,或者直接@Slf4j
作用于类,具体包含@CommonsLog、@Log、@Log4j、@Log4j2、@Slf4j和@XSlf4j,分别对用不同的日志系统。利用此类注解,可为类创建一个log属性。
两个数据源primary和secondary
由于本来项目pom有依赖关系,版本无需写入,实际项目写入需要的版本
第一个框:lombok设置Data注解,无需setter/getter方法
第二个框:加载配置文件分隔符
第三个框:直接加载配置文件类
自定义MongoDbFactory实现方法,不同数据源继承该方法创建对应的MongoDbFactory。
主要本实例mongodb环境是设置了权限认证的,如未认证,可以简单的通过
实现。
第一个框:setter/getter注解等
第二个框:构造方法注解
数据层扫描包和带实现的数据源注解
数据统计结果
本系列将通过实例分别实现Springboot集成mybatis(mysql),mail,mongodb,cassandra,scheduler,redis,kafka,shiro,websocket。
具体文章系列如下:
一.SpringBoot集成实例系列-xml型单数据源mybatis
二.SpringBoot集成实例系列-xml型多数据源mybatis
三.SpringBoot集成实例系列-注解型单数据源mybatis
四.SpringBoot集成实例系列-注解型多数据源mybatis
五.SpringBoot集成实例系列-邮件email
六.SpringBoot集成实例系列-单数据源mongodb
七.SpringBoot集成实例系列-多数据源mongodb(一)
七.SpringBoot集成实例系列-多数据源mongodb(二)
八.SpringBoot集成实例系列-缓存redis
九.SpringBoot集成实例系列-数据库cassandra
十.SpringBoot集成实例系列-定时任务scheduler
十一.SpringBoot集成实例系列-消息队列kafka
十二.SpringBoot集成实例系列-消息推送websocket
上一章我们通过分别加载MongoDbFactory实现springboot集成多数据源的mongodb。本章将通过lombok+MongoProperties+配置注解的方式实现多数据源mongodb。
lombok:简单来说就是通过注解的方式将javabean代码简化,省去我们手动创建getter和setter方法的麻烦,它能够在我们编译源码的时候自动帮我们生成getter和setter方法.
原理:lombok利用了JDK6的新特性:JSR-000269 Pluggable Annotation Processing API(插入式注解API)。
Javac在编译过程变成:
a) 先对源码分析,生成一棵抽象语法树,
b) 再不断调用实现了JAR 269 API的程序,根据注解修改了抽象语法树,直到语法树不再被修改为止
c) javac根据修改后的抽象语法树生成.class字节码
详情见:https://my.oschina.net/darkness/blog/510808
由于本文实例开发IDE是eclipse,以此eclipse需要安装lombok插件,才能正常显示lombok注解的方法。
lombok插件下载:https://projectlombok.org/download
lombok常用注解,具体见官网:
@val
如果你要定义一个final的变量,并且不想写类型,这个可以帮到你。但是,在实际项目中,完全没有使用到。
@NonNull
这个在参数中使用,如果调用时传了null,就直接抛空指针。
@Data、@ToString、@EqualsAndHashCode、@Getter、@Setter和@RequiredArgsConstructor注解的集合。
@Getter与@Setter
作用于属性和类上,自动生成属性的getXXX()和setXXX()方法。若在类上,则对所有属性有效。并可通过AccessLevel参数控制方法的访问级别。
@ToString
作用于类,自动重写类的ToString()方法。常用的参数有exclude(指定方法中不包含的属性)、callSuper(方法中是否包含父类ToString()方法返回的值)
@EqualsAndHashCode
作用于类,自动重写类的equals()、hashCode()方法。常用的参数有exclude(指定方法中不包含的属性)、callSuper(方法中是否包含父类ToString()方法返回的值)
@NoArgsConstructor, @RequiredArgsConstructor和@AllArgsConstructor
作用于类,@NoArgsConstructor自动生成不带参数的构造方法;@RequiredArgsConstructor自动生成带参数的构造方法,主要针对一些需要特殊处理的属性,比如未初始化的final属性;@AllArgsConstructor自动生成包含所有属性的构造方法。
@Synchronized
作用于方法,可锁定指定的对象,如果不指定,则默认创建创建一个对象锁定。
@Log,或者直接@Slf4j
作用于类,具体包含@CommonsLog、@Log、@Log4j、@Log4j2、@Slf4j和@XSlf4j,分别对用不同的日志系统。利用此类注解,可为类创建一个log属性。
1.需求
通过来个不同数据源中指定数据库中的collections中数据个数?2.技术要点
2.1 配置文件
两个数据源primary和secondary
2.2 lombok依赖引入
由于本来项目pom有依赖关系,版本无需写入,实际项目写入需要的版本
2.3 加载配置文件信息
第一个框:lombok设置Data注解,无需setter/getter方法
第二个框:加载配置文件分隔符
第三个框:直接加载配置文件类
2.4 创建各数据源的MongoTemplate
自定义MongoDbFactory实现方法,不同数据源继承该方法创建对应的MongoDbFactory。
主要本实例mongodb环境是设置了权限认证的,如未认证,可以简单的通过
实现。
2.5 业务对象实体
第一个框:setter/getter注解等
第二个框:构造方法注解
2.6 数据源对应数据层
数据层扫描包和带实现的数据源注解
3.代码实现
3.1 项目结构
3.2 配置文件applicaiton.properties
spring.application.name=spirngboot-integ-mongo-mdsource spring.data.mongodb.primary.database=logs spring.data.mongodb.primary.host=127.0.0.1 spring.data.mongodb.primary.password=user1 spring.data.mongodb.primary.port=27017 spring.data.mongodb.primary.username=user1 spring.data.mongodb.secondary.database=t_user spring.data.mongodb.secondary.host=127.0.0.1 spring.data.mongodb.secondary.password=user1 spring.data.mongodb.secondary.port=27017 spring.data.mongodb.secondary.username=user1
3.3 加载数据源配置对象MultipleMongoProperties
package com.lm.second.config.props; import org.springframework.boot.autoconfigure.mongo.MongoProperties; import org.springframework.boot.context.properties.ConfigurationProperties; import lombok.Data; /** * 读取配置文件 * @author liangming.deng * @date 2017年10月14日 * */ @Data @ConfigurationProperties(prefix = "spring.data.mongodb") public class MultipleMongoProperties { private MongoProperties primary = new MongoProperties(); private MongoProperties secondary = new MongoProperties(); }
3.4 数据源mongoTemplate实现
package com.lm.second.config; import java.util.ArrayList; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.mongo.MongoProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.data.mongodb.MongoDbFactory; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.SimpleMongoDbFactory; import com.lm.second.config.props.MultipleMongoProperties; import com.mongodb.MongoClient; import com.mongodb.MongoCredential; import com.mongodb.ServerAddress; /** * 获取各数据源MongoTemplate * * @author liangming.deng * @date 2017年10月14日 * */ @Configuration public class MultipleMongoConfig { @Autowired private MultipleMongoProperties mongoProperties; @Primary @Bean @Qualifier(PrimaryMongoConfig.MONGO_TEMPLATE) public MongoTemplate primaryMongoTemplate() throws Exception { return new MongoTemplate(primaryFactory(this.mongoProperties.getPrimary())); } @Bean @Qualifier(SecondaryMongoConfig.MONGO_TEMPLATE) public MongoTemplate secondaryMongoTemplate() throws Exception { return new MongoTemplate(secondaryFactory(this.mongoProperties.getSecondary())); } @Bean @Primary public MongoDbFactory primaryFactory(MongoProperties mongo) throws Exception { ServerAddress serverAddress = new ServerAddress(mongo.getHost(), mongo.getPort()); List<MongoCredential> mongoCredentialList = new ArrayList<>(); mongoCredentialList .add(MongoCredential.createCredential(mongo.getUsername(), mongo.getDatabase(), mongo.getPassword())); return new SimpleMongoDbFactory(new MongoClient(serverAddress, mongoCredentialList), mongo.getDatabase()); } @Bean public MongoDbFactory secondaryFactory(MongoProperties mongo) throws Exception { ServerAddress serverAddress = new ServerAddress(mongo.getHost(), mongo.getPort()); List<MongoCredential> mongoCredentialList = new ArrayList<>(); mongoCredentialList .add(MongoCredential.createCredential(mongo.getUsername(), mongo.getDatabase(), mongo.getPassword())); return new SimpleMongoDbFactory(new MongoClient(serverAddress, mongoCredentialList), mongo.getDatabase()); } }
3.5 主数据源
package com.lm.second.config; import org.springframework.context.annotation.Configuration; import org.springframework.data.mongodb.repository.config.EnableMongoRepositories; /** * @author * 主数据源 数据层 */ @Configuration @EnableMongoRepositories(basePackages = "com.lm.second.repository.primary", mongoTemplateRef = PrimaryMongoConfig.MONGO_TEMPLATE) public class PrimaryMongoConfig { protected static final String MONGO_TEMPLATE = "primaryMongoTemplate"; }
3.6 第二数据源
package com.lm.second.config; import org.springframework.context.annotation.Configuration; import org.springframework.data.mongodb.repository.config.EnableMongoRepositories; /** * @author * 第二数据源 数据层 */ @Configuration @EnableMongoRepositories(basePackages = "com.lm.second.repository.secondary", mongoTemplateRef = SecondaryMongoConfig.MONGO_TEMPLATE) public class SecondaryMongoConfig { protected static final String MONGO_TEMPLATE = "secondaryMongoTemplate"; }
3.7 数据层接口
package com.lm.second.repository.primary; import org.springframework.data.mongodb.repository.MongoRepository; import com.lm.second.entity.PrimaryMongoObject; public interface PrimaryRepository extends MongoRepository<PrimaryMongoObject, String> { }
3.8 业务层实现
package com.lm.second.dao; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.lm.second.entity.PrimaryMongoObject; import com.lm.second.entity.SecondaryMongoObject; import com.lm.second.repository.primary.PrimaryRepository; import com.lm.second.repository.secondary.SecondaryRepository; /** * 业务实现 * * @date 2017年10月14日 * */ @Service public class SecondMongoObjectDaoImpl implements SecondMongoObjectDao { @Autowired private PrimaryRepository primaryRepository; @Autowired private SecondaryRepository secondaryRepository; @Override public void savePrimary(PrimaryMongoObject primaryMongoObject) { primaryRepository.save(primaryMongoObject); } @Override public void saveSecondary(SecondaryMongoObject secondaryMongoObject) { secondaryRepository.save(secondaryMongoObject); } @Override public long getCount(String value) { long primary = primaryRepository.findAll().size(); long secondary = secondaryRepository.findAll().size(); return (primary + secondary); } }
3.9 实例
package com.lm.second; import java.util.Date; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import com.lm.first.AppTest; import com.lm.second.dao.SecondMongoObjectDao; import com.lm.second.entity.PrimaryMongoObject; import com.lm.second.entity.SecondaryMongoObject; public class SecondMongoDaoTest extends AppTest { @Autowired private SecondMongoObjectDao secondMongoObjectDao; @Test public void testSavePrimary() throws Exception { PrimaryMongoObject primaryMongoObject = new PrimaryMongoObject(); primaryMongoObject.setId("p1" + new Date().getTime()); primaryMongoObject.setValue("xiaoming1"); secondMongoObjectDao.savePrimary(primaryMongoObject); } @Test public void testSaveSecondary() { SecondaryMongoObject secondaryMongoObject = new SecondaryMongoObject(); secondaryMongoObject.setId("s1" + new Date().getTime()); secondaryMongoObject.setValue("xiaoming1"); secondMongoObjectDao.saveSecondary(secondaryMongoObject); } @Test public void testGetCount() { long count = secondMongoObjectDao.getCount("xiaoming"); System.out.println("===============================count:" + count); } }
3.10 演示效果
数据统计结果
4.代码地址
Github:https://github.com/a123demi/spring-boot-integration相关文章推荐
- 四.SpringBoot集成实例系列-注解型多数据源mybatis
- 一. SpringBoot集成实例系列-xml型单数据源mybatis
- 六.SpringBoot集成实例系列-单数据源mongodb(权限控制)
- 三.SpringBoot集成实例系列-注解型单数据源mybatis
- 七.SpringBoot集成实例系列-多数据源mongodb(一)
- springboot配置多数据源的实例(MongoDB主从)
- 五.SpringBoot集成实例系列-邮件email文章列表
- 二.SpringBoot集成实例系列-xml型多数据源mybatis
- 八.SpringBoot集成实例系列-持久化jpa
- springboot Mongodb的集成与使用实例详解
- Spring Boot 系列 | 第八篇:集成MongoDB
- springboot 集成cxf完整实例
- [Spring Boot 系列] 集成maven和Spring boot的profile功能
- 微服务,微架构[三]之springboot集成nosql数据库mongodb
- SpringBoot系列十一:SpringBoot整合Restful架构(使用 RestTemplate 模版实现 Rest 服务调用、Swagger 集成、动态修改日志级别)
- SpringBoot系列: 集成MyBatis
- Spring Boot集成mongoDB(十二)
- SpringBoot 集成Kaptcha实现验证码功能实例详解
- Spring Boot 集成 Spring Security 使用自定义的安全数据源
- Redis系列一 - springboot 集成 redis Demo和原理