SpringBoot-01-快速开始和自动配置
SpringBoot 快速开始
导包
SpringBoot 项目只需要一个普通的 Maven 项目就可以了。我们是通过运行 SpringBoot 的 SpringApplication.run() 方法,来让 SpringBoot 控制整个项目的。
首先我们需要将在 Maven 中引入包含了大量依赖信息的 SpringBoot parent(继承信息),和我们要进行 Web 开发的 starter (真正的引入依赖下载 jar 包)
1 | <parent> |
也就是 parent 引入保存的各种开发场景对应的依赖需求集合,我们在 dependencies 真正的引入这些依赖的时候,就不需要一个个写了,直接调用依赖集合名就好了。
然后我们就能看到所有关于 web 开发的 jar 包就都被导入了,包括 tomcat。这些 jar 包的集合被 SpringBoot 叫作一个 starter,开始集合。
让 SpringBoot 接管项目
就像配置 DispatcherServlet 让 SpringMVC 接管业务流程一样,这里是让 SpringBoot 直接从根本接管所有东西,不仅仅是业务流程,包括了 Tomcat 的创建。
只需要创建一个方法,在 main 方法中运行 SpringBoot 的启动程序,SpringApplication.run(),参数就是这个类本身的 class 和输入的参数,当然这个类也需要用注解标记为 SpringBoot 启动类。要运行整个项目的时候,就直接运行 main 方法即可。
1 |
|
开始写业务逻辑
剩下的部分就是按照 SpringMVC 的形式写了,不用管配置啥的,直接各种注解随便用:
1 | //Controller 和 RequestBody 的结合,意思为用来实现 rest 风格的 Controller |
更改配置
SpringBoot 因为一个人就接管了整个项目,所以可以将整个项目的所有配置都简化到一个文件中: application.properties
,这个文件可以改所有的配置。
比如将端口号改为 8888,只需要在 application.properties
中写下即可:
1 | 8888 = |
而在 application.properties 里面的各种配置信息提示需要将配置处理器 Springboot-configurationg-processor 引入依赖:
1 | <dependency> |
然后在 maven 插件配置的地方设置打包去除到这个 processor ,因为只是支持配置提示,也不需要打包成运行环境。
1 | <plugin> |
开始部署
以前部署是打包成 war 包,放到服务器的 Tomcat 环境上面的,现在因为所有的东西都被 SpringBoot 管理,所以只需要让 SpringBoot 跑起来就可以了。
那么我们就可以将项目打包成一个可以运行 main 方法的 jar 包即可。(main 方法负责启动 SpringBoot)
我们是用 Maven 进行打包的,先引入 SpringBoot 关于 Maven 的打包插件:
1 | <build> |
然后运行(注意 IDEA 需要停止运行当前的 SpringBoot 防止端口占用)
java -jar SpringBoot-1.0-SNAPSHOT.jar
SpringBoot 依赖管理
原理
SpringBoot 一个让我们省心的就是它的 starter 直接配齐了所有的生产环境。starter 的实现就是依靠 SpringBoot 的依赖管理,什么样的生产环境需要什么依赖,以及依赖的版本号,都被记录在 spring-boot-starter-parent
中。
版本更改
依赖的具体版本是通过在 SpringBoot 的依赖管理中的 <properties></properties>
标签中定义好的:
1 | <!--截取一部分--> |
我们要更改它的版本只需要在 Maven 中配置 <properties></properties>
中设置具体的版本即可,比如想要文艺复兴,使用 8.0.1 的 tomcat,改就完事了:
1 | <properties> |
SpringBoot 自动配置
组件配置
以前我们要引入很多的组件,比如 DispatcherServlet,CharacterEncoding 等等,现在使用了 SpringBoot 之后就不需要写了,这是因为 SpringBoot 会自动将一整套的开发环境预设到 IOC 容器中,SpringApplication.run(MainApplication.class, args)
的返回结果就是这个 IOC 容器。
包扫描
SpringBoot 会扫描标注了 @SpringBootApplication
的启动类以下的所有子包:
1 | com |
所以我们才不需要配置扫描的包。但如果真的想要配置,在 @SpringBootApplication
添加属性:scanBasePackages = "space.xorex"
。
配置信息
SpringBoot 所有场景的默认配置信息都在 spring-boot-autoconfigure 里面:
容器功能
添加容器
Spring 一个重要功能就是 IOC ,那么到了 SpringBoot,如何使用 IOC 容器呢?
@Configuration
用来标注表示这是一个配置类,然后对方法 @Bean
表示这是一个 Bean 配置,方法名就是 id,返回的结果就是配置 Bean 获取的结果。
这样成功将 id=userXorex 的 User 实例添加到了 IOC 容器中,默认为 单实例对象 。
1 |
|
实例获取
因为上面写过之后两个 bean 都被加入了单例的 IOC 中,所以自然可以用 @Autowired 来获取单例 bean 的实例:
1 |
|
但是还有另外一种获取方法,就是调用 MyConfig 里面的方法返回 bean 实例。当我们的 @Configuration 配置的为默认: proxyBeanMethods=true 的时候,也就是使用代理获取对象的时候,在外部获取的都是容器中的单例 Bean:
1 | MyConfig config=run.getBean(MyConfig.class); |
当我们将 proxyBeanMethods=false 的时候,上面从 IOC 中取出来的 MyConfig 就是普通类了(等同于 new 出来一个普通的 MyConfig),调用方法返回的 bean 也是方法里面 new 出来的,就不是 IOC 控制的单例对象了。
快速添加
可以使用 @Import({XXX1.class,XXX2.class})
快速将两个类 XXX1 和 XXX2 的无参构造器的实例放入 IOC 容器中,id 就是这个类的全类名。
配置绑定
这里的配置绑定指的是将 application.properties 中的配置信息和 IOC 容器中的 Bean 的属性相绑定。
比如我们将配置文件中的 info.xxx 配置于 Info 类中的属性 xxx 相绑定,只需要在 @ConfigurationProperties
1. @Component + @ConfigurationProperties
1 |
|
2. @ConfigurationProperties + @Bean
第二种主要适用于对第三方包里面的类进行属性设置:
1 | //加入到 IOC 容器中 |