一、springboot
1.springboot概括
1.1介绍
springboot是一个基于spring框架的工具框架,可以实现spring容器的快速搭建快速配置快速启动
1.2特性
独立运行的spring容器
可以实现通过main方法作为工程的一个cpu运行入口,启动一个spring的容器,容器中各种bean对象创建完成。
嵌的servlet容器
没有web应用servlet容器也存在,默认是tomcat(1.5.9.RELEASE版本的springboot内嵌tomcat8.5),整合springmvc非常简单,将springmvc依赖引入就会根据自动配置检测当前工程是否一个web应用,而启动tomcat容器
简化依赖
利用项目管理工具maven实现了简化依赖的入口,将不同的功能的依赖区分对待,例如:开发一个springmvc+spring的web应用框架,只需要依赖一个springboot提供的starter-web
自动配置
springboot已经在扩展的时候准备了绝大部分的开发场景可以用的到不同技术的配置内容(工程的"0" xml配置),使用springboot就很少可能会自定义配置xml文件。
会根据你是用的依赖内容,决定是否创建对应技术的各种bean对象
例如:只依赖了starter-web的时候,springboot不会创建datasource,一旦你依赖了starter-jdbc 确定当前工程要使用持久层数据源,自动配置datasource(bean标签 dataSource druid)
二、springboot手动搭建
1.步骤
1.1创建maven工程quickstart
1.2pom文件修改
继承springboot-parent
<parent>
<!-- groupId artifactId version -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
</parent>
starter-web开发一个web应用(没有持久层)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
1.3启动类
核心注解@SpringBootApplication
package cn.tedu;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* springboot核心注解
* 启动一个spring的运行容器
* @author tedu
*/
@SpringBootApplication
public class StarterDemo01 {
/*
* 启动方法main
*/
public static void main(String[] args) {
/*source: Class 表示当前启动类的反射对象
*/
SpringApplication.
run(StarterDemo01.class, args);
}}
1.4 controller-server(hello world)
测试当前系统是否具备开发spring 和sprigmvc框架代码的能力
HelloController 注入Service
RequestMapping(“hello”)
三、springboot的全局配置文件
1.application.properties
springboot提供一个key=value结构的属性数据输入
回忆:spring框架能否加载**.properties
name=wang
age=18
会使用占位符的累PlaceHolderPropertiesConfigure加载properties文件(Properties)
springboot提供了一个全局配置文件application.properties,只需要放到classpath下就可以在启动是被加载(application是固定的)
1.1修改tomcat的访问端口访问路径
默认情况下tomcat8080,访问contextPath /
# 8091
server.port=8091
server.contextPath=/1906
通过全局配置文件可以定义springboot在自动配置时使用的一些属性值,datasource可以在application.properties定义url driver name password
1.2.yml格式的文件
企业常用的时yml格式的配置文件,springboot也支持对yml格式的解析(了解什么时yml了解properties和yml的关系,了解企业常用的yml结构)application.yml
yml格式是面向数据结构的(层级结构)配置文件格式
properties
server.port=8090
server.contextPath=/1906
yml
server:
port: 8090
contextPath: /1906
第一级名称:
[空格]第二级:[空格]值
[空格]第二级:
[空格][空格]第三级:[空格]值
四、springboot的自动配置原理
1.spring加载xml
1.1早期的xml
大量的bean标签
1.2java5出现注解技术
整合了大量的关键字的配置内容
扫描@Controller @Service @Component等等
DOM/SAX–>JavaConfig–>配合注解实现大量的bean标签转化配置–>springboot实现了更多的注解使用代替了xml
1.3包扫描/bean的创建
xml文件利用注解@Configuratoin使用代码配置(@Configuration所在的类表示一个xml配置文件)
@Configuration
public class HelloConfig {
}
@Bean创建对象(相当于bean标签)
@Configuration
public class HelloConfig {
//@Bean注解生成一个初始化方法,返回一个bean对象
@Bean
public HelloComponent initH(){
return new HelloComponent();
}}
1.4springboot的核心注解
@SpringBootApplication是一个组合注解,组合了三个重要的内容
@SpringBootConfiguration
@ComponentScan
@EnableAutoConfiguration
○ SpringBootConfiguration注解==Configuration:启动类本身就是一个配置累,表示一个启动加载spring的基本xml文件(componentScan)
○ ComponentScan相当于是将之前xml中context:component-scan转化成注解
默认会对当前类的包进行加载相当于包扫描的basePackage
<context:component-scan basePackge=“cn.tedu”/>
上述内容解释的是自动扫描的逻辑
1.5根据依赖的内容实现自动加载bean对象
@Configuration 表示一个类是个配置类相当于一个xml配置文件
@Bean 表示方法返回值需要spring挂了你ioc di
@Conditional衍生注解(根据依赖做条件的核心内容)可以使用条件注解判断当前配置类是否生效加载
@ConditionalOnClass:环境中存在指定类满足条件,反之不满足
@ConditionalOnMissingClass:环境中不存在指定类满足条件,反之不满足
@ConditionalOnBean:环境中存在指定bean对象,满足条件,反之不满足
@ConditionalOnMissingBean:不存在指定bean对象满足条件
@ConditionalOnProperties:环境中对应属性配置满足条件
@ConditionalOnWebApplication:当前系统是web应用满足条件
…
条件注解使用在配置类(Configuration配合使用)通过对条件的设定,判断当前配置类局部或者全部是否需要加载;
可以通过如下代码对配置内容加载与否进行设置
package cn.tedu.condition.config;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import cn.tedu.condition.ConditionA;
import cn.tedu.condition.bean.ConditionBeanA;
import cn.tedu.controller.HelloController;
@Configuration
@ConditionalOnClass({ConditionA.class})
public class ConditionConfig {
@Bean
//当前环境必须具备某些bean丢向才会加载这个方法
@ConditionalOnBean(HelloController.class)
public ConditionBeanA initCBA(){
return new ConditionBeanA();
}}
1.6springboot的整合自动配置
@EnableAutoConfiguration
根据依赖的jar包spring-boot-autoconfigure.jar,**-autoconfigure.jar提供的配置文件spring.factories
记录了当前扩展jar包中提供的所有实现过得不同技术的配置类的加载配置类全路径名称
自动配置类中,一般可以翻到各种Properties的类
类中以
@ConfigurationProperties(prefix = “spring.mvc”)
一旦属性类Properties,会根据这个注解实现读取properties文件中spring.mvc为前缀的内容
注意事项
1.前缀满足条件 1906,
1906.* 支持驼峰明明
2.属性就是除了前缀的名称
1906.className 属性中必须有className
3.支持多级读取
ConfigurationProperties(prefix=1906)
1906.a.className
@ConfigurationProperties(prefix = “spring.mvc”)
public class WebMvcProperties {
private final View view = new View();}
view这个属性本身也是一个对象类
public static class View {
private String prefix;
private String suffix;
多级配置支持spring.mvc(prefix前缀)
spring.mvc.view.prefix
private String prefix;
spring.mvc.view.suffix
private String suffix;
@Value("${spring.mvc.view.prefix}")
spring.factories文件定义的配置类的全路径名称,在使用@EnableAutoConfiguration注解后,会将所有的全路径名称加载到内存中,最终根据条件是否满足决定哪些加载哪些不加载;
2.总结自动配置与案例
2.1spring的支持才能实现springboot完善
引入了xml转向注解的技术
2.2自动扫描
@ComponentScan自动实现component-scan标签的扫描
默认范围就是启动类的包
2.3根据依赖实现自动配置
条件注解Conditional根据不同场景不同情况定义配置类是否被加载
@ConditionalOnClass
2.4扩展的内容
Configuration注解:相当于定义了一个类与xml对应关系
Bean:相当于定义了一个方法的返回值与《bean》标签关系
ConfigurationProperties:定义properties文件中读取的属性,可以使用前缀读取与类属性相同名称的值,支持多级的读取
2.5核心注解
@SpringBootApplication
组合三个注解
@SpringBootConfiguration:标识一个配置类
@ComponentScan:定义spring扫描范围
@EnableAutoconfiguration:扩展的自动配置类得以被加载实现逻辑;
五、springboot和持久层整合
1.整合步骤
1.1依赖内容
springboot-jdbc定义所有接口规范
mysql定义链接的后端数据库类型
mybatis的springboot引入
DruidDatasource:默认springboot使用的底层连接池Tomcat JDBC datasource
<!-- springboot jdbc --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <!-- mysql --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.0.8</version> </dependency> <!-- springboot mybatis --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.0</version> </dependency> <!-- druid --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.14</version> </dependency>
1.2为自动配置类中bean对象的创建生成属性值
有2个自动配置的类
DataSourceAutoConfiguration读取的datasource的属性
spring.datasource.driverClassName
spring.datasource.url
spring.datasource.username
spring.datasource.password
MybatisAutoConfiguration
mybatis.mapperLocatoins=
mybatis.typeAliasesPackage=
mybatis.configuration.mapUnderscoreToCamelCase=
mybatis.configuration.cacheEnabled=false
1.3@MapperScan(接口类的包扫描)
启动类中添加mybatis整合springboot的这个注解
@SpringBootApplication
@MapperScan(“cn.tedu.mapper”)
public class StarterDemo01 {
1.4测试案例
UserController UserService UserMapper UserMapper.xml User
1.5druid
默认的springboot的底层datasource tomcat Jdbc datasource
application.properties中指定一个链接数据源的实现类全路径名称
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
2.springboot的工程打包运行
引入springboot之后,nginx做了动静分离,web应用打成jar包,启动方法main方法–main的插件,需要在打包时生成主清单属性,springboot专门为maven工程整合了构建插件
2.1引入工程的maven springboot插件
build
plugins
plugin插件