JVM java虚拟机是一个可以执行java字节码的虚拟机进程。java源文件要被编译成java虚拟机可以执行的字节码
一、杂
1、servlet 生命周期
Servlet的整个周期都是由web服务器控制的
1)创建:
创建的时候,会调用init方法 (第一次访问servlet的时候创建)
2)运行:
每次请求的时候,会调用service方法提供服务(每次请求的时候)
3)销毁:
销毁的时候,会调用destroy方法(停止服务器的时候/重新部署web应用)
Servlet生命周期内调用的方法过程?
Init()
Service()
doGet或者doPost
destroy
2、 面向对象的三大特征是什么?
封装:也就是把客观事物封装成抽象的类,封装可以隐藏实现细节,使得代码模块化。
继承:继承是指这样的一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
多态:实现多态,有两种方式,重写和重载。
重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数/类型。
重写:参数和返回类型必须相同
3、数据库的事务是什么?具有哪些特征?
原子性:对数据修改操作要么全部执行,要么完全不执行。事务必须是一个不可分割的整体,就像我们在化学课里学到的原子,原子是构成物质的最小单位。事务也是这样,不能做一半就不做了,要么做完,要么就不做。
一致性:执行完数据库操作后,数据不会被破坏。打个比方,如果从 A 账户转账到 B 账户,不可能因为 A 账户扣了钱,而 B 账户没有加钱吧。
分离性:
并发的事务是相互隔离的。即一个事务内部的操作以及正在操作的数据必须封锁起来,不被其他企图进行修改的事务看到。
持久性:
确保已提交事务的更新不能丢失。
4、第一范式、第二范式……
1NF:实体中的某个属性不能有多个值或者不能有重复的属性。
简而言之,第一范式就是无重复的列,属性不可分割。例如,由“职工号”“姓名”“电话号码”组成的表
2NF:
数据库表中的每个实例或行必须可以被唯一地区分。
二范式就是要有主键,要求其他字段都依赖于主键。没有主键就没有唯一性,没有唯一性在集合中就定位不到这行记录,所以要主键。
3NF:
消除传递依赖,就是各种信息只在一个地方存储,不出现在多张表中。
每个非主属性都不传递依赖。
5、事务并发访问的问题?
①脏读:一个事务读到了另一个事务未提交的数据;
②不可重复读:不可重复读是指A事务读取了B事务已经提交的更改数据。假如A在取款事务的过程中,B往该账户转账100,A两次读取的余额发生不一致。
③虚读/幻读:在同一个事务中,多次查询的结果不一致(由insert引起的)
不可重复读和幻读的区别是:前者是指读到了已经提交的事务的更改数据(修改或删除),后者是指读到了其他已经提交事务的新增数据。
6、隔离的级别
读未提交:就是一个事务可以读取另一个未提交事务的数据。
读已提交 —— oracle默认:就是一个事务要等另一个事务提交后才能读取数据。
大多数数据库默认的事务隔离级别是Read committed
重复读 ——mysql默认:就是在开始读取数据(事务开启)时,不再允许修改操作。
串行化:同时只能执行一个事务,相当于单线程事务。缺点是效率低。
7、Servlet中如何获取用户提交的查询参数或表单数据?
①HttpServletRequest的getParameter()方法。
②HttpServletRequest的getParameterValues()方法。
③HttpServletRequest的getParameterMap()方法。
8、Sql优化有那些方法?
表的设计要规范,即要符合数据库设计三范式。
适当建立索引,在频繁作为检索条件,更新较少的字段上建立索引,以提高查询速度。
分表查询,有水平分割、垂直分割。
读写分离,读(read)、写(create、update、delete)。
建立存储过程。
9、什么是异步?什么是同步?
同步:所有的操作都做完,才返回给用户。
异步:不用等所有操作等做完,就相应用户请求。即先响应用户请求,然后慢慢去写数据库。
串行:先洗完衣服再做饭,或者先做完饭再洗衣服。
并发:一会洗衣一会做饭,但疾如闪电。
并行:把洗衣盆拿到灶台上,左手挥铲右手搓衣。并行(parallelise)同时刻(某点)
二、Spring
2、IOC&&DI
控制反转
在传统的程序设计过程中,通常由调用者来创建被调用者的实例对象。
创建被调用者的工作由spring来完成,然后注入调用者 直接使用。
DI :由于Spring容器负责被调用者实例,实例创建后又负责将该实例注入调用者,因此称为依赖注入。
3、Spring常见创建对象的注解?
@controller 控制器(注入服务)
@service 服务(注入dao)
@repository (实现dao访问)
@component (把普通 实例化到spring容器中,相当于配置文件中的<bean id="" class=""/>)
PS:DAO(Data Access Object) 数据访问对象是一个面向对象的数据库接口,,并允许开发者通过 ODBC 像直接连接到其他数据库一样。
4、Spring的事务管理
Spring事务的本质其实就是数据库对事务的支持。
事务是一系列的动作,一旦其中有一个动作出现错误,必须全部回滚,滚回到事务开始的状态。
7、在Web项目中如何获得Spring的IoC容器?
WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(servletContext)
8、请分别写出一对一,一对多,多对一,多对多的PO类映射文件?
9、Spring中的BeanFactory和ApplicationContext有什么联系?
Spring通过配置文件描述Bean以及Bean之间的依赖关系,利用Java的反射机制实现Bean的实例化,并建立Bean之间的依赖关系。
Spring的IoC容器还提供了Bean实例缓存、生命周期管理、Bean实例代理、事件发布等服务。
②BeanFactory是Spring框架最核心的接口,它提供了IoC容器的配置机制。
③ApplicationContext建立在BeanFactory之上,提供了更多面向应用功能。
④通常将BeanFacory称为IoC容器,而ApplicationContext称之为应用上下文,前者更倾向于Spring本身,后者更倾向于开发者,因此被使用得更多。
ApplicationContext context = new ClassPathXmlApplicationContext(“bean.xml”) ;
ApplicationContext context = new FileSystemXmlApplicationContext(“bean.xml”);
@ContextConfiguration(locations={……})获取Spring配置文件
10、Spring框架中Bean的生命周期?
组装的及被Spring 容器管理的Java对象,把Bean理解为类的代理
① Spring IoC容器找到关于Bean的定义并实例化该Bean。
② Spring IoC容器对Bean进行依赖注入。
③ 如果Bean实现了BeanNameAware接口,则将该Bean的id传给setBeanName方法。
④ 如果Bean实现了BeanFactoryAware接口,则将BeanFactory对象传给setBeanFactory方法。
……
⑧ 当销毁Bean实例时,如果Bean实现了DisposableBean接口,则调用其destroy方法。
11、Spring的优点
1.降低了组件之间的耦合性
2.可以使用容易提供的众多服务,如事务管理,消息服务等
3.容器提供了AOP技术,利用它很容易实现如权限拦截
4.spring对于主流的应用框架提供了集成支持,如hibernate,JPA,Struts等
5.Spring的高度开放性,并不强制应用完全依赖于Spring,开发者可以自由选择spring 的部分或全部
12、DI
依赖注入
依赖注入是一个IOC的特殊实现,依赖注入是指一个对象应用另外一个对象来提供一个特殊的能力。
例如:把一个 数据库连接以参数的形式传到一个对象的结构方法里面而不是在那个对象内部自行创建一个连接。
控制反转和依赖注入的基本思想就是把类的依赖从类内部转化到外部以减少依赖。
13、Spring有几种配置方式?
@Configuration配置类
将Spring配置到应用开发中有以下三种方式:
基于XML的配置
基于注解的配置@ComponentScan("com.example")
基于Java的配置@Bean
14、Spring Bean的作用域?
singleton : bean在每个Spring ioc 容器中只有一个实例。
prototype:一个bean的定义可以有多个实例。
request:每次http请求都会创建一个bean。
session:在一个HTTP Session中,一个bean定义对应一个实例。
15、@Autowired
Spring 容器启动时,AutowiredAnnotationBeanPostProcessor 将扫描 Spring 容器中所有 Bean,当发现 Bean 中拥有 @Autowired 注释时就找到和其匹配(默认按类型匹配)的 Bean,并注入到对应的地方中去。
16、在 Spring中如何注入一个java集合?
<list>类型用于注入一列值,允许有相同的值。
<set> 类型用于注入一组值,不允许有相同的值。
<map> 类型用于注入一组键值对,键和值都可以为任意类型。
17、使用Spring通过什么方式访问Hibernate?
18、Spring MVC的工作原理?
客户端的所有请求都交给前端控制器DispatcherServlet来处理,它会负责调用系统的其他模块来真正处理用户的请求。
DispatcherServlet收到请求后,将根据请求的信息(包括URL、HTTP协议方法、请求头、请求参数、Cookie等)以及HandlerMapping的配置找到处理该请求的Handler(任何一个对象都可以作为请求的Handler)。
在这个地方Spring会通过HandlerAdapter对该处理器进行封装。
HandlerAdapter是一个适配器,它用统一的接口对各种Handler中的方法进行调用。
Handler完成对用户请求的处理后,会返回一个ModelAndView对象给DispatcherServlet,ModelAndView顾名思义,包含了数据模型以及相应的视图的信息。
ModelAndView的视图是逻辑视图,DispatcherServlet还要借助ViewResolver完成从逻辑视图到真实视图对象的解析工作。
当得到真正的视图对象后,DispatcherServlet会利用视图对象对模型数据进行渲染。
客户端得到响应,可能是一个普通的HTML页面,也可以是XML或JSON字符串,还可以是一张图片或者一个PDF文件。
19、Spring AOP
面向切面编程:减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。
横切关注点:对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点
切面(aspect):类是对物体特征的抽象,切面就是对横切关注点的抽象
通知(advice):指拦截到连接点之后要执行的代码,通知分为前置、后置、异常、最终、环绕通知五类
//写一个切面类
@Aspect
public class LogAspect {
@Pointcut("execution(* com.ctj.service.*.*(..))")
public void pointcutName(){}
@Before("pointcutName()")
public void performance(){
System.out.println("Spring AOP");
}
}
@RestController
@RequestMapping(value = "/aop")
public class AopTestController {
public Result test(@RequestParam boolean throwException) {
System.out.println("test OK");
}
}
//执行顺序
[Aspect1] around advise 1
[Aspect1] before advise
test OK
[Aspect1] around advise2
[Aspect1] after advise
[Aspect1] afterReturning advise
Spring中AOP代理由Spring的IOC容器负责生成、管理,其依赖关系也由IOC容器负责管理。