Spring boot 学习整理(三)注解介绍、mybaits配置、c3p0配置、log4j配置

10 篇文章 0 订阅
2 篇文章 0 订阅

@SpringBootApplication

首先当然是这个最为关键的注解,由这个注解可以将项目启动

@SpringBootApplication
public class ReadingListApplication {

	public static void main(String[] args) {
		SpringApplication.run(ReadingListApplication.class, args);
	}

}

@SpringBootApplication 开启了spring的组件扫描和Springboot的字段配置功能。实际上,@SpringBootApplication将三个有用的注解组合在了一起

  1. Spring的@Configuration:将该类使用的spring基于java的配置,也就是说采用java代码的方式来配置各项参数,而不是通过xml方式的配置。
  2. Spring的@Componentscan:启动组件扫描,这样你写的web控制器类和其他组件才能被自动发现并注册为Spring 应用程序上下文里的Bean。
  3. 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
@ConditionalOnClassClasspath里有指定的类
@ConditionalOnMissingClassClasspath里缺少指定的类
@ConditionalOnExpression给定的Spring Expressiion Language(SpEL)表达式计算结果为true
@ConditionalOnJavajava版本匹配特定值或某一个值的范围
@ConditionalOnJndi参数中给定的JNDI位置必须存在一个,如果没有给参数,则要有JNDI InitialContext
@ConditionalOnProperty指定的配置属性要有一个明确的值
@ConditionalOnResourceClasspath里有指定的资源
@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();
    }
}

这样也就配置完毕。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值