JAVA面试题
这个是类的初始化顺序问题
1、类只有在使用New调用创建的时候才会被JAVA类装载器装入
2、JAVA类首次装入时,会对静态成员变量或方法进行一次初始化,但方法不被调用是不会执行的,静态成员变量和静态初始化块级别相同,非静态成员变量和非静态初始化块级别相同。
先初始化父类的静态代码--->初始化子类的静态代码-->
初始化父类的非静态代码--->初始化父类构造函数--->
初始化子类非静态代码--->初始化子类构造函数
3、创建类实例时,首先按照父子继承关系进行初始化
4、类实例创建时候,首先初始化块部分先执行,然后是构造方法;然后从
本类继承的子类的初始化块执行,最后是子类的构造方法
上例中类A类B都有静态代码static
从main函数开始:
Systemoutprintln(" ");
输出空格
A ab = new B();
声明为类A但初始化为类B
因为编译器是从左向右进行的,所以先是A ab;
执行Systemoutprint("1"); 因为没有new A();
所以不执行类A的构造函数那为什么会输出2呢
是因为B类是继承A类的,所是在执行new B();
的时候,执行顺序是初始化Systemoutprint("a");
然后先父类后子类,static代码只执行一次(已执行过);
执行Systemoutprint("2");
执行Systemoutprint("b");
执行Systemoutprintln(" ");
之后是ab = new B(); A,B中的static都已被执行过,
所以只执行构造函数,因B类有父类A,所以先执行A 类的构
造函数Systemoutprint("2");
再执行B类的构造函数
Systemoutprint("b");
spring 容器 内部工作机制
Spring的AbstractApplicationContext是ApplicationContext抽象实现类,该抽象类的refresh()方法定义了Spring容器在加载配置文件后的各项处理过程,这些处理过程清晰刻画了Spring容器启动时所执行的各项操作。下面,我们来看一下refresh()内部定义了哪些执行逻辑:
1.初始化BeanFactory:根据配置文件实例化BeanFactory,getBeanFactory()方法由具体子类实现。在这一步里,Spring将配置文件的信息装入到容器的Bean定义注册表(BeanDefinitionRegistry)中,但此时Bean还未初始化;
2.调用工厂后处理器:根据反射机制从BeanDefinitionRegistry中找出所有BeanFactoryPostProcessor类型的Bean,并调用其postProcessBeanFactory()接口方法;
3.注册Bean后处理器:根据反射机制从BeanDefinitionRegistry中找出所有BeanPostProcessor类型的Bean,并将它们注册到容器Bean后处理器的注册表中;
4.初始化消息源:初始化容器的国际化信息资源;
5.初始化应用上下文事件广播器;
6.初始化其他特殊的Bean:这是一个钩子方法,子类可以借助这个钩子方法执行一些特殊的操作:如AbstractRefreshableWebApplicationContext就使用该钩子方法执行初始化ThemeSource的操作;
7.注册事件监听器;
8.初始化singleton的Bean:实例化所有singleton的Bean,并将它们放入Spring容器的缓存中;
9.发布上下文刷新事件:创建上下文刷新事件,事件广播器负责将些事件广播到每个注册的事件监听器中。
在第34节中,我们观摩了Bean从创建到销毁的生命历程,这些过程都可以在上面的过程中找到对应的步骤。Spring协调多个组件共同完成这个复杂的工程流程,图5-1描述了Spring容器从加载配置文件到创建出一个完整Bean的作业流程以及参与的角色。
图5-1 IoC的流水线
1.ResourceLoader从存储介质中加载Spring配置文件,并使用Resource表示这个配置文件的资源;
2.BeanDefinitionReader读取Resource所指向的配置文件资源,然后解析配置文件。配置文件中每一个<bean>解析成一个BeanDefinition对象,并保存到BeanDefinitionRegistry中;
3.容器扫描BeanDefinitionRegistry中的BeanDefinition,使用Java的反射机制自动识别出Bean工厂后处理器(实现BeanFactoryPostProcessor接口)的Bean,然后调用这些Bean工厂后处理器对BeanDefinitionRegistry中的BeanDefinition进行加工处理。主要完成以下两项工作:
1)对使用到占位符的<bean>元素标签进行解析,得到最终的配置值,这意味对一些半成品式的BeanDefinition对象进行加工处理并得到成品的BeanDefinition对象;
2)对BeanDefinitionRegistry中的BeanDefinition进行扫描,通过Java反射机制找出所有属性编辑器的Bean(实现javabeansPropertyEditor接口的Bean),并自动将它们注册到Spring容器的属性编辑器注册表中(PropertyEditorRegistry);
4.Spring容器从BeanDefinitionRegistry中取出加工后的BeanDefinition,并调用InstantiationStrategy着手进行Bean实例化的工作;
5.在实例化Bean时,Spring容器使用BeanWrapper对Bean进行封装,BeanWrapper提供了很多以Java反射机制操作Bean的方法,它将结合该Bean的BeanDefinition以及容器中属性编辑器,完成Bean属性的设置工作;
6.利用容器中注册的Bean后处理器(实现BeanPostProcessor接口的Bean)对已经完成属性设置工作的Bean进行后续加工,直接装配出一个准备就绪的Bean。
Spring容器确实堪称一部设计精密的机器,其内部拥有众多的组件和装置。Spring的高明之处在于,它使用众多接口描绘出了所有装置的蓝图,构建好Spring的骨架,继而通过继承体系层层推演,不断丰富,最终让Spring成为有血有肉的完整的框架。所以查看Spring框架的源码时,有两条清晰可见的脉络:
1)接口层描述了容器的重要组件及组件间的协作关系;
2)继承体系逐步实现组件的各项功能。
接口层清晰地勾勒出Spring框架的高层功能,框架脉络呼之欲出。有了接口层抽象的描述后,不但Spring自己可以提供具体的实现,任何第三方组织也可以提供不同实现, 可以说Spring完善的接口层使框架的扩展性得到了很好的保证。纵向继承体系的逐步扩展,分步骤地实现框架的功能,这种实现方案保证了框架功能不会堆积在某些类的身上,造成过重的代码逻辑负载,框架的复杂度被完美地分解开了。
Spring组件按其所承担的角色可以划分为两类:
1)物料组件:Resource、BeanDefinition、PropertyEditor以及最终的Bean等,它们是加工流程中被加工、被消费的组件,就像流水线上被加工的物料;
2)加工设备组件:ResourceLoader、BeanDefinitionReader、BeanFactoryPostProcessor、InstantiationStrategy以及BeanWrapper等组件像是流水线上不同环节的加工设备,对物料组件进行加工处理。
我们在第3章中已经介绍了Resource和ResourceLoader这两个组件。在本章中,我们将对其他的组件进行讲解。
出处:http://blogcsdnnet//xujar/archive/2008/10/31/3193975aspx
1、singleton作用域
配置实例:
<bean id="role" class="springchapter2maryGameRole" scope="singleton"/>
2、prototype
配置实例:
<bean id="role" class="springchapter2maryGameRole" scope="prototype"/>
3、request
<bean id="role" class="springchapter2maryGameRole" scope="request"/>
4、session
<bean id="role" class="springchapter2maryGameRole" scope="session"/>
5、global session
配置实例:
和request配置实例的前提一样,配置好web启动文件就可以如下配置:
<bean id="role" class="springchapter2maryGameRole" scope="global session"/>
所以答案是ABCDE
第二题,不太会做,你可以参考一下http://baikebaiducom/view/1690487htm,希望能对 你有所帮助。
0条评论