1.什么是Spring框架?
Spring是一个轻量级的java开源框架,为了解决企业级应用开发的复杂性创建的java开发平台,其核心是为了简化java开发,为了简化java开发,Spring采取以下四种策略:
- 基于pojo的轻量级和最小入侵式编程。
- 通过依赖注入和面向接口编程实现松耦合
- 基于切面实现声明式编程
- 通过切面和模板减少样板式代码
2.Spring框架有哪些主要的模块?
- Spring IOC : Spring的核心模块,包含了最基本的IoC容器BeanFactory的接口和实现,IOC容器的高级使用行态ApplicationContext应用上下文供用户使用。
- Spring Aop: Spring的核心模块,围绕着AOP的增强功能,Spring集成了Aspectj作为AOP的一个特定实现,同时还基于jdk动态代理(代理对象有接口的时候)/CGLIB(字节码生成的开源类库,代理对象没接口的时候)的基础上,实现了一个AOP框架。
- Spring MVC : 以DispatcherServlet为核心,实现了MVC模式,包括怎么样与WEB容器环境的集成,web请求的分发,拦截,处理和ModelAndView数据的返回,以及如何集成各种UI视图展现和数据表现。
- Spring jdbc/Spring ORM :Spring 对jdbc做了一层封装,提供了JdbcTemplate作为模板类,Spring提供了许多对ORM工具的封装。
- Spring 事务处理:Spring事务处理是使用Spring aop对功能进行增强的模块,提供IOC容器读入配置。
3.什么是控制反转?什么是依赖注入?
控制反转也称为依赖倒置原则,如果对象之间的依赖关系由具体的对象来完成,那么将要导致代码的高度耦合和可测试性降低,如果把对象的依赖关系交给Ioc容器或者框架来完成,把具体的控制权交给平台或者框架来处理,将会降低面向对象系统设计的复杂性和提高系统的可测试性,控制反转是指一个对象如何获取它所依赖的对象的引用,反转是指责任的反转。
4.Spring IOC 应用场景
Spring中,Spring IOC 提供了JavaBean容器,通过IOC模式管理依赖关系,并通过依赖注入和AOP切面增强了为JavaBean这样的POJO对象赋予了事务管理等基本功能,使用IOC容器,把资源获取的方向反转,让IOC容器主动管理这些依赖关系,将这些依赖关系注入到组件中,那么会让这些依赖关系的适配和管理更加灵活,有三种注入方式:
- 接口注入
- setter注入
- 构造器注入
5.BeanFactory和ApplicationContext的区别
在Spring容器中主要有两个系列的基本容器,一个是实现BeanFactory接口的简单系列容器,这个容器只实现了最基本容器功能;另一个是ApplicationContext应用上下文,它作为容器的高级形态而,这个容器在简单容器的基础上增加了许多面向框架的特性。
ApplicationContext容器提供了BeanFactory不具备的新特性:
- 支持不同的信息源。
- 访问资源。
- 支持应用事件。
- 在ApplicationContext提供附加服务。
几种应用上下文(IoC容器):
1.AnnotationConfigApplicationContext:从一个或多个基于java配置类中加载Spring应用上下文,加载bean,然后包装成BeanDefinition。
2.AnnotationConfigWebApplicationContext:从一个或多个基于java配置类中加载Spring Web应用上下文,加载bean。
3.ClassPathXmlApplicationContext:从类路径下的一个或多个xml配置文件中加载Spring应用上下文。
4.FileSystemXmlApplicationContext:从文件系统下的一个或多个XML配置文件中加载上下文定义。
5.XmlWebApplicationContext:从web应用下的一个或多个xml配置文件中加载上下文定义。
6. Spring的配置方式
1.基于xml配置。
2.基于注解的配置
3.基于java类的配置
7.如何使用基于xml配置的方式配置Spring
使用xml文件配置,bean标签。
8.如何适应基于java类的方式配置Spring
对于java配置类加上@Configration注解,对于pojo加上@Bean注解。
9.如何使用基于注解的方式配置Spring
这种方式也叫做自动化装配(应用组件之间的协作),Spring从两个角度实现自动化装配
1.组件扫描:Spring会自动发现应用上下文所创建的bean
为pojo加上@Component注解,表明它是一个java bean。在通过@ComponnentScan注解来开启组件扫描(java 类配置的方式@Configuration注解)或者xml文件,默认会扫描与配置类相同的包。
如何设置扫描的基础包:@ComponentScan(basesPackage={"包名","包名"})
2.自动装配:Spring自动满足bean之间的依赖。
让Spring自动满足bean依赖的一种方法,可以使用@Autowired注解进行自动装配。
10.Spring bean的生命周期(bean的创建过程)
- Spring对bean进行实例化
- Spring将值和bean引用注入到bean对应的属性中
- 如果bean实现了BeanNameAware接口,Spring将bean的id传给setBeanName()方法
- 如果bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory()方法,将BeanFactory传入
- 如果bean实现了ApplicationContextAware接口,Spring将调用setApplicationContext()方法,将bean所在的应用上下文的引用传入进来。
- 如果bean实现了BeanPostProcessor接口,Spring将调用它们的postProcessBeforeInitialization()方法。
- 如果bean实现了InitializingBean接口,Spring将调用它们的postProcessAfterInitialization()方法。
- 此时bean已经准备就绪,可以被应用程序所使用了,它们将一直驻留在应用上下文中,直到该应用上下文被销毁。
11.Spring bean的作用域
在默认情况下Spring IOC容器中的所有bean都是以单例形式创建的,改变bean作用域可以使用@Scope注解来改变。xml 中 <scope = "prototype">
- 单例:在整个应用中,只创建bean的一个实例。
- 原型:每次注入或者通过Spring应用上下文获取的时候,都会创建一个bean实例。
- 会话:在web应用中,为每个会话创建一个bean实例。
- 请求:在web应用中,为每个请求创建一个bean实例。
12.Spring用到哪些设计模式
单例模式 --- bean加载默认单例
代理模式 -- AOP
工厂模式 --- Ioc容器BeanFactory就是使用工厂模式
模板方法模式 --- 封装jdbc的方法,jdbcTemplate
控制反转模式 --- Spring核心Ioc的生成。
13.Spring 如何实现IoC
Spring有两种类型的容器BeanFactory和ApplicationContext,
使用Ioc容器时的几个步骤:
- 创建IoC配置文件的抽象资源,这个抽象资源包含了BeanDefinition的定义信息。
- 创建一个BeanFactory
- 创建一个BeanDefinition的读取器,这里使用XmlBeanDefinitionReader来载入XML文件形式的BeanDefinition
- 从定义好的资源位置读取配置信息,具体的解析过程由XmlBeanDefinitionReader来完成。完成整个载入和注册Bean定义之后,需要的IoC容器就建立起来了。
IoC容器的实现过程:
第一步:IoC容器的初始化,这个过程包括BeanDefinition的Resource定位,载入和注册三个基本过程。
- 定位:BeanDefinition的资源定位。
- BeanDefinition的载入过程,这个载入是指把用户定义好的Bean表示成IoC容器的内部数据结构BeanDefinition。
- 向IoC容器中注册这些BeanDefinition的过程,就是将BeanDefinition注入到一个HashMap中去,IoC容器就是通过这个HashMap来持有这些BeanDefinition数据的。
第二步:IoC容器的依赖注入
getBean()方法是依赖注入的起点,Bean对象会依据BeanDefinition定义的要求生成,提供了两种实例化java对象的方法,一种通过JVM的反射功能,一种通过前面提到的CGLIB来生成。其依赖关系在BeanDefinition中。
14.Spring如何实现AOP
AOP面向切面编程,Spring提供了两种AOP实现:Spring AOP + AspectJ.
第一步:创建AopProxy代理对象,代理对象的生成有两种生成过程,
1.使用JDK的动态代理。
2.使用字节码生成器CGLIB生成。
如果目标对象是接口类,则采用JDK动态代理方式生成,否则使用CGLIB来生成。
第二步:对调用方法进行拦截,当代理对象的暴露的方法被调用时,首先会对这些方法调用进行拦截,拦截过程在JDK的Proxy代理对象中,是通过invoke方法来完成的,在CGLIB的Proxy代理对象中,拦截是由设置好的回调callback来完成的。
15.Spring 中bean的创建过程
Spring bean实例化,然后调用一系列的生命周期方法完成bean的创建,默认是以单例模式创建的,原型,会话,请求模式。
16.Spring bean的加载机制
Spring中的IoC容器来加载bean,有两种类型的IoC容器,BeanFactory,ApplicationContext。
首先,初始化IoC容器,就是定位,载入和注册BeanDefinition,就是在容器内部维持一个hashmap装载BeanDefinition。然后对IoC容器进行依赖注入,bean对象会根据BeanDefinition的要求生成,通过了两种实例化java对象的方法,JVM反射和CGLIB.
17.Spring MVC是什么?
Spring是一个java软件开发平台,提供IoC AOP 事务处理 持久化等功能,Spring MVC是未用户开发web应用提供支持。
18.Spring IOC容器是怎么样在web环境中发挥作用的?
Spring MVC是建立在IOC容器基础上的,因此要先启动ioc容器,启动过程如下:
从servlet事件中得到ServletContext,然后通过读取web.xml中的配置文件,
ContextLoaderListener被定义为一个监听器,这个监听器是与web服务器生命周期相关联的,因为ContextLoaderListener 实现ServletContextListener接口,这个接口监听ServletContext事件,然后调用ContextLoader初始化Ioc容器。
19.Spring MVC的过程?
Spring MVC的核心是DispatcherServlet,DispatcherServlet继承HttpServlet,DispatcherSevlet的工作主要有两个,
1.DispatcherServlet的启动和初始化,DispatcherServlet的启动过程是和Servlet的启动过程相联系的,Servlet初始化时其init方法会被调用,DispatcherServlet的初始化过程由其基类的HttpServletBean完成,接着会执行DispatcherServlet的持有的IoC容器的初始化过程,初始化时一个新的上下文被建立起来,这个上下文被设置为根上下文的子上下文,和Servlet对应的一个上下文。DispatcherServlet会初始化HandlerMapping和ViewResolver,默认使用的HandlerMapping是BeanNameUrlHandlerMapping
-
对HTTP请求进行响应:在初始化完成之后,上下文环境已经定义的HandlerMapping已经被加载了,这些加载的HandlerMapping被放到一个List中,这个List中的每一个元素对应着一个具体的HandlerMapping得配置,每个HandlerMapping持有一系列的从url到Controller的映射,通过HandlerMapping接口类的getHandler()方法,可以获得与HTTP请求对应的HandlerExecutionChain,这个HandlerExecutionChain它有一个Inteceptor链和一个Controller对象.
Spring MVC的执行步骤 - 建立Controller对象和HTTP请求之间的映射关系,这个工作是由HandlerMapping中封装的HandlerExecutionChain对象来完成的,对Controller对象和URL的映射关系式在配置bean中描述的,并在IOC容器(WebApplicationContext)中初始化,这些映射关系会被放入到hashmap中。
- 在mvc框架接受http请求之后,会在handlermapping中进行查询,从而得到对应的HandlerExecutionChain,这个HandlerExecutionChain封装了配置的Controller对象,这个Controller对象会完成的请求的响应动作,生成需要的ModelAndView对象
- 得到ModelAndView以后,DispatcherServlet会把模型数据交给特定的视图对象。
20.Spring支持事物,如何管理?
Spring事务处理模块是通过AOP功能来实现声明式事务处理的,通过TransactionProxyFactoryBean可以生成Proxy代理对象,在这个代理对象中,通过TransactionInterceptor来完成代理方法的拦截,将事务处理的功能编织进来,在实现声明式事务处理时是AOP和IOC模块集成的部分,对于具体的事务处理实现,比如事务的生成,提交,挂起,回滚,对于不同的数据库处理方式做了一个抽象和适配,适配的具体事务处理器包括,对DataSource数据源的事务处理支持,对Hibernate数据源的事务处理支持等。
21.Spring Dao那种设计模式用的最多?
模板方法设计模式,JdbcTemplate就是Spring对jdbc进行封装的数据库操作的类。
22.Spring MVC用过哪些注解?
@Controoler ---- 定义这个pojo是Controller
@Autowired ---- 注入这个对象
@RequestMapping --- 定义url映射关系
@SessionAttributes --- 设置会话对象
@ResponseBody --- 响应体
@Transactional --- 对数据库操作做事务处理
23.Spring AOP 场景和底层实现?
事务处理,日志打印就是一个典型的aop应用,生成代理对象AopProxy然后对调用方法进行拦截,从而实现对目标对象的增强,生成AopProxy的过程由两种,当代理对象实现接口时,使用jdk动态代理,当没有接口时使用CGLIB来生成字节码文件,cglib底层采用的是对ASM,ASM是一个可以动态修改已经编译过的class文件或者是动态生成新的java class。