1.AOP:
AOP将散落在系统中的“方面”代码集中实现
AOP有助于提高系统可维护性
AOP是一种设计模式,Spring提供了一种实现
2.关于Spring的理解
IoC的实现原理就是工厂模式加反射机制
DI依赖注入是由容器动态地将某种依赖关系的目标对象实例注入到应用系统中的各个关联的组件之中
Spring默认使用JDK动态代理来创建AOP代理,当需要代理的类不是代理接口的时候,自动切换使用CGLIB代理
3.Spring开发模式的工作流程:
1)pring MVC请所有的请求都提交给DispatcherServlet
2)DispatcherServlet查询一个或多个HandlerMapping,找到处理请求的Controller
3)DispatcherServlet请请求提交到目标Controller
4)Controller进行业务逻辑处理后,会返回一个ModelAndView
5)找到ModelAndView对象指定的视图对象
6)视图对象负责渲染返回给客户端
4.关于spring mvc 和struts2的描述
spring mvc是基于方法的设计,而struts2是基于类的设计
struts2有以自己的interceptor机制,spring mvc用的是独立的AOP方式
spring mvc的方法之间基本上独立的,独享request response数据,struts2所有Action变量是共享的
5.Spring DAO
Spring提供的DAO(数据访问对象)支持主要的目的是便于以标准的方式使用不同的数据访问技术。
异常包装:Spring能够包装Hibernate异常,把它们从CheckedException变为RuntimeException; 开发者可选择在恰当的层处理数据中不可恢复的异常,从而避免烦琐的 catch/throw 及异常声明
Spring提供的DAO支持了JDBC、JDO和Hibernate
6.PROPAGATION_REQUIRED
如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。
PROPAGATION_SUPPORTS
支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY
使用当前的事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW
新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED
以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER
以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED
如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作
7
8.
抽象类
特点:
1.抽象类中可以构造方法
2.抽象类中可以存在普通属性,方法,静态属性和方法。
3.抽象类中可以存在抽象方法。
4.如果一个类中有一个抽象方法,那么当前类一定是抽象类;抽象类中不一定有抽象方法。
5.抽象类中的抽象方法,需要有子类实现,如果子类不实现,则子类也需要定义为抽象的。
接口
1.在接口中只有方法的声明,没有方法体。
2.在接口中只有常量,因为定义的变量,在编译的时候都会默认加上
public static final
3.在接口中的方法,永远都被public来修饰。
4.接口中没有构造方法,也不能实例化接口的对象。
5.接口可以实现多继承
6.接口中定义的方法都需要有实现类来实现,如果实现类不能实现接口中的所有方法
7.则实现类定义为抽象类。
9.值类型的变量赋值只是进行数据复制,创建一个同值的新对象,而引用类型变量赋值,仅仅是把对象的引用的指针赋值给变量,使它们共用一个内存地址。
10.Runnable和Callable的说法
Runnable和Callable都是接口
Runnable和Callable都采用Thread.start()启动线程
Callable接口的call()方法允许抛出异常,Runnable的run()方法异常只能在内部消化,不能往上继续抛
11.垃圾回收的算法
引用计数法
标记清除算法
复制算法
12.ROW_NUMBER()和RANK()
当碰到相同数据时,row_number()排名按照记录集中记录的顺序依次递增
当遇到相同数据时,rank()函数返回不唯一的值
rank()是跳跃排序
13.请简述java语言中,ArrayList、Vector、LinkedList的关系与区别:
ArrayList,LinkedList,Vestor这三个类都实现了java.util.List接口,同在java.util包下,他们都允许null值。 区别:ArrayList 和Vector是采用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,都允许直接序号索引元素,但是插入数据要设计到数组元素移动等内存操作,所以索引数据快插入数据慢。 Vector由于使用了synchronized方法,是线程安全的,所以性能上比ArrayList要差。 LinkedList使用双向链表实现存储,按序号索引数据需要进行向前或向后遍历,但是插入数据时只需要记录本项的前后项即可,所以插入数度较快! ArrayList和LinkedList都不是线程安全的。
14.无限制创建线程的不足有哪些?
1、线程生命周期的开销非常高。线程的创建和销毁都是有代价的,线程的创建过程都需要时间,并且需要JVM和操作系统提供一些辅助操作,如果请求的到达率非常高而且请求的处理过程是轻量级的,那么为每个请求创建一个新线程将消耗大量的计算资源; 2、资源消耗。活跃的线程会消耗系统资源,尤其内存。如果运行的线程数多于可用的处理器数量,那么这些线程将闲置。大量空闲的线程会占用许多内存,给垃圾回收器带来压力,而且大量线程竞争CPU资源时还会产生其他的性能开销。 3、稳定性。在可创建的线程数量上存在一个限制,破坏了这些限制可能会抛出OutOfMemoryError异常,要想从这些错误中恢复过来是非常危险的,更简单的方法时哦通过构造程序来避免超出这些限制。