SpringBoot基础知识

本文记录spring boot的相关基础知识与基本配置。
Spring Boot是基于Spring5.0以上的一些库的集合,简化spring应用的搭建与开发过程。Srping Boot需要JDK1.8以上支持。

Spring的几种注解

@Configuration

java bean 配置

1
2
3
4
@Configuration
public class SomeConfig{
//bean的相关定义
}

@Bean

定义java bean, 可以在配置中通过ref的方式配置bean与bean之间的依赖

1
2
3
4
5
6
7
@Configuration
public class SomeConfig{
@Bean
public DosomethingService dosomethingService(){
return new DosomethingServiceImpl();
}
}
1
2
3
<bean id="beanid" class="beanclass">
<property name="depended_bean_name" ref="depended_bean" />
</bean>

@ComponentScan

从定义的路径中扫描所有标识了需要装配的类,自动装配到spring的bean容器中。
自动装配的类包括标识了以下注解的bean:
@Controller,@Service,@Repository,@Component

1
2
3
4
5
@ComponentScan(value="com.chibao.test")
@Configuration
public class MainScanConfig {
//自动扫描com.chibao.test下所有@Controller,@Service,@Repository,@Component,@Configuration等bean
}
1
2
3
4
5
6
7
8
9
10
11
package com.chibao.test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class TestMain {
public static void main(String[] args) {
AnnotationConfigApplicationContext app = new AnnotationConfigApplicationContext(MainScanConfig.class);
String[] definitionNames = app.getBeanDefinitionNames();
for (String name : definitionNames) {
System.out.println(name);
}
}
}

其他参数:

  • basePackageClasses
    补充扫描该类所属package中所有符合规则的bean,所配置的class不需要有对应的注解,可以是普通类
    @ComponentScan(value="com.chibao.test",basePackageClasses=UserInfoDao.class)
  • includeFilters
    定义过滤器,这样就只有符合过滤器要求的bean才被装配,也可以自动以过滤类(实现TypeFilter接口)
    @ComponentScan(value="com.chibao.test",includeFilters={@Filter(type=FilterType.ASSIGNABLE_TYPE,classes= {UserInfoDaoImpl.class})})

    @PropertySource @PropertySources

    将参数加载到spring的enviroment中
    1
    2
    3
    4
    5
    6
    7
    8
    9
    @PropertySource("classpath:/config/config.properties")
    @PropertySource("classpath:${config_path}")
    public class UserController {
    @Autowired
    Environment env;
    public void test() {
    System.out.println(env.getProperty("testname"));
    }
    }
    PropertySource的路径中如果涉及到其他环境参数,那么其他环境参数的加载必须在前面(不一定是同一个类中,但需要在前面已经加载了),使用${参数名}进行引用

    @Import

    将多个分开的容器的配置合并到一个
    1
    2
    3
    4
    5
    6
    @ComponentScan(value="com.chibao.test")
    @Import(SubScanConfig.class)
    @Configuration
    @PropertySource("classpath:config/config_base.properties")
    public class MainScanConfig {
    }
    以上代码中,会将SubScanConfig中配置的bean都合并到MainScanConfig中,同样如果SubScanConfig.class已经在定义的扫描范围内,也会被合并进来,不需要再Import

spring boot的核心功能

  • 独立运行的 Spring 项目
    Spring Boot 可以以 jar 包的形式独立运行
  • 内嵌 Servlet 容器
    Spring Boot 可选择内嵌 Tomcat、Jetty 或者 Undertow。
  • 提供 starter 简化 Maven 配置
    Spring 提供了一系列的 starter pom 来简化 Maven 的依赖加载。
  • 自动配置 Spring
    Spring Boot 会根据在类路径中的 jar 包、类,为 jar 包里的类自动配置 Bean
  • 准生产的应用监控
    Spring Boot 提供基于 http、ssh、telnet 对运行时的项目进行监控
  • 无代码生成和 xml 配置
    提供各种注解减少xml配置

*此章节部分摘抄至网络

搭建spring boot应用

可以通过spring官网提供的脚手架,新建spring boot应用,依赖包可以用maven或者gradle等。
如果需要离线使用或者内网使用,可以用maven等下载依赖后将所有jar包复制到内网项目中。
通过@SpringBootApplication启动spring boot应用

1
2
3
4
5
6
@SpringBootApplication
public class SpringbootApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootApplication.class, args);
}
}

@SpringBootApplication是@Configuration、@EnableAutoConfiguration、@ComponentScan三个注解的复合注解,效果一样

1
2
3
4
5
6
7
8
@Configuration
@EnableAutoConfiguration
@ComponentScan
public class SpringbootApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootApplication.class, args);
}
}
  • @EnableAutoConfiguration主要实现@Import(EnableAutoConfigurationImportSelector.class)

    待确认:在spring实例化bean的过程中,如果被实例化的bean构造方法使用了Autowired的bean或报空指针,如Environment

    1
    2
    3
    4
    5
    6
    7
    8
    @Controller
    public class UserController {
    @Autowired
    Environment env;
    public UserController() {
    System.out.println(env.getProperty("testname"));
    }
    }

    SpringApplicationRunListener

    监听spring boot 的生命周期,需要在spring.factories中配置:org.springframework.boot.SpringApplicationRunListener

    ApplicationListener

    实现ApplicationListener后,通过onApplicationEvent方法监听消息,在springboot启动的时候,可以通过ConfigurableApplicationContext.addApplicationListener添加监听器
    1
    context.addApplicationListener(context.getBean(SpringRunListener.class));

    ApplicationContextInitializer

    CommandLineRunner

    用于在应用启动后(springboot已经装配完所有的bean)加载数据,多个CommandLineRunner可以通过@Order注解进行排序
    1
    2
    3
    4
    5
    6
    7
    @Component
    @Order(value = 1)
    public class AppCommandLineRunner implements CommandLineRunner {
    @Override
    public void run(String... args) throws Exception {
    }
    }

SpringBoot基础知识
http://blog.colorccm.com/2020/09/14/it/springboot/
作者
Chibao Chan
发布于
2020年9月14日
许可协议