SpringBoot基于Spring的项目搭建框架,相较于Spring简化了配置而已
SpringBoot的核心:
自动配置:针对很多Spring应用程序常见的应用功能,Spring Boot能自动提供相关配置
起步依赖:告诉Spring Boot需要什么功能,它就能引入需要的库。
命令行界面:这是Spring Boot的可选特性,借此你只需写代码就能完成完整的应用程序,无需传统项目构建。
Actuator:让你能够深入运行中的Spring Boot应用程序,一探究竟。
由于我项目的原因,命令行界面和Actuator未曾涉及。示例项目采用框架SpringBoot+jpa ,项目管理采用gradle
1. 首先就项目,看SpringBoot的核心特点:
build.gradle的配置文件
从配置文件中可以看到,jar包的依赖方式为,是因为SpringBoot将常用的jar包进行了功能性的分类,你需要什么功能,秩序配置上功能,SpringBoot会自定将改功能需要的jar包依赖进来(起步依赖),并根据你配置的功能自动进行配置(自动配置)
compile('org.springframework.boot:spring-boot-starter-data-redis')
buildscript {
ext {
springBootVersion = '2.1.0.BUILD-SNAPSHOT'
}
repositories {
mavenCentral()
maven { url "https://repo.spring.io/snapshot" }
maven { url "https://repo.spring.io/milestone" }
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8
repositories {
mavenCentral()
maven { url "https://repo.spring.io/snapshot" }
maven { url "https://repo.spring.io/milestone" }
}
dependencies {
compile('org.springframework.boot:spring-boot-starter-data-mongodb')
compile('org.springframework.boot:spring-boot-starter-data-redis')
compile('org.springframework.boot:spring-boot-starter-data-jpa')
compile('org.springframework.boot:spring-boot-starter-jdbc')
compile('org.springframework.boot:spring-boot-starter-aop')
// compile('org.springframework.boot:spring-boot-starter-security')
compile('org.springframework.boot:spring-boot-starter-web')
// compile('org.springframework.cloud:spring-cloud-starter-oauth2')
compile('com.alibaba:druid-spring-boot-starter:1.1.9')
compile('com.alibaba:fastjson:1.2.3')
compile fileTree(dir:'libs',include:['*.jar'])
runtime('mysql:mysql-connector-java')
compile('org.projectlombok:lombok:1.16.20')
compile('commons-lang:commons-lang:2.5')
compile('org.springframework.boot:spring-boot-configuration-processor')
compile('commons-lang:commons-lang:2.5')
// providedRuntime('org.springframework.boot:spring-boot-starter-tomcat')
testCompile('org.springframework.boot:spring-boot-starter-test')
testCompile('org.springframework.security:spring-security-test')
}
2.SpringBoot特有的配置文件.yml文件
SpringBoot的项目在创建的时候,会在根目录下自动生成一个 项目名.java 的文件,启动项目只需要运行改java文件的main方法即可,因为SpringBoot有自己内置的Tomcat(具体有哪些,可自行百度)等web容器,而容器的监听端口和ip可以在.yml中配置,.yml文件还包含jdk的编译版本,编码等。
#spring:
# profiles:
# active: ${SPRING_PROFILES_ACTIVE:dev}
# application:
# name: auth-server
#
# jpa:
# open-in-view: true
# database: POSTGRESQL
# show-sql: true
# hibernate:
# ddl-auto: update
# datasource:
# platform: postgres
# url: jdbc:postgresql://192.168.1.140:5432/auth
# username: wang
# password: yunfei
# driver-class-name: org.postgresql.Driver
# redis:
# host: 192.168.1.140
server:
port: 9999
address: 127.0.0.1
# SPRING PROFILES
spring:
# HTTP ENCODING
http:
encoding.charset: UTF-8
encoding.enable: true
encoding.force: true
# mvc:
# view.prefix: /jsp/
# view.suffix: .jsp
#jpa配置
# jpa:
# database: mysql
# generate-ddl: true
# show-sql: true
# hibernate:
# ddl-auto: update
# naming:
# physical-strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
logging.level.org.springframework.security: DEBUG
logging.leve.org.springframework: DEBUG
2. SpringBoot应用
SpringBoot即可根据依赖jar包进行配置,还能够手动进行配置,不过配置的方式为注解。
package com.example.gradle_boot.conf;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateSettings;
import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.persistence.EntityManager;
import javax.sql.DataSource;
import java.util.Map;
/**
* Created by ding on 2018/4/17.
*/
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef="entityManagerFactoryPri",
transactionManagerRef="priTransactionManager",
basePackages= { "com.example.gradle_boot.mapper.primary" }) //设置Repository所在位置 //fixme
public class PrimaryDataSource {
@Autowired
@Qualifier("priDataSource")
private DataSource priDataSource;
@Primary
@Bean(name = "entityManagerPri")
public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
return entityManagerFactoryPri(builder).getObject().createEntityManager();
}
@Primary
@Bean(name = "entityManagerFactoryPri")
public LocalContainerEntityManagerFactoryBean entityManagerFactoryPri (EntityManagerFactoryBuilder builder) {
return builder
.dataSource(priDataSource)
.properties(getVendorProperties())
.packages("com.example.gradle_boot.entity.primary") //设置实体类所在位置
.persistenceUnit("priPersistenceUnit")
.build();
}
@Autowired
private JpaProperties jpaProperties;
private Map<String, Object> getVendorProperties() {
return jpaProperties.getHibernateProperties(new HibernateSettings());
}
/**
* 配置事物管理器
* @return
*/
@Bean(name = "priTransactionManager")
@Primary
public PlatformTransactionManager writeTransactionManager(EntityManagerFactoryBuilder builder) {
return new JpaTransactionManager(entityManagerFactoryPri(builder).getObject());
}
}
DataSource的配置:EnableJpaRepositories注解的basePackage指定的是repostoy的包名,这样在扫描注解的时候才能扫描到,但是当不用框架查询直接用template查询的时候,直接注入即可,该basePackage不配置也可。
package com.example.gradle_boot.conf;
import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import com.mongodb.MongoClient;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.mongo.MongoProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cache.CacheManager;
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 org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.jdbc.core.JdbcTemplate;
import javax.sql.DataSource;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* Created by ding on 2018/4/17.
*/
@Configuration
public class SpringConfigration {
@Primary
@Bean(name="priDataSource")
@Qualifier("priDataSource")
@ConfigurationProperties("spring.datasource.primary")
public DataSource dataSourcePri(){
System.out.println(" Primary mysql datasource 初始化...");
return DruidDataSourceBuilder.create().build();
}
@Bean(name="auxDataSource")
@Qualifier("auxSource")
@ConfigurationProperties("spring.datasource.auxiliary")
public DataSource dataSourceAux(){
System.out.println(" Auxiliary mysql datasource 初始化...");
return DruidDataSourceBuilder.create().build();
}
//mongo 多数据源配置
@Autowired
private MultipleMongoProperties mongoProperties;
@Primary
@Bean(name = PrimaryMongoConfig.MONGO_TEMPLATE)
public MongoTemplate primaryMongoTemplate() throws Exception {
System.out.println(" mongo primary 初始化...");
return new MongoTemplate(primaryFactory(this.mongoProperties.getPrimary()));
}
@Bean
@Primary
public MongoDbFactory primaryFactory(MongoProperties mongo) throws Exception {
MongoCredential credential = MongoCredential.createScramSha1Credential(mongo.getUsername(), mongo.getDatabase(), mongo.getPassword());
List<ServerAddress> addresses = new ArrayList<ServerAddress>();
for(String hosts : mongo.getHost().split(",")) {
ServerAddress address = new ServerAddress(hosts, mongo.getPort());
addresses.add(address);
}
MongoClient mongoClient = new MongoClient(addresses, Arrays.asList(credential));
return new SimpleMongoDbFactory(mongoClient,mongo.getDatabase());
}
@Bean
@Qualifier(AuxiliaryMongoConfig.MONGO_TEMPLATE)
public MongoTemplate auxiliaryMongoTemplate() throws Exception {
System.out.println(" mongo secondary 初始化...");
return new MongoTemplate(auxiliaryFactory(this.mongoProperties.getAuxiliary()));
}
@Bean
public MongoDbFactory auxiliaryFactory(MongoProperties mongo) throws Exception {
MongoCredential credential = MongoCredential.createScramSha1Credential(mongo.getUsername(), mongo.getDatabase(), mongo.getPassword());
List<ServerAddress> addresses = new ArrayList<ServerAddress>();
for(String hosts : mongo.getHost().split(",")) {
ServerAddress address = new ServerAddress(hosts, mongo.getPort());
addresses.add(address);
}
MongoClient mongoClient = new MongoClient(addresses, Arrays.asList(credential));
return new SimpleMongoDbFactory(mongoClient,mongo.getDatabase());
}
}
将dataSource给SpringBoot管理。
我的项目中配置了mysql和mongo的多数据源,但是时在用mongoTample查询的时候注入的队形总是错误的,不能正确的注入mongoTample对象,需要用注解@Qualifier("auxiliaryMongoTemplate")指定bean的名称,才能正常注入