Spring-Boot的自动配置原理
- 自动配置通过spring-boot-starter-xxx实现(官方)
- 或者通过xxx-spring-boot-starter实现(民间)
- @SpringBootApplication => @EnableAutoConfiguration 开启自动配置(注解只是一个标记具体如何实现下文解答)
以mybatis为例
把mybatis集成到spring需要哪些东西
- 导入依赖
- 配置文件 data.properties
-
- 配置类
.a. 数据源
b. 事务管理器
c. SqlSessionFactoryBean
- 配置类
编写配置类
RootConfig配置,修改包路径
@Configuration
@ComponentScan("com.woniuxy.framework")
@PropertySource("classpath:app.properties")
@EnableTransactionManagement
@MapperScan("com.woniuxy.framework.dao")//将指定的包下的接口作为mybatis的mapper,注入到spring容器中,并提供实现
public class RootConfig {
@Value("${jdbc.url}")
private String jdbcUrl;
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
@Value("${jdbc.driverClassName}")
private String driver;
//数据源
@Bean(destroyMethod = "close")
public DruidDataSource dataSource(){
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl(jdbcUrl);
dataSource.setUsername(username);
dataSource.setPassword(password);
dataSource.setDriverClassName(driver);
return dataSource;
}
//事务
@Bean
public PlatformTransactionManager transactionManager(){
return new DataSourceTransactionManager(dataSource());
}
/**
* 配置事务模板
* @return
*/
@Bean
public TransactionTemplate txTemplate(){
return new TransactionTemplate(transactionManager());
}
//sqlSessionFactoryBean配置,替代mybatis-config.xml
@Bean
public SqlSessionFactoryBean sqlSessionFactoryBean() throws IOException {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
//数据源
sqlSessionFactoryBean.setDataSource(dataSource());
//别名包
sqlSessionFactoryBean.setTypeAliasesPackage("com.woniuxy.framework.model");
org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
//下划线映射到驼峰
configuration.setMapUnderscoreToCamelCase(true);
//日志
configuration.setLogImpl(StdOutImpl.class);
sqlSessionFactoryBean.setConfiguration(configuration);
//配置文件位置
PathMatchingResourcePatternResolver patternResolver = new PathMatchingResourcePatternResolver();
Resource[] resources = patternResolver.getResources("classpath*:mappers/**/*.xml");
sqlSessionFactoryBean.setMapperLocations(resources);
return sqlSessionFactoryBean;
}
}
其中最重要的就是SqlSessionFactoryBean
到了SpringBoot之后呢这些配置都省略了,只需要写一个配置application。yml(properti)
server:
port: 8888 #端口号
spring:
datasource: #数据库配置
#type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql:///user?characterEncoding=UTF-8
username: root
password:
mybatis-plus: #mybatis配置
mapper-locations: classpath:mappers/**/*.xml
configuration:
map-underscore-to-camel-case: true
log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl
type-aliases-package: com.woniuxy.model
logging:
level: #日志文件
com.woniuxy: debug
这中间发生了什么呢?
在spring中集成mybatis加入的依赖是mybatis和mybatis-spring
而到了spring-boot中呢加入的依赖是mybatis-spring-boot-starter
mybatis-spring-boot-starter中有些什么依赖
传递依赖,简化依赖
- mybatis
- mybatis-spring
其中mybatis-spring-boot-starter还帮我们写了SqlSessionFactoryBean
**
spring-boot-starter原理:
**
• 扫描,读取 META-INF/spring.factories
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.mybatis.spring.boot.autoconfigure.MybatisLanguageDriverAutoConfiguration,\
org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration
EnableAutoConfiguration,这是注解,对应了两个类,
- MybatisLanguageDriverAutoConfiguration
- MybatisAutoConfiguration
定位到自动配置类 ,此处名为MybatisAutoConfiguration
@org.springframework.context.annotation.Configuration 标记此类为配置类
@ConditionalOnClass({ SqlSessionFactory.class, SqlSessionFactoryBean.class })如果有这三个注解就启动配置类SqlSessionFactoryBean SqlSessionFactory DataSource
@ConditionalOnSingleCandidate(DataSource.class)
@EnableConfigurationProperties(MybatisProperties.class) 关联一个配置属性类
@AutoConfigureAfter({ DataSourceAutoConfiguration.class, MybatisLanguageDriverAutoConfiguration.class })
public class MybatisAutoConfiguration implements InitializingBean {
....
@Bean//自动配置了SQLSessionFactoryBean
@ConditionalOnMissingBean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
...
}
- Configuration 标记此类为配置类
- ConditionalOnClass,表示如果你的类路径上有SqlSessionFactory,
- SqlSessionFactoryBean,DataSource就启动这个配置类
- EnableConfigurationProperties关联一个配置属性类
- AutoConfigureAfter自动配置数据源
SQLSessionFactoryBean里面配置了所有需要的配置,
DataSource ,像spring容器请求注入一个DataSource
SQLSessionFactoryBean里面配置了
- configlocation
- configurationproperti
- typealiasespackage
- mapperlocations等各种配置
通过自动配置类,定位配置属性类,配置属性类有前缀,能够将外化配置直接转化为Java类的属性
@ConfigurationProperties(prefix = MybatisProperties.MYBATIS_PREFIX)//前缀
// 外化配置的内容与java属性的对应方式,前缀.属性名 mybatis.mapper-location
public class MybatisProperties {
public static final String MYBATIS_PREFIX = "mybatis";
private static final ResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver();
/**
* Location of MyBatis xml config file.
*/
private String configLocation;
/**
* Locations of MyBatis mapper files.
*/
private String[] mapperLocations;
ConfigurationProperties。配置的属性类
public static final String MYBATIS_PREFIX = “mybatis”;这是前缀名,
mybatis-plus: #mybatis配置
mapper-locations: classpath:mappers/**/*.xml
configuration:
map-underscore-to-camel-case: true
resources里面的配置都是加上前缀后识别到的
private String configLocation;##