SpringBoot的常用配置项

一、SpringBoot的定位

SpringBoot是Spring发布的一个开源项目,旨在微服务大行其道的当下,帮助开发者快速地构建项目。Sp其采用了约定大于配置的设计理念,使开发者在使用Spring时可以省去大量的XML配置。 用自己的话总结就是,SpringBoot是一个采用默认(约定)配置集成了当下流行的大部分框架的项目,引用第三方框架只需要引入对应的启动器starter即可。其核心是自动化配置(参考Spring 4.0的条件化配置)。

二、项目属性配置

在当前项目组中,很多Spring或者SpingBoot项目都是采用的PropertiesLoader手动注入属性配置。Spring作为一个成熟的框架,提供了非常灵活方便的属性注入功能。推荐大家使用Spring和Springboot的属性注入特性,避免重复造轮。
SpringBoot属性注入方式有以下两种方式:
1. 传统Spring注入:@PropertySource注解指定要加载的配置文件,@Value配置在对应属性上指定要注入的值。

    @PropertySource("config.properties")
    public class Config {
    
    	@Value("${name}")
    	private String name;
    
    	@Value("${address}")
    	private String address;
    }
  1. SpringBoot注入:通过@ConfigurationProperties注解实现。相比传统@Value注入,这种方式只需要在类上注解即可,无需在每个属性上配置且支持Relaxed Bind(即userName能够识别userName/user—name/user_name等)。其实现原理是通过set方法注入,因此需保证存在对应set方法。该注解可以和@Bean搭配使用,在将该Bean加入Spring容器前,依据指定配置对相应属性进行初始化,
    @SpringBootApplication
    public class DemoApplication {
    
    	public static void main(String[] args) {
    		ConfigurableApplicationContext ctx = SpringApplication.run(DemoApplication.class, args);
    		Person person = ctx.getBean(Person.class);
    		System.out.println(person);
    	}
        
    	@Bean
    	@ConfigurationProperties("person")
    	public Person person(){
    		  return new Person();
    	}
    }
  1. 在通常的项目中,配置多位类的静态属性,并非以对象的形式存在。比如当项目中集成了公司Redis或kafaka时。推荐做法是,所有对象尽量都用Spring进行管理。但在必要时,可以通过下面的方法将值注入到静态方法中:
    为所有的静态属性添加非static的set方法,类上添加@ConfigurationProperties注解,通过set方法注入属性。

数据源/多数据源

集成kafka(针对公司内部封装的kafka-sdk)

在前几周的实际需求中遇到一个kafka和Spring集成的问题。问题描述:日志中打印了kafka已经收到发来的消息,但数据却没入库,导致项目延期。经过教训后决定对公司封装的kafka深入了解一下。
核心类:

  1. KafkaClientsConfig,配置类,单例模式,负责读取和解析kafka-clients-cfg.xml配置
  2. Consumer,消费者,最核心类,负责启动消费者和从服务器获取连接,和topic对应。
    3.IConsumerHandler,任务处理实现类,内部包含对应topic的Consumer.该类将kafka消息和业务代码进行关联。有两个子类IConsumerHandler和IConsumerBatchHandler,分别处理单消息和批量处理。
  3. KafkaStream,流式记录的抽象,是一个无界的数据集。可简单理解为kafka服务器到程序之间的消息数据流。
    启动流程:
  4. 通过KafkaClientsConfig类实例化时,解析配置文件,生成单列对象,通过Map保存所有topic信息,其中key为xml中id节点的值。
  5. 调用Consumer.startReceive(),该方法调kafka官方api createMessageStreams()将自身注册到topic上,获得KafkaStream,并将其封装成ConsumerTask放入线程池中执行后续操作。
  6. 在线程池中,每个ConsumerTask携带一个KafkaStream,可以对该流进行迭代获取消息内容。拉取数据规则(largest/smallest)由KafkaClientsConfig配置决定。问题在于对该流进行迭代时,如何能获取到之后的数据呢,
    经深究后发现,该流的迭代器实现了类似阻塞队列的实现,当前流中无数据时,线程被阻塞。保证了只用在web容器在启动时,启动该线程即可。
    总结:
    由于生产者比较简单,本次只对消费者进行说明。公司封装的Kafka是独立于业务项目的,无论是war或timer,只需调用入口方法,即可完成Kafka的启动。本次问题在于通过默认的consumer.startReceive()方法启动消费者时,
    Consumer和ConsumerHandler都是通过new()的对象,,导致ConsumerHandler中Service未被注入。解决方式是:ConsumerHandler使用Spring管理,通过consumer.setHandler(iConsumerHandler)将Handler注入即可。

集成Mybatis + 多数据源

在一个项目中访问不同数据库是非常常见的一种情形。SpringBoot采用条件化配置,其自动生成数据源只需满足三个条件:

  1. ClassPath中包含JDBC的引用
  2. 配置文件中有指定格式的数据库链接信息
  3. 未手动配置过数据源
    SpringBoot默认提供单一数据源,且一旦手动配置过数据源,SpringBoot就不再生成数据源,因此多个数据源均需手动配置。以Mybatis为例步骤如下:
    1.添加多数据源配置,依据SpringBoot属性注入原则,需保持属性字段与数据源DataSource属性匹配的字段。
    # 数据源1
    db.driverClassName=com.mysql.jdbc.Driver
    db.jdbc-url=jdbc:mysql://127.0.0.1:3306
    db.username=
    db.password=

    # 数据源2
    db2.driverClassName=com.mysql.jdbc.Driver
    db2.jdbc-url=jdbc:mysql://127.0.0.1:3306
    db2.username=
    db2.password=

2.添加数据源相关Bean。即创建被Spring管理的数据源以替换默认数据源,创建MyBatis核心类SqlSessionFactory和sqlSessionTemplate

@Configuration
@MapperScan(basePackages="com.qiriver.tools.monkey.**.mybatis", sqlSessionTemplateRef = "sqlSessionTemplate")
public class DataSourceConfig {

	@Bean(name="dataSource")
	@ConfigurationProperties("spring.datasource.db")
	public DataSource dataSource(){
		return DataSourceBuilder.create().build();
	}

	@Bean(name = "sqlSessionFactory")
	@Primary
	public SqlSessionFactory test1SqlSessionFactory(@Qualifier("dataSource") DataSource datasource)
			throws Exception {
		SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
		bean.setDataSource(datasource);
		bean.setMapperLocations(
				// 设置mybatis的xml所在位置,通过不同的包结构,来区别不同Mapper采用的数据源。
				new PathMatchingResourcePatternResolver().getResources("classpath*:com/qiriver/tools/monkey/**/mybatis/*.xml"));
		return bean.getObject();
	}

	@Bean("sqlSessionTemplate")
	@Primary
	public SqlSessionTemplate test1sqlsessiontemplate(
			@Qualifier("sqlSessionFactory") SqlSessionFactory sessionfactory) {
		return new SqlSessionTemplate(sessionfactory);
	}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值