synchronized主要为线程提供同步功能,而volatile主要是设置参数的可见性。
我们也听说过Java的面向接口编程,即官方提供一系列接口给第三方去实现,然后利用接口去调用第三方的实现类,如果有多个第三方都实现了该接口,那么对于官方来说,都可以利用该接口调用这些第三方的实现类,且不关心第三方是如何具体实现的,我只管调用就行了。
JDBC正是利用了接口编程思想,JDBC只是接口,JDBC驱动才是该接口的实现类,每个数据库都有其对应的JDBC驱动,没有JDBC驱动是没有办法连接数据库的!
在分布式系统上开发时,各个子系统又有独立的数据库,进行跨数据库联表查询往往导致系统性能会很差,这相当于把业务逻辑也放在数据库上执行了,且大量采用关联查询会导致项目很难进行分布式扩展。
这时候,我想到了Collection的Stream API,再结合Lambda表达式,解决拼装数据再完美不过了。
ApplicationContextAware的作用是可以方便获取Spring容器ApplicationContext,从而可以获取容器内的Bean。
public interface ApplicationContextAware extends Aware {
void setApplicationContext(ApplicationContext var1) throws BeansException;
}
ApplicationContextAware接口只有一个方法,如果实现了这个方法,那么Spring创建这个实现类的时候就会自动执行这个方法,把ApplicationContext注入到这个类中,也就是说,spring 在启动的时候就需要实例化这个 class(如果是懒加载就是你需要用到的时候实例化),在实例化这个 class 的时候,发现它包含这个 ApplicationContextAware 接口的话,sping 就会调用这个对象的 setApplicationContext 方法,把 applicationContext Set 进去了。
上文也说过,HttpServletBean继承了Httpservlet,因此它也遵循Servlet流程来处理用户请求。
Servlet创建时的初始化过程中,会调用init()方法,我们可以在init()方法内做一系列的初始化动作,比如给Servlet的私有变量赋值,事实上SpringMVC在初始化过程中经常干这种事情。我们知道,在Servlet初始化过程中,Servlet把init-param的属性放在ServletConfig里,然后在循环它拿到值,但是这样太费劲了,所以SpringMVC索性把init-param赋值到自己的私有属性中。
HttpservletBean继承了HttpServlet,所以它也是一个Servlet,它也是FrameworkServlet的父类,而FrameworkServlet是DispatcherServlet的父类,每个类都有自己相关的初始化动作,这是典型的Template Method模板设计模式,每个类都会完成一些自己的本职工作,把不属于自己的本职工作推给自己的子类去完成。
Tomcat是一个基于组件形式的的Web容器,由Server(服务器)、Service(服务)、Connector(连接器)、Engine(引擎)、Host(主机)、Context(应用服务)组成,它们在server.xml里配置:
这个小组件,它会帮我们解析request中的上传数据,解析后的结果是一个表单项数据封装到一个FileItem对象中。我们只需要调用FileItem的方法即可。
一个Workbook类可以看成一个Excel文件(即工作簿):
Sheet sheet = Workbook.createSheet("sheetName");// 创建一个Sheet类,Sheet为工作簿中的工作表
Row row = sheet.createRow("rowName");// 创建一个Row类,Row为工作表中的某一行
Cell cell = row.createCell("cellName");// 创建一个Cell类,Cell为某一行中的单元格的值