发表于: 2019-11-06 20:49:19

1 982


今天做了什么:

准备小课堂:什么是spring boot:

spring boot的原理

从启动类说起
一. @SpringBootApplication
是三个常用在一起的注解@SpringBootConfiguration,@EnableAutoConfiguration以及@ComponentScan的组合
1.@SpringBootConfiguration
和@Configuration有相同的作用,配备了该注解的类就能够以JavaConfig的方式完成一些配置,可以不再使用XML配置。
2.@ComponentScan 完成的是自动扫描的功能,相当于Spring XML配置文件中的<context:component-scan>
(默认扫描@ComponentScan注解所在类的同级类和同级目录下的所有类)
3.@EnableAutoConfiguration
启动自动配置.这个注解是让Spring Boot的配置能够如此简化的关键性注解
二. 关键方法 SpringApplication.run(DemoApplication.class, args);
相应实现
// 参数对应的就是DemoApplication.class以及main方法中的args
public static ConfigurableApplicationContext run(Class<?> primarySource,
        String... args) {
    return run(new Class<?>[] { primarySource }, args);
}
// 最终运行的这个重载方法
public static ConfigurableApplicationContext run(Class<?>[] primarySources,
        String[] args) {
    return new SpringApplication(primarySources).run(args);
}
这个重载方法它实际上会先构造一个SpringApplication的实例,然后运行他的run方法
构造实例
public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {
    this.resourceLoader = resourceLoader;
    Assert.notNull(primarySources, "PrimarySources must not be null");
    this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources));
    this.webApplicationType = deduceWebApplicationType();
    setInitializers((Collection) getSpringFactoriesInstances(
            ApplicationContextInitializer.class));
    setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
    this.mainApplicationClass = deduceMainApplicationClass();
}
构造函数中做的四件事情:
通过一个boolean变量判断应用类型是否是web
设置初始化器initializer
设置监听器Listener
判断应用入口类
完成实例化后,开始调用run方法
获取run listeners
根据SpringApplicationRunListeners以及参数来准备环境
创建Spring上下文
Spring上下文前置处理
Spring上下文刷新
Spring上下文后置处理


收获,Java基础:

监听器作用和用法:
监听器是application,session,request三个对象创建,销毁或者往其中添加修改属性时自动执行代码的功能组件.
①ServletContextListener:对Servlet上下文的创建和销毁进行监听。
②ServletContextAttributeListener:监听Servlet上下文属性的添加、删除和替换。
③HttpSessionListener:对Session的创建和销毁进行监听。
④HttpSessionAttributeListener:对Session对象中属性的添加、删除和替换进行监听。
⑤ServletRequestListener:对请求对象的初始化和销毁进行监听。
⑥ServletRequestAttributeListener:对请求对象属性的添加、删除和替换进行监听。
web.xml
配置Web应用的相关信息,如:监听器(listener)、过滤器(filter)、 Servlet、相关参数、会话超时时间、安全验证方式、错误页面等
对Servlet,Listener,Filter三大组件的配置,Servlet3提供了基于注解的配置方式 @WebServlet、@WebListener、@WebFilter
JSTL标签
JSTL核心标签库 
实际开发中建议只使用核心标签库(core),而且最好只使用分支和循环标签并辅以表达式语言(EL),这样才能真正做到数据显示和业务逻辑的分离,这才是最佳实践。
标签库,自定义JSP标签
使用标签库的好处:
- 分离JSP页面的内容和逻辑,简化了Web开发; 
- 开发者可以创建自定义标签来封装业务逻辑和显示逻辑; 
- 标签具有很好的可移植性、可维护性和可重用性; 
- 避免了对Scriptlet(小脚本)的使用(很多公司的项目开发都不允许在JSP中书写小脚本)
自定义jsp标签步骤:
  • 写一个java类实现 Tag/BodyTag/IterationTag接口(通常 是继承TagSupport/BodyTagSupport/SimpleTagSupport类,这是对缺省适配模式的应用), 重写doStartTag()、doEndTag()等方法,定义标签要完成的功能 
  • 编写扩展名为tld的标签描述文件对自定义标签进行部署,tld文件通常放在WEB-INF文件夹下或其子目录中 
  • 在JSP页面中使用taglib指令引用该标签库
EL表达式隐式对象及其作用
隐式对象包括:pageContext、initParam(访问上下文参数)、param(访问请求参数)、paramValues、header(访问请求头)、headerValues、cookie(访问cookie)、applicationScope(访问application作用域)、sessionScope(访问session作用域)、requestScope(访问request作用域)、pageScope(访问page作用域)
${header["accept-language"]}
${headerValues["accept-language"][0]}
表达式语言的.和[]运算作用是一致的,唯一的差别在于如果访问的属性名不符合Java标识符命名规则,例如上面的accept-language就不是一个有效的Java标识符,那么这时候就只能用[]运算符而不能使用.运算符获取它的值
EL表达式支持哪些运算符
除了.和[],还有
- 算术运算符:+、-、*、/或div、%或mod
- 关系运算符:==或eq、!=或ne、>或gt、>=或ge、<或lt、<=或le
- 逻辑运算符:&&或and、||或or、!或not
- 条件运算符:${statement? A : B}(跟Java的条件运算符类似)
- empty运算符:检查一个值是否为null或者空(数组长度为0或集合中没有元素也返回true)
JavaWeb开发的Model1和Model2指什么
Model 1是以页面为中心的Java Web开发,使用JSP+JavaBean技术将页面显示逻辑和业务逻辑处理分开,JSP实现页面显示,JavaBean对象用来保存数据和实现业务逻辑。
Model 2是基于MVC(模型-视图-控制器,Model-View-Controller)架构模式的开发模型,实现了模型和视图的彻底分离,利于团队开发和代码复用
Servlet3中的异步处理指什么
总结一句话:为了效率.
因为如果一个任务处理时间相当长,那么Servlet或Filter会一直占用着请求处理线程直到任务结束,随着并发用户的增加,容器将会遭遇线程超出的风险,在这种情况下很多的请求将会被堆积起来而后续的请求可能会遭遇拒绝服务,直到有资源可以处理请求为止。异步特性可以帮助应用节省容器中的线程,特别适合执行时间长而且用户需要得到结果的任务,如果用户不需要得到结果则直接将一个Runnable对象交给Executor并立即返回即可。
JavaWeb实现文件上传/下载
在Sevlet 3 以前,Servlet API中没有支持上传功能的API,因此要实现上传功能需要引入第三方工具从POST请求中获得上传的附件或者通过自行处理输入流来获得上传的文件,例如apache commons-fileupload.
Servlet3后文件上传就很简单了
服务器收到用户提交的表单数据,到底是调用Servlet的doGet()还是doPost()方法? 
HTML的<form>元素有一个method属性,用来指定提交表单的方式,其值可以是get或post。我们自定义的Servlet一般情况下会重写doGet()或doPost()两个方法之一或全部,如果是GET请求就调用doGet()方法,如果是POST请求就调用doPost()方法
那为什么为什么这样呢
自定义的Servlet通常继承自HttpServlet,HttpServlet继承自GenericServlet并重写了其中的service()方法,这个方法是Servlet接口中定义的。HttpServlet重写的service()方法会先获取用户请求的方法,然后根据请求方法调用doGet()、doPost()、doPut()、doDelete()等方法,如果在自定义Servlet中重写了这些方法,那么显然会调用重写过的(自定义的)方法,这显然是对模板方法模式的应用
JSP的静态包含和动态包含
静态包含,通过JSP的include指令包含页面,是编译时包含,若包含页面不存在则产生编译错误.且量页面的contentType属性要一直.因为两个页面会合二为一,只产生一个class文件, 因此被包含页面发生的变动再包含它的页面更新前不会得到更新
动态包含,通过JSP标准动作<jsp:forward>包含页面, 是运行时包含,可以向被包含的页面传递参数,包含页面和被包含页面是独立的,会编译出两个class文件,如果被包含的页面不存在,不会产生编译错误,也不影响页面其他部分的执行。
Servlet
获取用户提交的查询参数或表单数据
  • 可通过HttpServletRequest的 getParameter()方法 通过参数名获得参数值.
  • getParameterValues()方法获得包含多个值的参数(例如复选框). 
  • getParameterMap()获得一个参数名和参数值的映射(Map)
获取用户配置的初始化参数以及服务器上下文参数
可以通过重写Servlet接口的init(ServletConfig)方法并通过ServletConfig对象的getInitParameter()方法来获取Servlet的初始化参数。
可以通过ServletConfig对象的getServletContext()方法获取ServletContext对象,并通过该对象的getInitParameter()方法来获取服务器上下文参数。当然,ServletContext对象也在处理用户请求的方法(如doGet()方法)中通过请求对象的getServletContext()方法来获得。
设置请求的编码以及响应内容的类型 
通过请求对象(ServletRequest)的setCharacterEncoding(String)方法可以设置请求的编码,应该让页面、服务器、请求和响应、Java程序都使用统一的编码,最好的选择当然是UTF-8;
通过响应对象(ServletResponse)的setContentType(String)方法可以设置响应内容的类型,也可以通过HttpServletResponsed对象的setHeader(String, String)方法来设置。
网络应用模式及其特点
典型大概三类, B/S、C/S、P2P
P2P是对等模式,不区分客户端和服务器。该应用模式中,成千上万台彼此连接的计算机都处于对等的地位,整个网络一般来说不依赖专用的集中服务器。网络中的每一台计算机既能充当网络服务的请求者,又对其它计算机的请求作出响应,提供资源和服务。通常这些资源和服务包括:信息的共享和交换、计算资源(如CPU的共享)、存储共享(如缓存和磁盘空间的使用)等,这种应用模式最大的阻力是安全性、版本等问题
B/S应用模式中可以视为特殊的C/S应用模式,只是将C/S应用模式中的特殊的客户端换成了浏览器,因为几乎所有的系统上都有浏览器,那么只要打开浏览器就可以使用应用,没有安装、配置、升级客户端所带来的各种开销。
此题要跟"电子商务模式"区分开,因为有很多人被问到这个问题的时候马上想到的是B2B(如阿里巴巴)、B2C(如当当、亚马逊、京东)、C2C(如淘宝、拍拍)、C2B(如威客)、O2O(如美团、饿了么)
什么是WebService
WebService 向外界暴露出一个能够通过Web调用的API. 无需了解细节,也无关于编程语言,你能够用编程的方法透明的调用这个应用程序.
之所以称之为Web Service,是因为它基于HTTP协议传输数据,这使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件,就可相互交换数据或集成。
补充:这里必须要提及的一个概念是SOA(Service-Oriented Architecture,面向服务的架构),SOA是一种思想,它将应用程序的不同功能单元(组件/服务)通过中立的契约联系起来,独立于硬件平台、操作系统和编程语言,使得各种形式的功能单元能够更好的集成。
显然,Web Service是SOA的一种较好的解决方案,它更多的是一种标准,而不是一种具体的技术。
概念:SOAP,WSDL,UDDI
WebService三大基本元素
- SOAP:简单对象访问协议(Simple Object Access Protocol),是Web Service中交换数据的一种协议规范
- WSDL:Web服务描述语言(Web Service Description Language),它描述了Web服务的公共接口。这是一个基于XML的关于如何与Web服务通讯和使用的服务描述;也就是描述与目录中列出的Web服务进行交互时需要绑定的协议和信息格式。通常采用抽象语言描述该服务支持的操作和信息,使用的时候再将实际的网络协议和信息格式绑定给该服务。
- UDDI:统一描述、发现和集成(Universal Description, Discovery and Integration),它是一个基于XML的跨平台的描述规范,可以使世界范围内的企业在互联网上发布自己所提供的服务。简单的说,UDDI是访问各种WSDL的一个门面(门面模式)。
协议,描述语言,门面.
Java-WebService规范
- JAX-WS(JSR 224):这个规范是早期的基于SOAP的Web Service规范JAX-RPC的替代版本,它并不提供向下兼容性,因为RPC样式的WSDL以及相关的API已经在Java EE5中被移除了。WS-MetaData是JAX-WS的依赖规范,提供了基于注解配置Web Service和SOAP消息的相关API。
- JAXM(JSR 67):定义了发送和接收消息所需的API,相当于Web Service的服务器端。
- JAX-RS(JSR 311 & JSR 339 & JSR 370):是Java针对REST架构风格制定的一套Web Service规范。REST是一种软件架构模式,是一种风格,它不像SOAP那样本身承载着一种消息协议, (两种风格的Web Service均采用了HTTP做传输协议,因为HTTP协议能穿越防火墙,Java的远程方法调用(RMI)等是重量级协议,通常不能穿越防火墙),因此可以将REST视为基于HTTP协议的软件架构。REST中最重要的两个概念是资源定位和资源操作,而HTTP协议恰好完整的提供了这两个点。HTTP协议中的URI可以完成资源定位,而GET、POST、OPTION、DELETE方法可以完成资源操作。因此REST完全依赖HTTP协议就可以完成Web Service,而不像SOAP协议那样只利用了HTTP的传输特性,定位和操作都是由SOAP协议自身完成的,也正是由于SOAP消息的存在使得基于SOAP的Web Service显得笨重而逐渐被淘汰。
Java-WebService框架
包括Axis2(Axis的升级版本)、Jersey(RESTful的Web Service框架)、CXF(XFire的延续版本)、Hessian、Turmeric、JBoss SOA等
Jave EE框架
什么是ORM
对象关系映射,为了解决程序的面向对象模型与数据库的关系模型互不匹配问题技术.
通过使用描述对象和数据库之间映射的元数据(用XML或注解)将程序中的对象自动持久化到关系数据库中或者将关系数据库中的行转换成Java对象,本质上就是数据从一种形式转换到另一种形式.
持久层的设计,持久层框架
持久化是指 将内存中的数据保存到关系型数据库、文件系统、消息队列等提供持久化支持的设备中
持久层就是系统中专注于实现数据持久化的相对独立的层面。
持久层设计的目标:
- 提供抽象化的数据访问接口, 数据存储逻辑的分离 
- 可以在不修改代码的情况下切换底层实现, 数据访问底层实现的分离 
- 在数据访问层实现统一的资源调度(如缓存机制), 资源管理和调度的分离 
- 数据抽象,提供更面向对象的数据操作。
- Hibernate
- MyBatis
- TopLink
- Guzz
- jOOQ
- Spring Data
- ActiveJDBC
Hibernate中SessionFactory是线程安全的吗?Session是线程安全的吗(两个线程能够共享同一个Session吗)
SessionFactory是线程安全的, 可以被多个线程并发访问。SessionFactory一般只会在启动的时候构建。对于应用程序,最好将SessionFactory通过单例模式进行封装以便于访问.
Session是一个轻量级非线程安全的对象(线程间不能共享session),它表示与数据库进行交互的一个工作单元。
Session是由SessionFactory创建的,在任务完成之后它会被关闭。Session是持久层服务对外提供的主要接口。Session会延迟获取数据库连接(也就是在需要的时候才会获取)。为了避免创建太多的session,可以使用ThreadLocal将session和当前线程绑定在一起,这样可以让同一个线程获得的总是同一个session。(Hibernate 3中SessionFactory的getCurrentSession()方法就可以做到。)
Hibernate中Session的load和get方法区别


遇到的问题

明天计划


返回列表 返回列表
评论

    分享到