SpringBoot2.0初识
核心特性
组件自动装配: Web MVC , Web Flux , JDBC 等
激活: @EnableAutoConfiguration
配置: /META_INF/spring.factories
实现: XXXAutoConfiguration
嵌入式的Web容器: Tomcat , Jetty以及Undertow
Web Servlet: Tomcat , Jetty 和 Undertow
Web Reactive: Netty Web Server(基于web flux)
生产准备特性:指标 , 健康检查 , 外部化配置等
指标: /actuator/metrics
健康配置: /actuator/health
外部化配置: /actuator/configprops
Web应用
传统的Servlet应用
引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
使用Servlet组件
package cn.lisongyu.demo; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan; @SpringBootApplication
@ServletComponentScan(basePackages = "cn.lisongyu.demo") //使用java原生操作需添加@ServletComponentScan注解来实现对应的@WebServlet,@WebFilter,@WebListener
public class DemoApplication { public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}Servlet
实现
在类上添加@WebServlet注解
继承HttpServlet,重写doGet,doPost方法
注册到mapping中
URL映射
给@WebServlet(urlPatterns = "/my/servlet")添加属性urlPatterns,指明映射的路径
注册到应用中
在应用的启动主类上添加@ServletComponentScan(basePackages = "cn.lisongyu.demo")
- 使用java原生添加Servlet
package cn.lisongyu.demo; import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException; /**
* @author lisongyu
* @ClassName cn.lisongyu.demo.MyServlet
* @description
* @create 2018年11月26日 14:57
*/
@WebServlet(urlPatterns = "/my/servlet")
public class MyServlet extends HttpServlet { @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("这里是servlet");
resp.getWriter().append("hello,world!");
}
}
- 使用spring注解添加Servlet
package cn.lisongyu.demo; import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException; /**
* @author lisongyu
* @ClassName cn.lisongyu.demo.MyServlet2
* @description
* @create 2018年11月26日 17:05
*/
@Configuration
public class MyServlet2 { @Bean
public ServletRegistrationBean getMyServlet(){
ServletRegistrationBean servlet = new ServletRegistrationBean();
servlet.setServlet(new HttpServlet() {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("这里是servlet");
resp.getWriter().append("hello,world!");
}
}); return servlet;
} }
Filter
- 通过实现Filter(javax.servlet.*),重写其init(),doFilter(),destroy()方法,主要重写其doFilter()方法,在类上添加@Component注解,将组件添加到spring容器中
package cn.lisongyu.demo; import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException; /**
* @author lisongyu
* @ClassName cn.lisongyu.demo.MyFilter
* @description
* @create 2018年11月26日 15:14
*/
@WebFilter(urlPatterns = "/my/*",filterName = "myfilter") //是java原生提供,所以在项目容器启动主类上要添加@ServletComponentScan()
public class MyFilter implements Filter { @Override
public void init(FilterConfig filterConfig) throws ServletException { } @Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("这是我的拦截器------");
HttpServletRequest request = (HttpServletRequest)servletRequest;
HttpServletResponse response = (HttpServletResponse)servletResponse;
String servlet = request.getServletPath();
if (!servlet.endsWith("servlet")){
response.sendRedirect("/error");
return;
}
// 有值,就继续执行下一个过滤链
filterChain.doFilter(request, response);
} @Override
public void destroy() { }
}
- 通过注解@Configuration和@Bean实现启动服务时候加载Bean
package cn.lisongyu.demo; /**
* @author lisongyu
* @ClassName cn.lisongyu.demo.MyFilter2
* @description
* @create 2018年11月26日 15:56
*/
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException; @Configuration //装配配置到spring容器中
public class MyFilter2 { @Bean
public FilterRegistrationBean getMyFilter(){
FilterRegistrationBean<Filter> filter = new FilterRegistrationBean<>();
filter.setFilter(new Filter() {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("这是我的拦截器------");
HttpServletRequest request = (HttpServletRequest)servletRequest;
HttpServletResponse response = (HttpServletResponse)servletResponse;
String servlet = request.getServletPath();
if (!servlet.endsWith("servlet")){
response.sendRedirect("/error");
return;
}
// 有值,就继续执行下一个过滤链
filterChain.doFilter(request, response);
}
});
//过滤规则
filter.addUrlPatterns("/my/*");
//过滤器名称
filter.setName("myfilter2");
//过滤器顺序
filter.setOrder(1); return filter;
} }
Listener
监听器类型很多,本篇只做一个举例(HttpSessionListener)
- java原生@WebListener
package cn.lisongyu.demo; import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener; /**
* @author lisongyu
* @ClassName cn.lisongyu.demo.MyListener
* @description
* @create 2018年11月26日 16:17
*/
@WebListener
public class MyListener implements HttpSessionListener { public int count = 0; @Override
public void sessionCreated(HttpSessionEvent se) {
System.out.println("这里是listener.创建");
count ++;
se.getSession().getServletContext().setAttribute("count",count);
} @Override
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("这里是listener.关闭");
count --;
se.getSession().getServletContext().setAttribute("count",count);
}
}
- springboot2.0集成,通过@Configuration和@Bean注解实现
package cn.lisongyu.demo; import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener; /**
* @author lisongyu
* @ClassName cn.lisongyu.demo.MyListener2
* @description
* @create 2018年11月26日 16:50
*/
@Configuration
public class MyListener2 { @Bean
public ServletListenerRegistrationBean getMyListener(){
ServletListenerRegistrationBean listener = new ServletListenerRegistrationBean();
listener.setListener(new HttpSessionListener() {
int count;
@Override
public void sessionCreated(HttpSessionEvent se) {
System.out.println("这里是listener.创建");
count ++;
se.getSession().getServletContext().setAttribute("count",count);
} @Override
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("这里是listener.关闭");
count --;
se.getSession().getServletContext().setAttribute("count",count);
}
});
return listener;
} }
在Servlet组件当中,当前端发送请求时,后端的执行顺序是Filter->Servlet->Listener
SpringBoot2.0初识的更多相关文章
- (六)SpringBoot2.0基础篇- Redis整合(JedisCluster集群连接)
一.环境 Redis:4.0.9 SpringBoot:2.0.1 Redis安装:Linux(Redhat)安装Redis 二.SpringBoot整合Redis 1.项目基本搭建: 我们基于(五) ...
- Springboot2.0(Spring5.0)中个性化配置项目上的细节差异
在一般的项目中,如果Spring Boot提供的Sping MVC不符合要求,则可以通过一个配置类(@Configuration)加上@EnableWebMvc注解来实现完全自己控制的MVC配置.但此 ...
- springboot2.0.3源码篇 - 自动配置的实现,发现也不是那么复杂
前言 开心一刻 女儿: “妈妈,你这么漂亮,当年怎么嫁给了爸爸呢?” 妈妈: “当年你爸不是穷嘛!‘ 女儿: “穷你还嫁给他!” 妈妈: “那时候刚刚毕业参加工作,领导对我说,他是我的扶贫对象,我年轻 ...
- spring-boot-2.0.3源码篇 - pageHelper分页,绝对有值得你看的地方
前言 开心一刻 说实话,作为一个宅男,每次被淘宝上的雄性店主追着喊亲,亲,亲,这感觉真是恶心透顶,好像被强吻一样.........更烦的是我每次为了省钱,还得用个女号,跟那些店主说:“哥哥包邮嘛么叽. ...
- SpringBoot2.0之四 简单整合MyBatis
从最开始的SSH(Struts+Spring+Hibernate),到后来的SMM(SpringMVC+Spring+MyBatis),到目前的S(SpringBoot),随着框架的不断更新换代,也为 ...
- springBoot2.0+redis+fastJson+自定义注解实现方法上添加过期时间
springBoot2.0集成redis实例 一.首先引入项目依赖的maven jar包,主要包括 spring-boot-starter-data-redis包,这个再springBoot2.0之前 ...
- SpringBoot2.0+Mybatis-Plus3.0+Druid1.1.10 一站式整合
SpringBoot2.0+Mybatis-Plus3.0+Druid1.1.10 一站式整合 一.先快速创建一个springboot项目,其中pom.xml加入mybatis-plus 和druid ...
- springboot2.0 JPA配置自定义repository,并作为基类BaseRepository使用
springboot2.0 JPA配置自定义repository,并作为基类BaseRepository使用 原文链接:https://www.cnblogs.com/blog5277/p/10661 ...
- springboot2.0配置连接池(hikari、druid)
springboot2.0配置连接池(hikari.druid) 原文链接:https://www.cnblogs.com/blog5277/p/10660689.html 原文作者:博客园--曲高终 ...
随机推荐
- 智能化CRM客户关系管理系统介绍一
智能化CRM客户关系管理系统介绍一 CRM客户关系管理的定义是:企业为提高核心竞争力,利用相应的信息技术以及互联网技术来协调企业与顾客间在销售.营销和服务上的交互,从而提升其管理方式,向客户提供创新式 ...
- Fragment与Activity的接口回调
这里说一个官方推荐的写法: private OnFragmentInteractionListener mListener; @Override public void onAttach(Contex ...
- 在本地硬盘安装WinPE系统,实现UEFI引导,摆脱U盘
之前装系统一直用U盘装PE后再装系统,这次直接想把PE系统直接装在本地某个分区中,普通的PE制作工具只能直接装在一个硬盘里没法装在某个分区,百度发现没有一篇类似的文章,只能自己想办法了.目前的PE都支 ...
- DBA思考系列——凛冬将至,丧钟为谁而鸣!
诸多迹象昭示着凛冬将至,大萧条终于正式在全国各地拉开了序幕,很多80后的国人没有经历过苦日子,也没有经历过真正的金融危机.这场经济危机必将摧毁一些无视经济能力,盲目购房,盲目消费的家庭或个人.个人对经 ...
- c/c++ 继承与多态 继承时如何改变个别成员的访问属性
问题1:若类B以private的方式继承类A,但还想让类A的某些个别成员,保持public或者protected的访问属性,这时应该怎么办? 使用using,去改变访问属性. #include < ...
- 调试工具gdb
1.1 gdb符号调试器简介 gdb是一个用来调试C和C++程序的功能强大的调试器,它能在程序运行时观察程序的内部结构和内存的使用情况. gdb主要提供以下几种功能: 监视程序中变量值的变化 设置断点 ...
- 使用jquery实现选项卡切换效果
几张简陋的框架效果图 页面加载时: 选项卡操作后: css样式: <style type="text/css"> *{margin:0px;padding:0px;} ...
- SSH远程登录原理
使用ssh主要有两种登录方式:第一种为密码口令登录,第二种为公钥登录 密码口令登录 通过密码进行登录,主要流程为: 1.客户端连接上服务器之后,服务器把自己的公钥传给客户端 2.客户端输入服务器密码通 ...
- Cs231n课堂内容记录-Lecture 7 神经网络训练2
Lecture 7 Training Neural Networks 2 课堂笔记参见:https://zhuanlan.zhihu.com/p/21560667?refer=intelligent ...
- python文章装饰器理解12步
1. 函数 在python中,函数通过def关键字.函数名和可选的参数列表定义.通过return关键字返回值.我们举例来说明如何定义和调用一个简单的函数: def foo(): return 1 fo ...