文章列表
本系列將通過實例分別實現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註解的方法。
如果你要定義一個final的變量,並且不想寫類型,這個可以幫到你。但是,在實際項目中,完全沒有使用到。
這個在參數中使用,如果調用時傳了null,就直接拋空指針。
-
@Data、@ToString、@EqualsAndHashCode、@Getter、@Setter和@RequiredArgsConstructor註解的集合。
作用於屬性和類上,自動生成屬性的getXXX()和setXXX()方法。若在類上,則對所有屬性有效。並可通過AccessLevel參數控制方法的訪問級別。
作用於類,自動重寫類的ToString()方法。常用的參數有exclude(指定方法中不包含的屬性)、callSuper(方法中是否包含父類ToString()方法返回的值)
作用於類,自動重寫類的equals()、hashCode()方法。常用的參數有exclude(指定方法中不包含的屬性)、callSuper(方法中是否包含父類ToString()方法返回的值)
-
@NoArgsConstructor, @RequiredArgsConstructor和@AllArgsConstructor
作用於類,@NoArgsConstructor自動生成不帶參數的構造方法;@RequiredArgsConstructor自動生成帶參數的構造方法,主要針對一些需要特殊處理的屬性,比如未初始化的final屬性;@AllArgsConstructor自動生成包含所有屬性的構造方法。
作用於方法,可鎖定指定的對象,如果不指定,則默認創建創建一個對象鎖定。
作用於類,具體包含@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.代碼地址