Java面试总结

下面总结为个人观点,如有错误,请指正。

1. IOC,什么是IOC,IOC原理,IOC的理解

IOC是Spring的核心机制,IOC叫做控制反转,是将主动创建对象的过程变成了有容器去控制,也就是获得对象的过程被反转了,由于获取对象的过程变成了由IOC容器主动注入,所以IOC又称DI(依赖注入)。就是说在IOC容器运行期间,动态的将某种依赖对象注入到对象中。具体也就是在启动Spring容器加载bean配置的时候,完成对变量的赋值注入。

例如,在项目中,如果不使用Spring,我们在Action层调用对Service层,Service层调用DAO层等需要通过new对象来创建,hibernate中创建sessionfactory需要先new configuration,在由configuration.buildSessionFactory(),而使用Spring后,通过xml配置文件配置,或者注解配置,将这些全部交由IOC容器去控制,动态注入。

2. Spring容器:BeanFactory接口和ApplicationContext接口区别?

①Spring核心工厂是BeanFactory ,而ApplicationContext 接口继承BeanFactory接口,BeanFactory采取延迟加载,第一次getBean时才会初始化Bean, ApplicationContext是会在加载配置文件时初始化Bean。
②ApplicationContext是对BeanFactory扩展,它可以进行国际化处理、事件传递和bean自动装配以及各种不同应用层的Context实现 

开发中基本都在使用ApplicationContext, web项目使用WebApplicationContext ,很少用到BeanFactory

3.Bean的注入属性的方式:
设值注入,构造器注入,接口注入。
Spring支持构造器注入和设值注入。
构造器注入,通过 <constructor-arg> 元素完成注入
setter方法注入, 通过<property> 元素完成注入【开发中常用方式】
 
4. AOP,什么是AOP,对AOP的理解
AOP是面向切面编程,它从切面的角度思考,弥补了面向对象编程(OOP)的不足,作为OOP的补充和完善。
简单来说,AOP就是不改变原有代码的前提下,为系统业务组件的多个方法添加通用方法。比如日志记录,异常处理,事务控制等。
Spring的AOP代理是由Spring的IOC容器负责生产,管理的,依赖关系也由IOC负责管理。
Spring AOP创建动态代理规则:
默认使用Java动态代理来创建AOP代理,这是基于接口的。
也可以使用不基于接口的,采用cglib基于类的动态创建AOP代理。强制使用CGLIB生成代理,在<aop:config>里面有一个"proxy-target-class"属性,将属性值设置为true即可。
 

5.AOP的相关概念

切面(Aspect):一个关注点的模块化,这个关注点可能会横切多个切面

连接点(Joinpoint):程序执行过程中某个特定的点,如方法调用Spring连接点总是方法调用

通知(advice):在切面某个特定的连接点上执行的动作,有before,after,around等

切入点(PointCut):可以插入通知的连接点,简而言之,就是当某个连接点被添加advice时,该连接点就变成了切入点、

引入(Introduction):在不修改类的前提下,为类添加新的方法或属性

目标对象:被一个或多个切面所通知Advice的对象

织入(weaving):将增强处理添加到目标对象,并创建一个被增强对象的过程

AOP代理:AOP框架创建的对象

 
6.Spring的事务管理
事务就是一系列的数据库操作,进行统一提交或者回滚操作,要么一起成功,要么全部失败回滚所有操作。
事务特性:
原子性:指事务是一个不可分割的工作单位,事务中操作要不都发生,要不都不发生
一致性:事务前后数据的完整性必须保持一致。
隔离性:指多个用户并发访问数据库时,一个用户的事务不能被其他用户的事务所干扰,要相互隔离。
  不考虑隔离性,会产生脏读,不可重复读,幻读。
持久性:一旦被提交,数据库改变是永久性的。
Spring事务接口:
PlatformTransactionManager 事务管理器
  具体实现类:DataSourceTransactionManager,HibernateTransactionManager
TransactionDefinition  事务定义信息(隔离,传播行为,超时信息)
  事务的传播行为主要解决业务层方法之间相互调用的问题。
  ISOLATION属性
mysql默认级别是repeatable_read,oracle默认级别是read_committed
TransactionStatus  事务运行状态
boolean hasSavepoint() 是否有保存点,boolean isCompleted(),boolean isNEw Transaction(),boolean isRollbackOnly(),
void setRollbackOnly(), void flush();
 
事务管理两种方式:
-编程式事务管理
  通过TranesactionTemplate手动创建管理事务
  在xml配置事务管理器,配置事务模板TransactionTemplate,手动编写代码,使用模板方法execute(参数),需要TransactionCallback参数
  
-使用XML配置声明式事务
  (原始方式)使用TransactionProxyFactoryBean围绕Proxy动态代理,自动提交和回滚。
   * 需要为每一个进行事务管理的类配置一个TransactionProxyFactoryBean进行增强
 

  基于AspectJ的XML配置(常用)

  基于注解方式(常用)

  

7.通知Advice的类型

前置通知(Before advice):在某连接点(join point)之前执行的通知,但这个通知不能阻止连接点前的执行(除非它抛出一个异常)。
返回后通知(After returning advice):在某连接点(join point)正常完成后执行的通知:例如,一个方法没有抛出任何异常,正常返回。 
抛出异常后通知(After throwing advice):在方法抛出异常退出时执行的通知。 
后通知(After (finally) advice):当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)。 
环绕通知(Around Advice):包围一个连接点(join point)的通知,如方法调用。这是最强大的一种通知类型。 环绕通知可以在方法调用前后完成自定义的行为。它也会选择是否继续执行连接点或直接返回它们自己的返回值或抛出异常来结束执行。 

 8.Spring bean的作用域

singleton: 当一个bean的作用域为singleton, 那么Spring IoC容器中只会存在一个共享的bean实例,并且所有对bean的请求,只要id与该bean定义相匹配,则只会返回bean的同一实例。

prototype:  Prototype作用域的bean会导致在每次对该bean请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean() 方法)时都会创建一个新的bean实例。根据经验,对所有有状态的bean应该使用prototype作用域,而对无状态的bean则应该使用 singleton作用域

request: 在一次HTTP请求中,一个bean定义对应一个实例;即每次HTTP请求将会有各自的bean实例, 它们依据某个bean定义创建而成。该作用 域仅在基于web的Spring ApplicationContext情形下有效。

session: 在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。

global session: 在一个全局的HTTP Session中,一个bean定义对应一个实例。典型情况下,仅在使用portlet context的时候有效。该作用域仅在基于 web的Spring ApplicationContext情形下有效。

 9.Spring生命周期

(1)bean定义

    在配置文件里面用<bean id=" " class=" " init-method=" " destory-method=" "></bean>来进行定义。

(2)bean初始化

    有两种方式初始化:

A.在配置文件中通过指定init-method属性来完成

B.实现org.springframwork.beans.factory.InitializingBean接口

(3)bean调用

    有三种方式可以得到bean实例,并进行调用

(4)bean销毁

    销毁有两种方式

A.使用配置文件指定的destroy-method属性

B.实现org.springframwork.bean.factory.DisposeableBean接口

  *  destroy-method 只对 scope="singleton" 有效 

 完整生命周期;

①IOC容器找到Bean的定义并实例化Bean

②对Bean进行注入属性

③如果Bean实现BeanNameAware 接口,工厂调用Bean的setBeanName()方法传递Bean的ID。

④如果Bean实现BeanFactoryAware 接口,工厂调用setBeanFactory()方法传入工厂自身。

⑤如果有实现BeanPostProcessor的类和Bean关联,那么其postProcessBeforeInitialization()方法将被将被调用。

⑥如果Bean类已实现org.springframework.beans.factory.InitializingBean接口,则执行他的afterProPertiesSet()方法

⑦如果定义了<bean init-method="init">,则调用指定初始化方法 init

⑧如果实现 BeanPostProcessor的类与Bean关联 ,执行postProcessAfterInitialization()方法

⑨执行业务处理

⑩如果Bean实现 DisposableBean接口,则执行 destroy()方法

⑪调用<bean destroy-method="customerDestroy"> 指定销毁方法 customerDestroy

 10.面向对象设计原则
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
posted @ 2017-03-18 14:37  渣渣的步伐  阅读(226)  评论(0编辑  收藏  举报