南开小巷

导航

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方法上面可以不加注解

 

posted on 2017-10-16 20:01  南开小巷  阅读(439)  评论(0编辑  收藏  举报