七.SpringBoot集成實例系列-多數據源mongodb+lombok(二)

文章列表

本系列將通過實例分別實現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常用註解,具體見官網:
  • @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.代碼地址

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章