答案:
1.Mybatis是一种支持SQL的持久层框架,底层仍然是jdbc
2、Mybatis相对于直接使用JDBC,代码大大简化,比如能够直接将ResultSet中的数据转换成
所需要的java bean对象等。
3.Mybatis对SQL统一放到配置文件中进行管理,不用将SQL语句分散在各个java类中,方便代码的维护。
4.JDBC代码相对繁琐但访问速度跟快,比如使用JDBC批处理等方式效率比Mybatis要高。
答案:
1.事务是一系列操作组成的业务单元,该业务单元内的操作是不可分割的,即:要么所有操作都做,要么所有操作都不做。
2.事务具有4个特性,缺一不可,即:ACID(原子性,一致性,隔离性,和持久性)
3.原子性:事务是不可分割的最小业务单元,事务内的操作要么全部都做,要么全部都不做。
4.一致性:事务执行时,是从一个一致状态变成另一个一致状态。
5,隔离性:一个事务的执行,不受其他事务(进程)的干扰。
6.持久性:事务一旦提交,对数据库的改变是持久的。
答案:
1.正确配置数据库数据源。
2.配置事务管理器。
3.配置注解驱动事务。
4.结论:开发中尽量使用ApplicationContext就可以了
答案:
1.简化编程:Spring对javaEE中的一些比较繁琐的API做了简化和封装,使用封装之后的API不仅代码更简洁,而且质量更高。
2.解耦:对象之间的依赖关系由容器来统一管理,降低了对象之间的耦合度,方便代码的维护,同时也实现了资源的统一调度和管理。
3.支持面向编程AOP:可以方便对程序添加通用的服务,比如事务,权限管理等。
4.集成其他框架:不发明重复的轮子,集成其他一些优秀的框架,使开发者用统一的并且更加简洁的方式来使用这些框架。
5.轻量:可以依赖项目的实际要求,有选择的使用Spring框架的全部或者一部分。
答案:
1.每种方式都有他的缺点和优点。
2.构造器注入保证所有的注入都被初始化,但是setter注入提供更好的灵活性来设置可选依赖。
3.如果使用XML来描述依赖,Setter注入的可读写会更强。
4,经验法则是强制依赖使用构造器注入,可选依赖使用setter注入。
5.一般情况下尽量使用setter就可以了。
1.虽然两种模式都是将对象的创建从应用的逻辑中分离。但是依赖注入比工厂模式更清晰。
2.通过依赖注入,你的类就是POJO,它只知道依赖而不关心他们怎么获取。
3.使用工厂模式,你的类需要通过工厂来获取。
1.构造方法注入。
2.setter属性注入。
3.接口注入。
1.@Before:在方法正常执行后处理。
2.@AfterReturning:在方法正常执行后处理。
3.@AfterThowing:在方法执行期间抛出异常时处理。
4.@After:在方法执行前后无论是否有异常也处理。
5.@Around:在方法前后进行处理。
10.什么是Spring的AOP,AOP的工作原理是什么?
1、面向切面编程简称AOP。
2.SpringAOP是使用动态代码在运行期间植入增强的功能代码。
3.Spring的一个关键的组件就是AOP,其中最重要的是声明性事务管理,这个服务建立在Spring的抽象事务管理上。
4.允许用户实现自定义切面,用AOP来完善OOP的使用,可以把Spring AOP看作是对Spring的一种增强。
1.IOC inverse of Control 反转控制的概念,指的是对象之间的依赖关系交由容器(第三方)来管理。
2.DI:Dependency Injection 依赖注入,指容器通过调用构造器或者set方法来建立对象之间的依赖关系。
1.@Component:标准一个普通的spring Bean类。
2.@Repository:标注一个DAO组件类。
3.@Serice:标注一个业务编辑组件类。
4.@Controller:标注一个控制器组件类。
5.@Resource:注入组件。
1.用户发送请求至前端控制器DispatcherServlet。
2.DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3.处理器映射器根据请求url找到具体的处理器,生成处理器拦截对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
4.DispatcherServlet通过HandlerAdapter处理器适配器调用处理器。
5.执行处理器(Controller,也就后端控制器)。
6.Controller执行完成返回ModelAndView。
7.HandlerAdapter将Mcontroller执行结果ModelAndView返回给DispatcherServlet。
8.DispatcherServlet将ModeAndView传给ViewResolver试图解析器。
9.ViewResolver解析后返回具体View。
10.DispatcherServlet对View进行渲染视图,(即将模型数据填充至视图中。)
11.DispatcherServlet响应用户。
1.MVC是一种软件设计典范,用一种业务逻辑,数据,界面显示分离的方法组织代码。
2.将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,U币需要重新编写业务逻辑。
3.Model(模型)是应用程序中用于处理应用程序数据逻辑的部分,通常模型对象负责在数据库中存取数据。
4.View(试图)是应用程序中处理数据显示的部分,通常视图是依据模型数据创建的。
5.Controller(控制器)是应用程序中处理用户交互的部分,通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。
1.实例化BeanFactoryPostProcessor实现类。
2.执行BeanFactorPostProcessor的PostProcessorBeanFactory
3.实例化BeanPostProcessor实现类。
4.实例化InstantiationAwareBeanPostProcessBeforeInstantiantion方法
5.执行Bean的构造器
6.执行InstantiationAwareBeanPostProcessor的postProcessPropertyValues方法
7.为Bean注入属性。
8.调用BeanNameAware的setBeanName方法。
9,。调用BeanFactorAware的setBeanFactor方法。
10.执行BeanPostProcessor的postProcessBeforeInitizlization方法
11.调用InitializingBean的afterpropertiesSet方法。
12.调用Init-method属性指定的初始化方法。
13.执行BeanPostProcess的postProcessAfterInitialization方法。
14.执行InstantiationAwareBeanPostProcessor的postProcessorAfterInitialization方法。
15.容器初始化成功,执行正常调用后,下面销毁容器。
16.调用DiposibleBean的destroy方法。
17.调用的destroy-method属性指定的初始化方法。
1.ApplicationContext接口继承BeanFactory接口,Spring核心工厂是BeanFacter,BeanFactory采取延迟加载,第一次getBean时才会初始化Bean,ApplicationContext是会加载配置文件时初始化Bean。
2.ApplicationContext是对BeanFactory扩展,他可以进行国际化处理,事件传递和bean自动装配以及各种不同应用层的Context实现。
3,。开发中基本都在使用ApplicationContext,web项目使用WebApplicationContext,很少用到BeanFactory。
1.ContextLoaderListener是一个ServletContextLister,他在你的web应用启动的时候初始化。
2.缺省情况下,他会在WEB-INF、applicationContext。xml文件找Spring的配置。
3,你可以通过定义一个
1.SpringMVC中的Controller默认是单例的,因此有可能有多个请求访问同一个Controller实例。从而有可能产生线程安全问题,
2.因此尽量避免在Controller中使用实例变量。
3.使用ThreadLocal变量。
1.事务传播行为就是多个事务方法相互调用时,事务如何在这些方法间传播。
1.事务就是对一系列的数据库操作(比如插入多条数据)进行统一的提交或回滚操作,如果插入成功,那么一起成功,如果中间有一条出现异常,那么回滚之前的所有操作。
2.开发中为了避免这种情况一般会进行事务管理,Spring中也有自己的事务管理机制,一般是使用TransactionManager进行管理,可以通过Spring的注入来完成此功能。
3.PlatformTransactionManager这个是spring提供的用于管理事务的基础接口。
1.切面(Aspect):一个关注点的模块化,这个关注点可能会横切多个对象。事务管理是J2EE应用中一个关于横切关注点的很好的例子。在SpringAOP中,切面可以使用通用类(基于模式风格)或者在普通类中以@Aspect注解(@AspectJ风格)来实现。
2.连接点(Joinpoint):在程序执行过程中某个特定的点。比如某个方法调用的时候或者处理异常的时候。在SpringAOP中,一个连接点总是代表一个方法的执行。通过声明一个org。aspectj。lang。joinPoint类型的参数可以使通知(Advice)的主体部分获得连接点信息。
3.通知,(Advice):在切面的某个特定的连接点(joinpoint)上执行的动作,。通知有各种类型,其中包括“around”。“before”和“after”等通知。通知的部分将在后面的部分进行讨论。许多AOP框架,包括Spring,都是以拦截器做通知模型。并维护一个以连接点为中心的拦截器链。
4.切入点(Pointcut):匹配连接点(Joinpoint)的断言。通知和一个切入点表达式关联,并在满足这个切入点的连接点上运行(例如,当执行某个特定名称的方法时)切入点表达式如何和连接点匹配是AOP的核心,Spring缺省使用AspectJ切入点语法。
5.引入(introduction):(也被称为内部类型声明(inter-type-declaration)).声明额外的方法或者某个类型的字段。Spring允许引入新的接口(以及一个对应的实现)到任何被代理的对象。例如:你可以使用一个引入来使bean实现IsModified接口,以便简化缓存机制。
6.目标对象(Target Object):被一个或者多个切面(aspect)所通知(advise)的对象。也有人把它叫做被通知(advised)对象。既然SpringAOP是通过运行时代理实现的,这个对象永远是一个被代理(proxied)对象。
7.AOP代理(AOP Proxy):AOP框架创建的对象,用来实现切面契约(aspect contract)(包括通知方法执行等功能)。在Spring中AOP代理可以是JDK动态代理或者CGLIB代理。注意:Spring 2.0最新引入的基于模式(schema-based)风格和@AspectJ注解风格的切面声明,对于使用这些风格的用户来说,代理的创建是透明的。
8.织入(Weaving):把切面(aspect)连接到其他的应用程序类型或者对象上,并创建一个被通知(advised)的对象。这些可以在编译时(例如使用AspectJ编译器),类加载时和运行时完成,Spring和其他纯Java AOP框架一样,在运行时完成织入。
1.RFC1867规定了HTTP文件上载协议。
2.客户端
form标签中使用属性ENCTYPE=“multipart/form-data”
METHOD=POST
使用input type=file标签选择文件
3.服务器端
导入commons-fileupload组件
配置文件上载处理器
在控制器方法声明MultipartFile类型变量接收上载文件。
1.利用ApachePOI API生成Excel
2.在控制器中设置ContentType为Excel文件类型。
3.在控制器中设置Content-Disposition设定下载文件名。
1.Ajax的全称是Asychronous JavaScript And XML(异步的JavaScript 和XML);
2.是一种用来改善用户体验的技术。其实质是利用浏览器内置的一种特殊对象,(即ajax对象)异步的向服务器发送请求,服务器返回部分数据,浏览器利用这些数据修改当前页面,整个过程页面无刷新,不打断用户的请求。
1.通过异步模式,提升了用户体验。
2.优化了浏览器和服务器之间的传输,减少不必要的数据往返,减少了带宽占用。
3.Ajax引擎在客户端运行,承担了一部分本来由服务器承担的工作,从而减少了大用户量下的服务器负载。
4.Ajax可以实现动态不刷新(局部刷新)。
1.在基于Ajax的Web程序中,在用户行为和服务器端多了一层Ajax引擎,他负责处理用户的行为,并转化为对服务器的请求。
2,同时它接收服务器端的返回信息,经过处理后显示给用户。
3.由于Ajax在后台以异步的方式的工作,用户无需等待服务器的处理,可以进行并发工作,这就在用户界面层次中更为接近了CS架构的客户端平台。
1、JavaScript脚本语言。
2.可扩展标记语言(XML)。
3.文档对象模型(DOM)。
4.级联样式表(CSS)。
5.XMLHttpRequest对象。
1.WebORBfor java. Echo2
2.DWR,SWAOT
3.The AJAX JSP Tag Library.
4.The Ajax-JSF
1.Ajax的核心对象是XMLHttpRequest对象。
function createXmlHttpRequest(){
if(window.ActiveXObject){
return new ActiveXObject("Microsoft.XMLHTTP");
}else if(window.XMLHttpRequest){
return new XMLHttpRequest();
}
}
1.在客户端对web服务器发出请求。
2.web服务器接收到请求后将其发送给Servlet。
3.Servlet容器为此产生一个实例对象并调用ServletAPI中相应的方法来对客户端HTTP请求进行处理,然后将处理的响应结果返回给WEB服务器。
4.web服务器将从Servlet实例对象中收到的响应结果发送回客户端。
1.加载和实例化。
2.初始化。
3.请求处理。
4.服务终止。
1.使用cd命令进入到tomcat bin目录下
2.使用sh startup.sh即可启动。
1.重定向是两次请求,转发是一次请求,因此转发的速度要快于重定向。
2.重定向之后地址栏上的地址会发生变化,变化成第二次请求的地址,转发之后地址栏上的地址不会变化,还是第一次请求的地址。
3.转发是服务器行为,重定向是客户端行为,重定向时浏览器上的网址改变,转发是浏览器上的网址不变。
4.重定向是两次request,转发只有一次请求。
1.数据存放位置不同,cookie数据存放在客户的浏览器上,session数据放在服务器上。
2.安全程度不同,cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗
考录到安全,应当使用session。
3.性能使用程度不同,:session会在一定时间内保存在服务器上,当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用过cookie。
4.数据存储大小不同:单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie,而session则存储与服务器端,浏览器对其没有限制。
1.JSP有哪些内置对象:
*request:封装客户端请求,其中包含来自GET或POST请求的参数。
*response:封装的服务器对客户端的响应。
*pageContext:通过该对象可以获取其他对象。
*session:封装用户会话的对象。
*application:封装服务器运行环境的对象。
*out:输出服务器响应的输出流对象。
*config:Web应用的配置对象。
*page:JSP页面本身(相当于Java程序中的this)。
*exception:封装页面抛出异常对象。
1.JSP中的四种作用域包括page,request,session,和application,具体来说:
*page代表一个页面相关的对象和属性。
*request代表与Web客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个Web组件;需要在页面显示的临时数据可以置于此作用域。
*session代表与某个用户与服务器建立的一次会话相关的对象和属性。跟某个用户相关的数据应该放在用户自己的session中。
*application代表与整个Web应用程序相关的对象和属性,它实质上是跨越整个Web应用程序,包括多个页面,请求和回话的一个全局作用域。
1.JSP本质上是Servlet的一种简易形式,JSP会被服务器处理成一个类似于Servlet的java程序,可以简化页面内容的生成。
2.Servlet的应用逻辑是在java文件中,并且完全从表示层中的HTML分离开来,而JSP的情况是java和HTML可以组合成一个扩展名为jsp的文件。
3.JSP侧重于视图(view),Servlet更侧重于控制逻辑,充当控制器(controller)。
1.项目中主要使用了JSTL的核心标签库。
2.包括
3.主要用于构造循环和分支结构以控制显示逻辑。
1.动态INCLUDE用jsp:include动作实现,它总是会检查所含文件中的变化,适合用于包含
动态页面,并且可以带参数。
2.静态INCLUDE用include伪码实现,不会检查所含文件的变化。适用于包含静态页面<%@include file="included.htm"%>
1.快速创建独立运行的spring项目与主流框架集成。
2.使用嵌入式的servlet容器,应用无需打包成war包。
3.starters自动依赖于版本控制。
4,大量的自动配置,简化开发,也可修改默认值。
5.准生产环境的运行应用监控。
6.与云计算的天然集成。
1.为了实现SpringBoot的安全性,我们使用spring-boot-starter-security依赖项,
2,并且必须添加安全配置。它只需要很少的代码。
3,配置类将必须扩展WebSecurityConfigurerAdapter并覆盖其方法。
1.对于集成SpringBoot和ActiveMQ,我们使用spring-boot-starter-activemq依赖关系。
2.他只需要很少的配置,并且不需要样板代码。
1.使用springboot实现分页非常简单,使用Spring Data-JPA可以实现将可分页。
2.org。springbootframework。data。domain。pageable传递给存储库方法。
1。spring-boot-starter-web 嵌入tomcat和web开发需要servlet与jsp支持。
2。spring-boot-starter-data-jpa 数据库支持。
3。spring-boot-starter-data-solr solr支持。
4。mybatis-spring-boot-starter 第三方的mybatis集成starter。
1.单例模式是一种常用的软件设计模式。
2,在他的核心结构中包含一个被称为单例类的特殊类。通过单例模式可以保证系统中的一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。
3.应用场景:如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。
1.工厂模式主要是为创建对象提供了接口。
2.应用场景如下:
1).在编码时不能预见需要创建哪种类的实例。
2).系统不应依赖于产品类实例如何被创建,组合和表达细节。
1.策略模式:定义了算法族,分别封装起来,让他们之间可以互相替换。此模式让算法的变化独立于使用算法的客户。
2.应用场景如下:
1)。一件事情,有很多方案可以实现。
2)。我可以在任何时候,决定采用哪一种实现。
3)。未来可能增加更多的方案。
4)。策略模式让方案的变化不会影响到使用方案的客户。
1.观察者模式又被称作发布/订阅模式,定义了对象间一对多依赖,当一个对象改变状态时,他的所有依赖者都会收到通知并自动更新。
2.应用场景如下:
1)。对一个对象状态的更新,需要其他对象同步更新,而且其他对象的数量动态可变。
2)。对象仅需要将自己的更新通知给其他对象而不需要知道其它对象的细节。
1,迭代器模式提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。
2,应用场景如下:
1),当你需要访问一个聚焦对象,而且不管这些对象是什么都需要遍历的时候,就应该考虑用迭代器模式。其实stl容器就是很好的迭代器模式的例子。
1,模板方法模式定义一个操作中的算法的骨架,将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些步骤。
2.应用场景如下:
1),对于一些功能,在不同的对象身上展示不同的作用。但是功能的框架是一样的。
1.)互斥条件:一个资源每次只能被一个进程使用。
2)。请求与保持条件,一个进程因请求资源而阻塞时,对已获得的资源保持不放。
3)。不剥夺条件:进程已获得的资源,在未使用完之前,不能强行剥夺。
4)。循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
1)频繁的创建和销毁线程,达到线程对象的重用,另外,使用线程池还可以根据项目灵活地控制并发的数目。
1)基本数据类型比变量和对象的引用都是在栈分配的。
2)堆内存用来存放有new创建的对象和数组。
3)类变量(static修饰的变量),程序在一加载的时候就在堆中为类变量分配内存,堆中的内存地址存放在栈中。
4)实例变量:当你使用java关键字new的时候,系统在堆中开辟并不一定是连续的空间分配给变量,是根据零散的对内存地址,通过哈希算法换算为一长串数字以表征这个变量在堆中的“物理位置”,实例变量的声明周期-当实例变量的引用丢失后,将被GC(垃圾回收器)列入可回收“名单”中,但并不是马上就释放堆中内存。
5),局部变量:由声明在某方法,或某代码段里(比如for循环),执行到他的时候再栈中开辟内存,当局部变量一旦脱离作用域,内存立即释放。
1)默认的存储引擎,提供告诉存储和检索,以及全文搜索能力。不支持事务。
2)表级锁。不能在表损坏后恢复数据。
3)适合在以下几种情况下使用:
(1):做很多count(总计)的计算。
(2):查询非常频繁。
1)具有提交,回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎。支持事务和外键。行级锁。
2)一般来说,如果需要事务支持,并且有较高的并发读取频率,InnoDb是不错的选择。
1)直接插入排序
2)希尔排序
3)简单选择排序
4)堆排序
5)冒泡排序
6)快速排序
7)归并排序
8)基数排序