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接口区别?
开发中基本都在使用ApplicationContext, web项目使用WebApplicationContext ,很少用到BeanFactory
3.Bean的注入属性的方式:
5.AOP的相关概念
切面(Aspect):一个关注点的模块化,这个关注点可能会横切多个切面
连接点(Joinpoint):程序执行过程中某个特定的点,如方法调用Spring连接点总是方法调用
通知(advice):在切面某个特定的连接点上执行的动作,有before,after,around等
切入点(PointCut):可以插入通知的连接点,简而言之,就是当某个连接点被添加advice时,该连接点就变成了切入点、
引入(Introduction):在不修改类的前提下,为类添加新的方法或属性
目标对象:被一个或多个切面所通知Advice的对象
织入(weaving):将增强处理添加到目标对象,并创建一个被增强对象的过程
AOP代理:AOP框架创建的对象
![](https://images2015.cnblogs.com/blog/916183/201703/916183-20170318153715776-287585623.jpg)
![](https://images2015.cnblogs.com/blog/916183/201703/916183-20170318165152323-191626275.png)
![](https://images2015.cnblogs.com/blog/916183/201703/916183-20170318165830166-1416037954.png)
基于AspectJ的XML配置(常用)
基于注解方式(常用)
7.通知Advice的类型
抛出异常后通知(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情形下有效。
(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 init-method="init">,则调用指定初始化方法 init
⑧如果实现 BeanPostProcessor的类与Bean关联 ,执行postProcessAfterInitialization()方法
⑨执行业务处理
⑩如果Bean实现 DisposableBean接口,则执行 destroy()方法
⑪调用<bean destroy-method="customerDestroy"> 指定销毁方法 customerDestroy