复习完了spring后,对一些面试时问的spring常见问题总结一下。
此笔记仅供自己参考,如有错误请指正
参考自:Spring常见面试题总结(超详细回答)
它是一个轻量式的IOC容器和AOP容器开源框架。其目的是为了简化企业级应用程序开发,使开发人员只需关注业务需求。常见的配置方式有3种:基于xml的配置;基于注解的配置;基于Java的配置
其主要的模块有以下几个:
应用程序中的组件获取资源时,传统的方式是组件主动去容器中获取所需的资源,这种模式下,开发人员往往需要知道在具体的容器中特定资源的获取方式,大大增加了学习成本,同时降低了开发效率。
IOC,Inversion Of Control,反转控制。反转控制的思想颠覆了传统的方式:反转了资源的获取方向——改由容器主动将资源推荐给需要的组件,开发人员不需要知道容器是如何创建对象的,只需要提供接收资源的方式即可。降低了学习成本,提高了开发效率。这种行为也称为被动的查找形式。
DI,Dependency Injection,依赖注入。依赖注入是指组件以一些预定义好的方式(比如setter方法、构造器)接收来自容器的资源注入。
IOC与DI的关系:IOC是一种思想,反转控制的思想;而DI是IOC的一种具体实现
AOP,Aspect Oriented Programming,面向切面编程。它是OOP(面向对象编程)的扩充。AOP主要的编程对象是切面,切面是由若干个横切关注点组成的。而横切关注点是从各个方法中抽取出来的同一类非核心业务。总之,切面模块化横切关注点。在应用AOP编程时,我们仍然需要定义公共功能,此外还可以明确定义这个功能应用到哪里,以什么方式应用,并且不必修改受影响的类。
在通过IOC容器读取Bean的实例之前,首先需要将IOC容器实例化。
Spring提供了2种IOC容器的实现方式:
(1)BeanFactory:IOC容器的基本实现,面向Spring内部,不提供给开发人员使用。BeanFactory可以理解成定义了各种Bean的工厂。它包含了各种Bean的定义,以便收到客户端请求后将对应的Bean实例化。BeanFactory还包含了Bean生命周期的控制,调用客户端的初始化方法(init-methods)和销毁方法(destruction-methods)
(2)ApplicationContext:它是BeanFactory的子接口,提供了更多高级特性,提供给开发人员使用。几乎所有场合都是使用ApplicationContext而不是底层的BeanFactory。
上面IOC容器在Spring中的实现涉及到了BeanFactory和ApplicationContext。两者的区别如下:
BeanFactory:
ApplicationContext:
除了包含BeanFactory的功能,还提供了许多高级特性,比如:
ApplicationContext context = new ClassPathXmlApplicationContext("xxx.xml");
ApplicationContext context = new FileSystemXmlApplicationContext("xxx.xml");
XmlWebApplicationContext:由web应用的XML文件读取上下文
AnnotationConfigApplicationContext:基于Java配置启动容器
在spring框架中,我们常用xml文件来配置依赖和服务。这些配置文件是由一个
标签组成,在
标签里面包含着许多
标签以及其他配置选项。Spring的XML配置方式是使用被Spring命名空间所支持的一些列组件来实现的,如context,bean,tx,aop,jdbc,mvc。
只需要在方法上、类上或者字段声明上使用注解即可。注解注入会被容器在XML注入之前处理,所以后者会覆盖前者对同一属性的处理结果。
注解装配在Spring中默认是关闭的,需要在xml文件中配置如下才能打开:
<beans>
<context:annotation-config/>
beans>
在
标签完成后,我们可以使用注解向属性、方法、构造方法中自动装配变量。
常用的注解类型有如下:
使用@Configuration和@Bean来实现
的作用是一样的。例子:
@Configuration
public class AppConfig{
@Bean
public MyService myService() {
return new MyServiceImpl();
}
}
相当于以下在xml文件中配置:
<beans>
<bean id="myService" class="com.somnus.services.MyServiceImpl"/>
beans>
上述配置方式的实例化方式如下:利用AnnotationConfigApplicationContext类进行实例化:
public static void main(String[] args) {
ApplicationContext ctx = new
AnnotationConfigApplicationContext(AppConfig.class);
MyService myService = ctx.getBean(MyService.class);
myService.doStuff();
Spring bean生命周期的源码分析(超级详细)