七.SpringBoot集成实例系列-多数据源mongodb+lombok(二)

版权声明:本文为博主原创文章,转载请注明原地址 https://blog.csdn.net/a123demi/article/details/78239251
文章列表

本系列将通过实例分别实现Springboot集成mybatis(mysql),mail,mongodb,cassandra,scheduler,redis,kafka,shiro,websocket。
具体文章系列如下:
八.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字节码
由于本文实例开发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.代码地址

猜你喜欢

转载自blog.csdn.net/a123demi/article/details/78239251
今日推荐