分析:
1,继承spring-boot-starter-parent,引入基本的依赖管理配置;
2,引入spring-boot-starter-web,自动引入了springweb相关的包;
3,@SpringBootApplication:这个注解告诉springboot自动的去完成相关配置,包括基础类的加载,bean的扫描等等,这个后面详细介绍;简单理解为这个标签为我们的应用配置完成了很多基本功能;
4,SpringApplication.run:这个是springboot为我们提供的最大的区别,在于springboot不再是一个web应用,需要我们自己去打包,部署,启动tomcat,springboot默认把tomcat打包到应用中,我们可以以正常的运行jar的方式来运行springboot应用;
2,使用package命令打包,在命令行中使用java -jar xx.jar运行;注意,一定要引入spring-boot-maven-plugin之后运行package打包才能正常运行;
3,直接使用maven插件:spring-boot:run运行;
将代码拆分:
1,将Controller独立;
2,将App独立;
原理:@SpringBootApplication中包含了@ComponentScan标签;
换句话说,我们的代码仍然是两部分构成:配置对象和应用业务代码;
1,Springboot应用的基本结构:通过start.spring.io创建一个springboot应用:
pom.xml
+src
+main
+java
-DemoApplication
+resources
-application.properties
+templates
+static
+test
2,spring-boot-starter-parent简介:
1,包含了常用版本属性;
要修改java编译版本,可以修改: <properties> <java.version>1.7</java.version> </properties>
2,包含了常用的dependenceManagement;
3,Springboot非常优秀的地方在于提供了非常多以spring-boot-starter-*开头的开箱即用的工具包,常见工具包有以下一些:
spring-boot-starter:核心的工具包,提供了自动配置的支持,日志和YAML配置支持;
spring-boot-starter-activemq:针对快速集成ActiveMQ的工具包;
spring-boot-starter-aop:提供了快速集成SpringAOP和AspectJ的工具包;
spring-boot-starter-data-redis:提供了快速集成Redis和Jedis的工具包;
spring-boot-starter-freemarker:提供了快速集成Freemarker的工具包;
spring-boot-starter-mail:提供了快速集成邮件发送的工具包;
spring-boot-starter-test:提供了对Springboot应用的测试工具包;
spring-boot-starter-web:提供了对web开发的工具包,包括基于SpringMVC的RESTful应用开发,内置的tomcat服务器等;
spring-boot-starter-actuator:提供了对生产环境中应用监控的工具包;
spring-boot-starter-logging:提供了对日志的工具包,默认使用Logback;
3,Springboot应用的热部署:
除了使用JRebel来实现热部署,还可以使用Springboot提供的spring-boot-devtools包来完成Springboot应用热部署;
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
1)原理:
SpringBoot重启是reload重启,通过监控classpath的变化,如果classpath中的文件发生变化,即触发重启。springboot通过两个classpath来完成reload,一个basic classloader中加载不变的类,一个restart classloader中加载classpath中的类,重启的时候,restart classloader中的类丢弃并重新加载;
2)排除资源:
spring.devtools.restart.exclude=static/**,templates/**
spring.devtools.restart.additional-exclude=public/** (处理默认配置排除之外的)
spring.devtools.restart.enabled=false (禁用自动重启)
@SpringBootApplication简介:
@SpringBootApplication由三个主要的标签构成:@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan
1)@SpringBootConfiguration:本质就是一个@Configuration,代表这是spring容器的主配置类;
2)@EnableAutoConfiguration:开启自动配置,Springboot使用这个标签自动的把内置的符合条件的@Configuration类加载进入应用;
可以查看spring-boot-autoconfigure包中的META-INF/spring.factories文件中的配置项(原理,由@EnableAutoConfiguration标签引入的AutoConfigurationImportSelector类中,使用Spring的SpringFactoriesLoader类实现加载)
3)@ComponentScan:自动扫描;
SpringApplication简介:
1,SpringApplication类提供了一个标准化的应用执行流程,并在这个执行流程中为我们提供了一些应用扩展点;但大部分情况下,我们只需要使用它就可以了;
2,SpringBoot提供了一些扩展点,比如修改Banner:
1)创建一个banner.txt
2)设置banner,在配置文件中使用spring.main.banner-mode=off
3,可以通过创建对象的方式来运行SpringApplication
2)通过builder完成:
4,参数的处理:在应用启动过程中,可以通过启动参数给应用传递一些额外的参数来控制应用的运行;
1,在main方法中可以直接使用传入的参数;
2,可以任何类中直接通过@Autowired注入一个ApplicationArguments对象;
1,springboot中有非常多的地方可以向应用传入参数;而参数对于springboot应用又非常重要;
2,springboot中主要的参数来源及优先级:
1,命令行参数;
2,ServletConfig和ServletContext;
3,操作系统环境变量;
4,application-{profile}.properties或者YAML文件;
5,application.properties或者YAML文件;
springboot提供了方便的properties绑定机制;
1)默认从application.properties中加载配置;
2)配置随机值:
@Value("${app.randomint}")
private Long randomInt;
@Value("${app.randomlong}")
private Long randomLong;
@Value("${app.random}")
private Long random;
application.properties:
app.randomint=${random.int}
app.randomlong=${random.long}
app.random=${random.long[0,100]}
当然也可以直接在属性上面配置${random.int},${random.long},${random.long[1,100]},相当于直接使用SpEL;
3)资源文件(application.properties)加载顺序:
1,当前目录/config子目录;
2,当前目录;
3,classpath下得/config子目录;
4,classpath;
可以通过(只能通过命令行参数配置--spring.config.name)
spring.config.name配置配置文件名称
spring.config.location配置配置文件具体加载地址
@ConfigurationProperties参数绑定标签:可以非常方便的把资源文件中的内容绑定到对象上;
1)基本使用
2)也可以配合@bean标签为第三方组件直接绑定参数:
3)@ConfigurationProperties支持松绑定:
@ConfigurationProperties(prefix="db")
private String userName;
允许匹配方式
db.userName=xx;
db.user_name=xx;
db.user-name=xx;
db_user_name=xx;
4)命令行中,使用--开头的参数都可以被springboot视为参数,允许参数绑定;
为什么要用日志?
1,比起System.out.println,日志框架可以把日志的输出和代码分离;
2,日志框架可以方便的定义日志的输出环境,控制台,文件,数据库;
3,日志框架可以方便的定义日志的输出格式和输出级别;
Springboot的默认日志使用:
1,Springboot默认已经开启日志;默认的日志格式为:时间 日志级别 PID 线程名称 日志类 日志说明
2,Springboot的日志区别系统日志和应用日志;
3,Springboot推荐使用Logback作为日志框架(common-logging,java-logging,log4j,logback,slf4j)
Logback使用方法(推荐使用logback自己的配置文件)
1,springboot默认支持logback.xml或者logback-spring.xml,推荐使用logback-spring.xml,springboot会增加额外功能;
2,可以通过logging.config=classpath:mylogback.xml指定自己的logback配置文件(不推荐);
3,一个典型的logback配置文件:
Logback使用介绍:
1,<configuration>:Logback配置根元素
属性包括:
1,scan: 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
2,scanPeriod: 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。
3,debug: 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
子元素:
<contextName>:上下文名字;
<property>:定义属性,可以使用${}在配置文件中使用;
2,<appender>:在logback中是用于具体记录日志的组件,可以用来配置日志记录方式,日志记录格式等;
属性包括:
name:appender的名字,用于下面在配置日志的时候指定;
class:使用到的appender类;
常见的appender:
1,ch.qos.logback.core.ConsoleAppender:输出到控制台;
2,ch.qos.logback.core.FileAppender:输出到文件;
3,ch.qos.logback.core.rolling.RollingFileAppender:输出到文件,可以配置滚动策略,当日志达到某个条件之后分文件记录;
4,还有其他的appender,比如写到数据库等;
<appender>元素的基本格式:
<appender name="" class="">
<encoder>
<pattern>...</pattern>
</encoder>
<otherconfig></otherconfig>
</appender>
<encoder>元素用来规定日志的输出格式,所有表达式都以%开始表示接下来是一个特殊标识符
常见标识符:
1,%logger{n}:输出Logger对象类名,n代表长度;
2,%class{n}:输出所在类名,
3,d{pattern}或者date{pattern}:输出日志日期,格式同java;
4,L/line:日志所在行号;
5,m/msg:日志内容;
6,method:所在方法名称;
7,p/level:日志级别;
8,thread:所在线程名称;
【直接写数字】:标识最小宽度并且是右对齐
【-数字】:标识最小宽度,并且是左对齐
【.数字】:标识最大宽度。如果数据内容超过最大宽度,从前面截取数据
【.-数字】:标识最大宽度。如果数据内容超过最大宽度,从后面截取数据
常见的appender使用:
1)ConsoleAppender输出到控制台,子元素:
<encoder>:日志格式化
<target>:System.out(默认)或者System.err
2)FileAppender输出到文件,子元素:
file:被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。
append:文件结尾,如果是 false,清空现存文件,默认是true。
encoder:对日志进行格式化
3)RollingFileAppender输出到文件,可以设置文件滚动(分割)条件,子元素:
append:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。
rollingPolicy:滚动策略,涉及文件移动和重命名。
常用滚动策略:
ch.qos.logback.core.rolling.TimeBasedRollingPolicy:按照时间控制来控制记录文件;
fileNamePattern:文件名称格式,以%d{pattern};
maxHistory:
可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件。(以文件最小时间为准)
SizeAndTimeBasedRollingPolicy:按照时间和大小控制记录文件;
fileNamePattern:文件名称格式,可以使用%i来控制索引编号;
maxFileSize:这是活动文件的大小,默认值是10MB
maxHistory:
可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件。(以文件最小时间为准)
3,<logger>元素:用来设置某一个包或具体的某一个类的日志打印级别及对应的appender;
属性:
name: 用来指定受此loger约束的某一个包或者具体的某一个类;
子节点:
appender-ref:可以配置多个,标识这个appender将会添加到这个logger;
4,<root>元素:特殊的logger,代表根配置,如果没有单独指定日志包层级,都默认使用root定义的日志输出级别;
属性:level:指定日志级别;
静态资源:
1,默认情况下,Springboot会从classpath下的/static、/public、/resources、/META-INF/resources下加载静态资源;
2,可以通过修改spring.resources.staticLocations来修改静态资源加载地址;
3,因为应用是打成jar包,所以之前的src/main/webapp不会加载;
freemarker和Springboot:
(注意,为什么不用JSP,因为Springboot对JSP的支持不好!!)
1,SpringMVC和JSP的集成原理 VS SpringMVC 和Freemarker的集成原理;
2,Springboot和Freemarker集成:
1)引入spring-boot-starter-freemarker;
2)Springboot对freemarker的配置:
1,spring.freemarker.enabled=true:是否开启freemarker支持;
2,spring.freemarker.allow-request-override:是否允许request中的属性覆盖model中同名属性;默认false;
3,spring.freemarker.allow-session-override:是否允许session中的属性覆盖model中同名属性;默认false;
4,spring.freemarker.cache:是否支持模板缓存;默认false;
5,spring.freemarker.charset=UTF-8:模板编码
6,spring.freemarker.content-type=text/html:模板contenttype;
7,spring.freemarker.expose-request-attributes:是否开启request属性expose,默认false;
8,spring.freemarker.expose-session-attributes:是否开启session属性expose,默认false;
9,spring.freemarker.expose-spring-macro-helpers:是否开启spring的freemarker宏支持;默认为false;
10,spring.freemarker.prefer-file-system-access:默认为true,支持实时检查模板修改;
11,spring.freemarker.prefix:加载模板时候的前缀;
12,spring.freemarker.settings.*:直接配置freemarker参数
13,spring.freemarker.suffix:模板文件后缀;
14,spring.freemarker.template-loader-path=classpath:/templates/:模板加载地址
错误统一处理:
1)@ControllerAdvice
通过使用@ControllerAdvice定义统一的异常处理类,而不是在每个Controller中逐个定义。@ExceptionHandler用来定义函数针对的异常类型。
2)统一的异常页面
1,SpringBoot默认情况下,把所有错误都重新定位到/error这个处理路径上,由BasicErrorController类完成处理;
2,SpringBoot提供了默认的替换错误页面的路径:
1,静态错误页面默认结构:
src/
resources/
public/
error/
404.html
401.html
5xx.html
2,也可以使用模板页面:
src/
resources/
templates/
error/
5xx.ftl
该路径方式是通过ErrorMvcAutoConfiguration中的DefaultErrorViewResolver完成的;
mybatis集成:
1,Datasource集成(druid)
使用配置的方式,直接在application.properties中配置:
原理:
springboot在autoconfiguration中引入了DataSourceAutoConfiguation,
使用@EnableConfigurationProperties(DataSourceProperties.class)完成properties到DataSourceProperties的绑定;
使用DataSourceConfiguration类来完成datasource的自动创建:
在PooledDataSourceConfiguration中引入DataSourceConfiguration.Generic.class
@ConditionalOnMissingBean(DataSource.class)
@ConditionalOnProperty(name = "spring.datasource.type")
static class Generic {
@Bean
public DataSource dataSource(DataSourceProperties properties) {
return properties.initializeDataSourceBuilder().build();
}
}
在build方法中根据type属性创建bean并设置属性,完成datasource创建;
使用手动创建的方式:
使用properties加载的方式:
2,mybatis集成:
使用mybatis-spring-boot-starter来完成mybatis集成;
1,引入依赖:
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
2,正常完成mapper接口和mapper.xml
3,mybatis-spring-boot-starter提供了以下配置(具体参考MyBatisProperties对象):
mybatis.configLocation:mybatis的配置文件地址;
mybatis.mapperLocations:映射文件地址;
mybatis.typeAliasesPackage:别名扫描包;
4,使用@MapperScan标签扫描mapper接口
@SpringBootApplication
@MapperScan(basePackages="com.xmg.springboot.mybatis.mapper")
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
会自动扫描指定包下的mapper接口;
Servlet相关:
1,定义tomcat容器:
server.port:定制监听端口;
server.session.timeout:session有效时间;
2,添加Servlet组件:
1)在配置类上添加@ServletComponentScan,会自动扫描添加了@WebServlet,@WebFilter和@WebListener类;
2)通过创建ServletListenerRegistrationBean,ServletRegistrationBean和FilterRegistrationBean来完成注册:
@Bean
public ServletListenerRegistrationBean<MyServletListener> myListener() {
return new ServletListenerRegistrationBean<>(new MyServletListener());
}
1,仍然使用MultipartFile完成上传,Springboot是使用Servlet3中的Part对象完成上传,不是使用的fileupload;
2,上传相关配置:
spring.http.multipart.enabled=true:是否允许处理上传;
spring.http.multipart.maxFileSize=1MB:允许最大的单文件上传大小,单位可以是kb,mb;
spring.http.multipart.maxRequestSize=10MB:允许的最大请求大小;
3,也可以通过创建一个MultipartConfigElement类型的bean对上传进行配置:
@Bean
public MultipartConfigElement multipartConfigElement() {
MultipartConfigFactory mcf = new MultipartConfigFactory();
mcf.setMaxFileSize("1MB");
mcf.setMaxRequestSize("10MB");
return mcf.createMultipartConfig();
}
4,关于上传文件的处理:
因为应用是打成jar包,所以一般会把上传的文件放到其他位置,并通过设置
spring.resources.static-locations
来完成资源位置映射。
spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,file:/Users/stef/devs/workspace/springboot-demo/upload/