Junit的推荐用法
@SpringBootTest(classes = 引导类.class) // 表示当前是测试类 指定引导类是谁
@RunWith(SpringRunner.class) // 让junit和spring整合
- Junit不写RunWith的话,Test注解要使用带有api的那个包
SpringBoot自动装配原理
-
大致版
-
SpringBoot
项目启动时会加载Spring-Boot-Autoconfigure
包下的META-INF
下的Spring.factories
文件import
+selector选择器
-
spring.factories
文件配置了120多个自动装配类的路径 -
不是所有的自动装配类都生效,是否生效取决于类似的方法上的条件注解,例:
@ConditionalOnClass(RedisOperations.class)
-
条件注解是否生效又取决于
pom
文件是否导入了对应的starter
-
-
源码版
- 主启动类的
@SpringBootApplication
注解内 - 关键注解:
@SpringBootConfiguration
导入Spring的相关配置、@EnableAutoConfiguration
最重要、@ComponentScan
扫描并导入了一些包到我们的容器内 @EnableAutoConfiguration
中的@Import({AutoConfigurationImportSelector.class})
,该类继承了ImportSelector
,而ImportSelector
中有selectImport
方法,该方法的作用是选取一些类导入到我们的Ioc
容器内
- 主启动类的
-
润色版
自动装配即自动的把我们所需要的bean装载到Ioc容器内,我们如果要实现自动装配,只需要在启动类上加上
@SpringBootApplication
,而@SpringBootApplication
这个注解想要实现自动装配又需要内部包含的@EnableAutoConfiguration
注解,而具体实现自动注入有需要以下三个条件:- 引入的
starter
内部必须包含有@Configuration
注解的启动类,而该组件中需要我们自动注入项目的bean
对象又必须要加上@Bean
注解 - 刚刚提到的配置类比如是放在第三方的jar包中,通过SpringBoot中约定优于配置的理念,把这个配置类的
全路径
放在classpath:/META-INF/spring.factories
文件里面,然后,SpringBoot就可以知道第三方jar
包里面这个配置类的位置,这一步主要是依靠Spring的SpringFactoriesLoader
来实现的 - SpringBoot拿到所有的
第三方jar包
里面的配置类之后,再通过@EnableAutoConfiguration
中的@Import({AutoConfigurationImportSelector.class})
注解里面的AutoConfigurationImportSelector
类中继承了ImportSelector
类中的selectImport
方法实现对这些配置类的动态加载
- 引入的
-
扩展
SpringBoot是约定优于配置的,所以在很多情况下都有这一理念的体现,这一特点可以使程序员更加专注与业务代码的编写,而不是忙于配置的实现;
自动装配的实现在
SpringFramework3.x
版本里面就已经有了雏形,当时基于模块驱动的理念,使用@Enable
注解就能自动打开某个功能,而不需要针对这个功能去增加配置,所以@Enable
注解也是根据相关需要,帮我们去实现相关的bean的注入的
Controller参数
@RequestParam
:http://localhost/user?id=?
@RequestBody
:JSON
@PathVariable
:http://localhost/user/1
- 默认什么也不加:
CommandLineRunner接口和@PostConstruce注解有什么区别
-
CommandLineRunner
接口是SpringBoot
提供的接口,作用是SpringBoot
项目完全启动后,会运行该接口的run
方法,可以做数据的初始化 -
@PostConstruct
: 修饰的方法是在当前类实例化后,属性注入之后就会运行,也可以做数据初始化工作,运行时机早于CommandLineRunner
接口的run
方法@PostConstruct public void init(){ System.out.println("当前类实例化后,属性注入之后就会运行,也可以做数据初始化工作"); }
自制Starter
步骤
-
新建模块并导入所需依赖
-
编写该模块并暴露接口
-
在
resources/MATE-INF/spring.factories
文件编写暴露出的服务的接口的实现类的路径,确保可以自动装配org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ 自己的路径.impl.某serviceImpl
-
所需比如ip等配置需手写一个配置类,从配置文件读取,自定义配置文件结构
-
确保已经测试通过
-
-
引入的模块引入该自定义模块,编写配置类
-
测试
SpringBoot继承异步线程调用
- 在引导类上添加
@EnableAsync
注解开启异步调用 - 在方法上加
@Async
注解(表明要异步调用,默认是新建线程的方式移除调用,如果需要引入线程池可以@Async("线程池beanid")
)