Spring相关问题

作者: gskobe0811 | 来源:发表于2017-08-22 15:45 被阅读41次

    1.什么是Spring框架?

    Spring是一个轻量级的java开源框架,为了解决企业级应用开发的复杂性创建的java开发平台,其核心是为了简化java开发,为了简化java开发,Spring采取以下四种策略:

    1. 基于pojo的轻量级和最小入侵式编程。
    2. 通过依赖注入和面向接口编程实现松耦合
    3. 基于切面实现声明式编程
    4. 通过切面和模板减少样板式代码

    2.Spring框架有哪些主要的模块?

    1. Spring IOC : Spring的核心模块,包含了最基本的IoC容器BeanFactory的接口和实现,IOC容器的高级使用行态ApplicationContext应用上下文供用户使用。
    2. Spring Aop: Spring的核心模块,围绕着AOP的增强功能,Spring集成了Aspectj作为AOP的一个特定实现,同时还基于jdk动态代理(代理对象有接口的时候)/CGLIB(字节码生成的开源类库,代理对象没接口的时候)的基础上,实现了一个AOP框架。
    3. Spring MVC : 以DispatcherServlet为核心,实现了MVC模式,包括怎么样与WEB容器环境的集成,web请求的分发,拦截,处理和ModelAndView数据的返回,以及如何集成各种UI视图展现和数据表现。
    4. Spring jdbc/Spring ORM :Spring 对jdbc做了一层封装,提供了JdbcTemplate作为模板类,Spring提供了许多对ORM工具的封装。
    5. 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。

    相关文章

      网友评论

        本文标题:Spring相关问题

        本文链接:https://www.haomeiwen.com/subject/akeldxtx.html