• Spring boot学习笔记


    ring Boot的启动分析:

    1)直接调用静态的run方法(实质上内部是直接转换成2)方法)

    ConfigurableApplicationContext context = SpringApplication.run(App.class,args);

    2)实例化SpringApplication对象,然后调用run方法

    SpringApplication app =new SpringApplication(App.class);

    ConfigurableApplicationContext  context =app.run(args);

     二:

    spring boot 的运行流程:

    1.判断是否是webEnvironment

    2.加载所有classpath下面的META-INF/spring.factories   ApplicationContextInitializer

    3.加载所有classpath下面的META-INF/spring.factories   ApplicationContextListener

    4.推断main方法所在的类

    5.执行run方法

    6.设置了一个系统变量:java.awt.headless

    7.加载所有classpath下面的META-INF/spring.factories   SpringApplicationRunListener

    8.执行所有SpringApplicationRunListener的started方法

    9.实例化了ApplicationArguments对象

    10.创建environment

    11.配置environment,主要是把run方法的参数配置进environment中

    12.执行所有SpringApplicationRunListener的environmentPrepared方法,执行方法其实就是发送了一个事件

    13.如果不是web环境,但是是webEnvironment,则把这个web的environment转换成标准的environment

    14.打印banner

    15.初始化applicationContext,如果是web环境,则实例化AnnotationConfigEmbeddedWebApplicationContext,否则实例化AnnotationConfigApplicationContext

    16.如果beanNameGenerator不为空,则把beanNameGenerator对象注入到context里面去

    17.回调所有的ApplicationContextInitializer 初始化方法

    18.执行所有SpringApplicationRunListener的contextPrepared方法,执行方法其实就是发送了一个事件

    19.依次向spring容器中注入ApplicationArguments对象和Banner对象

    20.加载所有的源到context中去

    21.执行所有SpringApplicationRunListener的contextLoaded方法,执行方法其实就是发送了一个事件

    22.执行context的refresh方法,并调用context的registerShutdownHook方法

    23.回调获取容器中所有的ApplicationRunner,CommandLineRunner接口,然后排序,依次调用

    24.执行所有SpringApplicationRunListener的finished方法,执行方法其实就是发送了一个事件

    三 spring boot web学习

    1.静态获取变量

    @ResponseBody

    @PostMapping("/user/create")

    public String create(@RequestParam(value="username",defaultValue="admin") String username, @RequestParam(value="password",required=false) String password) {

    return "username is :" + username +"password is : " + password; 

    }

    2.动态获取变量:

    @ResponseBody

    @GetMapping("/user/{id}")

    public String createDynamic(@PathVariable("id")  String id) 

    return   "id is + " id;

    3.@RestController  :表示当前controller方法中的返回值可以直接用于body的输出

    在1,2 中所有的返回方法上面都加了一个@ResponseBody,如果在controller类上把@Controller换成 @RestController  ,那么所有的方法就不用加@ResponseBody了

    4.spring boot中使用jsp

    pom.xml文件中 需要另外加入依赖  tomcat-embed-jasper;(如果使用jsp就不要用下面的freemarker)

    然后在application.properties文件中加入两个配置项:

    spring.mvc.view.prefix=/WEB-INF/jsp/     //这个文件夹名自己定义

    spring.mvc.view.suffix=.jsp

    注意:当前端页面使用jsp文件时,不能用@RestController,方法上也不能加@ResponseBody

    5.spring boot中使用模板

    5.1 在pom.xml文件中引入freemarker的依赖:

    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-freemarker</artifactId>
    </dependency>

    5.2 在resources文件夹下新建templates文件夹,在文件夹中新建XXX.ftl文件

    5.3 模板文件路径可以修改,修改方法为:在application.properties文件夹中添加(修改)spring.freemarker.templateLoaderPath=classpath:/ftl

    5.4注意如果使用freemarker,那么对应的controller类上的注解不能用@RestController,只能用@Controller

    那后台服务端代码如何向前端ftl模板文件传送数据呢?

    前端页面logout.ftl文件内容如下:

    注意:在同一个文件中,jsp和模板ftl(或者velocity)二者最好只使用一个,不要都用  

     6. spring boot web中获取静态资源:

    6.1 放在webapp文件夹下的资源是可以直接访问的

    6.2 可以在classpath下新建(一般是在resources文件夹下)static或者public文件夹,为啥是这两个文件夹?可以通过源码知道:源码位置是 spring-boot-autoconfigure-1.5.7.RELEASE.jar 包下的org.springframework.boot.autoconfigure.web 下的ResourceProperties类,根据源码文件,那么我们就可以设置自己的静态文件夹的位置和名字:

    在application.properties 文件中spring.resources.staticLocations=classpath:/html/

    创建完或者不创建,浏览器访问的页面地址都是:localhost:8080/页面名字.html   注意路径中不用加static或者public或者新创建的文件夹html

    7.如何在spring boot中使用servlet

    7.1 编写XXXServlet 继承(extends)HttpServlet,类上使用注解@WebServlet("/xxx.do")

    7.2 在App.class上添加包扫描@ServletComponentScan

    7.3 除了上述方法之外,还可以在spring boot 中配置servlet使用其他方法:

    7.3.1依然编写 XXXServlet类,这个时候在类上不再使用@WebServlet("/xxx.do")注解了,在App.class上也不用写@ServletComponentScan注解

    7.3.2 编写一个配置类  例如  ServletRegister  在其上加注解@SpringBootConfiguration

    以上两种Servlet的用法分析:

    第一种方法,servlet其实依赖的是Servlet3.0,如果项目中使用的是Servlet3.0以下(Servlet2.0)那么第一种方法(使用注解@WebServlet("/xxx.do"))就行不通啦,因为Servlet2.0是不支持@WebServlet("/xxx.do")这个注解的

    那么第二种方法,可以看出Servlet是注入到了Spring容器中,使用的是Spring的注入的一些Bean,所有能够适用Servlet2.0等

    以上就是二者的区别

    8.Spring boot 使用Filter:  @WebFilter()括号中添加拦截的内容

    9.spring  boot  使用ServletContextListener

     9.Spring boot中使用拦截器  :  (HandlerInterceptor)

    9.1编写拦截器类:

    9.2 将编写的拦截器纳入到Spring容器中

    总结:

     10.spring  boot 的异常处理

    10.1 如何去掉spring  boot自带的异常处理逻辑界面:

    @SpringBootApplication(exclude=ErrorMvcAutoConfiguration.class)

    10.2 如何在spring boot中出现错误(404,500错误)时,能够跳转到自己项目中指定的界面呢?

    10.2.1  首先在resources下新建static或者public文件夹,建完文件夹后,新建404.html  和500.html

    10.2.2 然后在编写java类:

    这个类实现ErrorPageRegistrar接口,然后实现registerErrorPages方法,在该方法里面,添加具体的错误处理逻辑

    10.3 处理当前类里面的异常:

    使用@ExceptionHandler(value=Exception.class) 当然value的值可以指定所需要的异常,比如ClassNotFoundException等等

    10.4 处理全局异常:这时候需要编写一个异常类:

    类的上面加注解@ControllerAdvice  类里面的方法上加@ExceptionHandler

    同样的,我们也可以在@ExceptionHandler(value="FileNotFoundException")中的value指定特定的异常类

    当然这个类中可以写多个方法,每个方法负责处理不同的异常

    11.spring boot中使用默认的Jdbctemplate  DataSource(这个datasource默认使用的是tomcat的)

    首先在pom.xml文件中加入

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>6.0.3</version>
    </dependency>

    12.spring boot使用 自己配置的数据源如:druid

    在pom.xml文件中加入依赖:

    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.1.4</version>
    </dependency>

     13.spring boot 中启用事物:

    首先在使用的场合中(通常是Service类)启用注解@EnableTransactionManagement,然后在需要加事物的方法上面加注解@Transactional

    注意Spring boot的事物默认只对运行时异常进行事物生效(回滚),非运行时异常,比如FileNotFound异常,不会对事物进行回滚。RuntimeException 包括,比如空指针异常等

    NullPointerException - 空指针引用异常
    ClassCastException - 类型强制转换异常。
    IllegalArgumentException - 传递非法参数异常。
    ArithmeticException - 算术运算异常
    ArrayStoreException - 向数组中存放与声明类型不兼容对象异常
    IndexOutOfBoundsException - 下标越界异常
    NegativeArraySizeException - 创建一个大小为负数的数组错误异常
    NumberFormatException - 数字格式异常
    SecurityException - 安全异常
    UnsupportedOperationException - 不支持的操作异常

    如果想对所有的异常都进行回滚,或者想指定特定的异常进行回滚,那么需要这样配置:

     具体可点开@Transactional这个注解,注解里面的参数进行设置,比如,可以设置哪些异常不回滚,通过设置类的名字进行回顾等等

    使用事物的注意事项:图中的addProductBatch()方法又调用了add()方法,那么若要使用事物的完整性,就必须在addProductBatch()方法上面加事物注解@Transactional  

    add方法上面可以不加注解

  • 相关阅读:
    LG5283 异或粽子
    LG2216 理想的正方形
    LG1484 种树
    洛谷3721 HNOI2017单旋(LCT+set+思维)
    洛谷3348 大森林 (LCT + 虚点 + 树上差分)
    CF1082E Increasing Frequency (multiset+乱搞+贪心)
    CF1082G Petya and Graph(最小割,最大权闭合子图)
    cf1082D Maximum Diameter Graph(构造+模拟+细节)
    洛谷3320 SDOI2015寻宝游戏(set+dfs序)(反向迭代器的注意事项!)
    CF613D Kingdom and its Cities(虚树+贪心)
  • 原文地址:https://www.cnblogs.com/zhangshitong/p/7678575.html
Copyright © 2020-2023  润新知