Bootstrap

SpringBoot-Day1

1.Springboot入门

  1. 创建Maven工程

  2. 导入spring-boot-stater-web起步依赖

  3. 编写Controller

  4. 提供启动类

2.yml配置信息书写与获取

书写

# 发件人信息
email:
  user: [email protected]
  code: sajdajlwhjfgfkllw
  host: smtp.qq.com
  auth: true
​
# 学生爱好
hobbies:
 - 打篮球
 - 踢足球
 - 打游戏

获取

@Value("${mail.user}")

更便利的方法:

# 要求实体类的成员变量名与配置文件中的键名保持一致
@ConfigurationProperties(prefix = "email")

3.bean扫描

// 启动类
@SpringBootApplication
public class SpringBootQuickstartApplication{
  public static void main(String[] args){
    SpringApplication.run(SpringbootQuickstartApplication.class,args);
  }
}
​
​
//其中@SpringBootApplication包含了以下内容
@SpringBiitConfiguration
@EnableAutoConfiguration
@ComponentScan
public @interface SpringBootApplication{
}
​
//也可以通过@ComponentScan(basePackages="com.example")来扫描包

4.bean注册

如果要注册的bean对象来自第三方,是无法用@Component及其衍生注解声明bean 的

//通过@Bean
​
//直接在启动类中,编写
//注入Country对象
@Bean //将方法返回值交给IOC容器管理,成为IOC容器的bean对象
public Country country(){
  return new Country();
}
​
​
​
​
​
//通过@Import
​
//1.导入配置类
@Import(CommonConfig.class)
@SpringBootApplication
public class SpringBootApplication{
}
​
//2.导入ImportSelector接口实现类
public class CommonImportSelector Implements ImportSelector{
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata){
        return new String[]("com.example.config.CommonConfig");
    }
}
​
​
public class CommonImportSelector implements ImportSelector {
    @Ovrride
    public String[] selectImports(AnnotationMetadata importingClassMetadata){
        // 读取配置文件的内容
        List<String> imports = new ArrayList<>();
        InputStream is = CommonImportSelector.class.getClassLoader().getResourceAsStream("common.imports");
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        String line = null;
        try {
            while((line = br.readLine())!=null){
                imports.add(line);
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            if (br!=null){
                try {
                    br.close();
                }catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
        }
        return imports.toArray(new String[0]);
    }
}

5.注册条件

SpringBoot提供了设置注册生效条件的注解@Conditional

//若配置文件中配置了指定的信息,则注入,否则不注入
@ConditionalOnProperty(prefix = "country",name = {"name","system"})
@Bean
public Country country(@Value("${country.name}") String name,@Value("${country.system}") String system){
    Country country = new Country();
    country.setName(name);
    country.setSystem(system);
    return country;
}
​
//若IOC容器中不存在Country,则注入Province,否则不注入
@Bean
@ConditionalOnMissingBean(Country.class)
public Province province(){
    return new Province();
}
​
//若当前环境中存在DispatcherServlet类,则注入Province,否则不注入
//若当前引入了web起步依赖,则环境中有DispatcherServlet,否则没有
@Bean
@ConditionalOnClass(name = "org.springframework.web.servlet.DispatcherServlet")
public Province province(){
    return new Province();
}

6.自动配置原理

遵循约定大于配置的原则,在boot程序启动后,起步依赖中的一些bean对象会自动注入到ioc容器中

7.自定义starter

@AutoConfiguration //表示当前类是一个自动配置类
public class MyBatisAutoConfig {
   //SqlSessionFactoryBean
   @Bean
   public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource){
   SqlSessionFactoryBean sqlSessionFactoryBean();
   sqlSessionFactoryBean.setDataSource(dataSource);
   return sqlSessionFactoryBean;
   }
   
   //MapperScannerConfigure
   @Bean
   public MapperScannerConfigurer mapperScannerConfigurer(BeanFactory beanFactory){
   MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
   //扫描的包:启动类所在的包及其子包
   List<String> packages = AutoConfigurationPackages.get(beanFactory);
   String p = packages.get(0);
   mapperScannerConfigurer.setBasePackage(p);
   
   //扫描的注解
   mapperScannerConfigurer.setAnnotationClass(Mapper.class);
   return mapperScannerConfigurer;
   }
}

步骤

  1. 创建 dmybatis-spring-boot-autoconfigure 模块,提供自动配置功能,并自定义配置文件 META-INF/spring/xxx.imports

  2. 创建 dmybatis-spring-boot-starter 模块,在starter中引入自动配置模块

;