可以创建一个web项目在mian方法打断点,通过debug来看springboot的启动流程
initialize(sources); private void initialize(Object[] sources) { //1、保存主配置类 if (sources != null && sources.length > 0) { this.sources.addAll(Arrays.asList(sources)); } //2、判断当前是否一个web应用 this.webEnvironment = deduceWebEnvironment(); //3、从类路径下找到META-INF/spring.factories配置的所有ApplicationContextInitializer,然后保存起来 setInitializers((Collection) getSpringFactoriesInstances( ApplicationContextInitializer.class)); //4、从类路径下找到ETA-INF/spring.factories配置的所有ApplicationListener setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class)); //5、从多个配置类中找到有main方法的主配置类 this.mainApplicationClass = deduceMainApplicationClass(); }我们自己来写上面运行所需要的对象和监听器,用于代替springboot自带的
创建listener.HelloApplicationContextInitializer public class HelloApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> { @Override public void initialize(ConfigurableApplicationContext applicationContext) { System.out.println("ApplicationContextInitializer...initialize..."+applicationContext); } } 创建listener.HelloSpringApplicationRunListener public class HelloSpringApplicationRunListener implements SpringApplicationRunListener { //必须有的构造器,不然会报错 public HelloSpringApplicationRunListener(SpringApplication application, String[] args){ } @Override public void starting() { System.out.println("SpringApplicationRunListener...starting..."); } @Override public void environmentPrepared(ConfigurableEnvironment environment) { Object o = environment.getSystemProperties().get("os.name"); System.out.println("SpringApplicationRunListener...environmentPrepared.."+o); } @Override public void contextPrepared(ConfigurableApplicationContext context) { System.out.println("SpringApplicationRunListener...contextPrepared..."); } @Override public void contextLoaded(ConfigurableApplicationContext context) { System.out.println("SpringApplicationRunListener...contextLoaded..."); } }下面两个是放在容器中的
创建listener.HelloApplicationRunner @Component public class HelloApplicationRunner implements ApplicationRunner { @Override public void run(ApplicationArguments args) throws Exception { System.out.println("ApplicationRunner...run...."); } } 创建listener.HelloCommandLineRunner @Component public class HelloCommandLineRunner implements CommandLineRunner { @Override public void run(String... args) throws Exception { System.out.println("CommandLineRunner...run..."+ Arrays.asList(args)); } } 配置(模仿META-INF/spring.factories的写法),在resources下创建META-INF/spring.factories org.springframework.context.ApplicationContextInitializer=\ com.sb.listener.HelloApplicationContextInitializer org.springframework.boot.SpringApplicationRunListener=\ com.sb.listener.HelloSpringApplicationRunListener 运行这个部分主要是针对 1、我们自定义的场景需要使用到的依赖是什么? 2、如何编写自动配置?
启动器模块是一个空jar文件,仅提供辅助性依赖管理,这些依赖可能用于自动装配或其他类库
启动器只用来做依赖导入,专门来写一个自动配置模块,启动器依赖自动配置,别人只需要引入启动器(starter)
我们来创建一个工程来进一步认识一下
注意是空工程 创建maven模块 然后再创建一个springboot模块(什么环境都不加),略 给maven模块导入spring模块的starter依赖
<!--启动器--> <dependencies> <!--引入自动配置模块--> <dependency> <groupId>com.starter</groupId> <artifactId>sb-starter</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> </dependencies>删除spring模块的主启动类,把依赖的单元测试和插件都删除,只留下starter依赖,这样看起来更清晰,略
创建Hello.HelloService
public class HelloService { HelloProperties helloProperties; public HelloProperties getHelloProperties() { return helloProperties; } public void setHelloProperties(HelloProperties helloProperties) { this.helloProperties = helloProperties; } public String sayHello(String name){ return helloProperties.getPrefix()+"-" +name + helloProperties.getSuffix(); } }创建Hello.HelloProperties
@ConfigurationProperties(prefix = "tiaotiao.hello") public class HelloProperties { private String prefix; private String suffix; public String getPrefix() { return prefix; } public void setPrefix(String prefix) { this.prefix = prefix; } public String getSuffix() { return suffix; } public void setSuffix(String suffix) { this.suffix = suffix; } }创建Hello.HelloServiceAutoConfiguration
@Configuration @ConditionalOnWebApplication //web应用才生效 @EnableConfigurationProperties(HelloProperties.class) public class HelloServiceAutoConfiguration { @Autowired HelloProperties helloProperties; @Bean public HelloService helloService(){ HelloService service = new HelloService(); service.setHelloProperties(helloProperties); return service; } }在resources目录下创建META-INF/spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.starter.Hello.HelloServiceAutoConfiguration将模块安装到maven仓库中(这里的maven模块是依赖springboot模块的),点击idea右边的maven进行安装
然后在新的窗口创建新的springboot项目(方便对比),在新项目中引入自定义的starter的依赖
<!--引入自定义的starter启动器--> <dependency> <groupId>com.sb</groupId> <artifactId>starter01</artifactId> <version>1.0-SNAPSHOT</version> </dependency>可以看到我们的自定义stater依赖成功导入
创建一个控制器方法controller.HelloController
@RestController public class HelloController { @Autowired HelloService helloService; @GetMapping("/hello") public String hello(){ return helloService.sayHello("tiaotiao"); } }然后在配置文件中设置一下前后缀
tiaotiao.hello.prefix=HELLO tiaotiao.hello.suffix=WORLD启动项目并访问 成功~
本次spring boot的学习暂时到这,期待雷神老师的继续更新~完结撒花 ~~~
该SpringBoot学习笔记学习自雷神前辈,是对知识点的整理和自我认识的梳理,如有不当之处,欢迎指出