@SpringBootApplication
首先当然是这个最为关键的注解,由这个注解可以将项目启动
@SpringBootApplication
public class ReadingListApplication {
public static void main(String[] args) {
SpringApplication.run(ReadingListApplication.class, args);
}
}
@SpringBootApplication 开启了spring的组件扫描和Springboot的字段配置功能。实际上,@SpringBootApplication将三个有用的注解组合在了一起
- Spring的@Configuration:将该类使用的spring基于java的配置,也就是说采用java代码的方式来配置各项参数,而不是通过xml方式的配置。
- Spring的@Componentscan:启动组件扫描,这样你写的web控制器类和其他组件才能被自动发现并注册为Spring 应用程序上下文里的Bean。
- Spring的@EnableAutoConfiguration:这个不起眼的小注解也可以成为@Abracadabra,就是这一行配置开启了Spring Boot 自动配置的魔力,让你不用再写成篇的配置了。
@Entity:该注解表明他是一个JPA的实体
@Id:主键id的标示
@GeneratedValue:和@Id配合使用,标示这个字段的值是自动生成的
例如:
@Entity
public class Book{
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
........
}
有关于Springboot 的自动配置
关于这些内容Springboot 有一些很有趣的注解下面来介绍一些
在springboot中有个名为spring-boot-autoconfigure的jar文件,其中包含了很多配置类。每个配置类都在应用程序的Classpath中,都有机会为应用程序的配置添砖加瓦。
实现Condition接口,覆盖他的matches()方法,可以条件话的忽略和启用这些配置,在满足某些特定的条件之前都忽略这个配置
@Conditional:这个注解传入一个class类,先看一下例子吧
public class JdbcTemplateCondition implements Condition{
@override
public boolean matches(ConditionContext context,AnnotatedTypeMetadata metadata){
try{
context.getClassLoader().loadClass("
org.springframework.jdbc.JdbcTemplate");
return true;
} catch (Exception e){
return false;
}
}
}
.........
@Conditional(JdbcTemplateCondition.class)
public MyService myservice(){
........................
}
在这个例子中,只有当JdbcTemplateCondition类的条件成立时,才会创建MysService这个Bean。也就是说MyService Bean创建的条件是Classpath里有JdbcTemplate。否则这个Bean的声明就会被忽略。
通过这些个简单的条件Spring boot 实现了中的配置的功能,当然还更多的条件化注解。
条件化注解 | 配置生效条件 |
---|---|
@ConditionalOnBean | 配置了某个特定的Bean |
@ConditionalOnMissingBean | 没有配置特定的Bean |
@ConditionalOnClass | Classpath里有指定的类 |
@ConditionalOnMissingClass | Classpath里缺少指定的类 |
@ConditionalOnExpression | 给定的Spring Expressiion Language(SpEL)表达式计算结果为true |
@ConditionalOnJava | java版本匹配特定值或某一个值的范围 |
@ConditionalOnJndi | 参数中给定的JNDI位置必须存在一个,如果没有给参数,则要有JNDI InitialContext |
@ConditionalOnProperty | 指定的配置属性要有一个明确的值 |
@ConditionalOnResource | Classpath里有指定的资源 |
@ConditionalOnWebApplication | 这是一个Web程序 |
@ConditionalOnNotWebApplication | 这不是一个web程序 |
例如:
@Configuration
@ConditionalOnClass({DataSource.class,EmbeddedDatabaseType.class})
@EnableConfigurationProperties(DataSourceProperties.class)
@Import({Registrar.class,DataSourcePoolMetadataProvidersConfiguration.class})
public class DataSourceAutoConfiguration{
......................
}
DataSourceAutoConfiguration 上添加了 @ConditionalOnClass 注解,要求Classpath里必须要有 DataSource 和 EmbeddedDatabaseType 。如果它们不存在,条件就不成立,DataSourceAutoConfiguration 提供的配置都会被忽略掉。
@Configuration
@Conditional({DataSourceAutoConfiguration.DataSourceAvailableCondition.class})
proteced static class JdbcTemplateConfiguration{
@Autowired(required = false)
private DataSource daatasource;
@Bean
@ConditionalOnMissingBean(Jdbcoperations.class)
public JdbcTemplate jdbcTemplate(){
return new JdbcTemplate(this.daatasource);
}
}
JdbcTemplateConfiguration 使用了 @Conditional 注解,判断DataSourceAvailableCondition条件是否成立——基本上就是要有一个DataSource Bean或者要自动配置创建一个。假如有DataSource Bean,使用了@Bean注解的jdbcTemplate()方法会配置一个 JdbcTemplate Bean。这个方法上还加了@ConditionalOnMissingBean注解,因此只有不存在Jdbcoperations(即JdbcTemplate 实现的接口)类型的Bean时,才会创建JdbcTemplate Bean。
此处看到的只是 DataSouceAutoConfiguration 的冰山一角,但是也足以说明 spring boot 是如何利用条件化配置来实现自动化配置。
Spring boot自动化配置还支持自动配置微调
目的当然是为了如果只是更改一个属性,从而放弃了整个自动化配置,有点不太好
那么springboot是怎么支持微自动配置微调的呢?
说白了就是在 application.properties 中写一些参数
例如:
server.port=8080 #指定端口号为8080
通过这种形式支持自动配置微调
这里还有一个知识点,如果你的同一个目录下有 .properties 和 .yml 文件,那么.yml 文件会覆盖 .properties 的属性。
Spring Boot 的log4j配置
有关于log4j的配置,Springboot 提供的默认的log 框架为 logback,但是如果不想用这个而是想用log4j的话,就要先排除这个依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<!--排除logback 改用log4j-->
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
排除之后即可添加log4j的配置
需要注意的是
Spring Boot 只有1.3.x和1.3.x以下版本才支持log4j的日志配置,1.3.x以上版本只支持log4j2。
log4j的依赖
<artifactId>spring-boot-starter-log4j</artifactId>
log4j2依赖
<artifactId>spring-boot-starter-log4j2</artifactId>
Spring boot 1.3 以下添加该依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j</artifactId>
</dependency>
Spring boot 1.3 以上添加该依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
如果在spring boot 1.3 以上的版本想用log4j,而不用 log4j2,则使用下面的依赖
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-nop</artifactId>
<version>1.7.25</version>
</dependency>
虽然目前 log4j2 的性能是最好的,但是由于 log4j2 相对于 log4j 来说几乎是完全重写了,肯定有使用不太习惯的地方
这里只是简单的介绍一下该如何配置 log4j
logging:
config: classpath:log4j.properties
通过这样来指定 log4j.properties 文件
配置数据源 Mysql
加入依赖
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
配置数据源 其他的都是自动配置
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8
username: root
password: root
c3p0数据连接池配置
当然在项目的开发中 一般用的都是数据连接池,这里介绍一下c3p0在spring Boot中的配置
maven 依赖
<!-- c3p0 数据库连接池 start -->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version >
</dependency>
<!-- c3p0 数据库连接池 end -->
application.yml 中配置
c3p0:
driverClass: com.mysql.jdbc.Driver
jdbcUrl: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8
user: root
password: root
minPoolSize: 5
maxPoolSize: 500
initialPoolSize: 10
maxIdleTime: 60
acquireIncrement: 5
maxStatements: 0
idleConnectionTestPeriod: 60
acquireRetryAttempts: 30
breakAfterAcquireFailure: false
testConnectionOnCheckout: false
配置了这个之后上面的 spring.datasource 其实就可以去掉了
最后还有配置datasources
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import javax.sql.DataSource;
/**
* c3p0 配置
*/
@Configuration
public class DataSourceConfiguration {
/**
* @Primary 自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常
* @Qualifier 注解的用处:当一个接口有多个实现的时候,为了指名具体调用哪个类的实现
* @Bean 配置Bean
* @ConfigurationProperties
*/
@Bean(name = "dataSource")
@Qualifier(value = "dataSource")
@Primary
@ConfigurationProperties(prefix = "c3p0")
public DataSource dataSource()
{
return DataSourceBuilder.create().type(ComboPooledDataSource.class).build();
}
}
这样也就配置完毕。