spring boot

分析:
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/

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值