- 介绍下开发环境
- JDK版本1.8
- springboot版本是1.5.2
- 开发工具为 intellij idea(2018.2)
- 开发环境为 15款MacBook Pro
结束语
增加自动配置
使用自动配置,我们需要配置的东西很少,也就新增下文件
自动配置官方文档地址如下: 自动配置官方文档
我们需要在 resources
下创建一个目录名叫 META-INF
接着在里面创建一个叫 spring.factories
的文件,里面内容如下:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
// 配置你需要自动配置的文件路径,如果多个文件,用 ,\ 分割
com.example.AutoConfiguration.TestAutoConfiguration
理论上我们还需要在启动类上面配置注解 @EnableAutoConfiguration
但是注解 @SpringBootApplication
已经包含了该注解,所以我们不需要配置该注解 @SpringBootApplication
注解源码如下:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
//已经包含了开启自动配置注解
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
......
然后,我们启动项目,查看日志,发现打印了应该打印的日志,说明自动配置成功
2018-10-18 00:30:22.616 WARN 636 --- [ main] c.e.A.TestAutoConfiguration : 创建 TestAutoConfiguration 成功
2018-10-18 00:30:22.780 INFO 636 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup
2018-10-18 00:30:22.834 INFO 636 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)
2018-10-18 00:30:22.838 INFO 636 --- [ main] d.SpringbootAutoConfigurationApplication : testAutoConfiguration
2018-10-18 00:30:22.842 INFO 636 --- [ main] d.SpringbootAutoConfigurationApplication : Started SpringbootAutoConfigurationApplication in 1.93 seconds (JVM running for 2.42)
前言
很多时候,我们在公司用springboot作为基础框架开发项目的时候,会遇见依赖jar的时候,别的jar里面需要创建一些bean,往往不是很方便,我们需要通过
@ComponentScan
注解来扫描,才能创建上,这时候,自动配置就派上用场了,官方文档上有介绍(需要细细看才能找到),估计很多朋友还不知道,这边写个教程,给各位作参考
如何弄自动配置呢?
这次,我们只在同一个项目内配置,只做演示自动配置,如果是jar,依葫芦画瓢,然后上传到maven私服,普通springboot项目依赖该jar即可
我们先创建一个普通的spring-boot项目,记得添加web依赖,否则,项目不会后台运行
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
创建一个测试自动配置的类(不跟启动类一个目录下,最好单独创建一个目录)
@Configuration(value = "testAutoConfiguration")
public class TestAutoConfiguration {
private static final Logger LOGGER = LoggerFactory.getLogger(TestAutoConfiguration.class);
public TestAutoConfiguration() {
LOGGER.warn("创建 TestAutoConfiguration 成功");
}
}
然后我们在启动类配置下,查看是否会打印创建 TestAutoConfiguration
Bean的日志记录
@SpringBootApplication
// 实现接口 CommandLineRunner 实现 run 方法,这样,项目一启动就会执行run方法内容
public class SpringbootAutoConfigurationApplication implements CommandLineRunner {
private static final Logger LOGGER = LoggerFactory.getLogger(SpringbootAutoConfigurationApplication.class);
@Autowired
private ApplicationContext context;
public static void main(String[] args) {
SpringApplication.run(SpringbootAutoConfigurationApplication.class, args);
}
@Override
public void run(String... strings) throws Exception {
for (String name : context.getBeanDefinitionNames()) {
// 如果存在Bean名称为 testAutoConfiguration 则打印Bean的名称
if("testAutoConfiguration".equals(name)){
LOGGER.info(name);
}
}
}
}
接下来,我们启动项目,查看日志打印,会发现,并没有打印创建 TestAutoConfiguration
跟打印Bean名称的日志,表示没有 TestAutoConfiguration
并没有注册到IOC上,然后我们增加自动配置