JAVA面试题IV —— Spring原理

          它是一个全面的,企业应用开发一站式的解决方案,贯穿表现层、业务层,持久层;它可以和其他的框架进行无缝整合。

           1.1.1 Spring特点

                 1. 轻量级,控制反转,面向切面,容器,框架集合等。

                     1)轻量:从大小与开销两个方面而言Spring都是轻量级的。完整的Spring框架可以在一个大小只有1M多的JAR文件里发布,并且Spring所属的处理开销也是微不足道的。

                     2)控制反转:Spring通过一种称为控制反转IOC容器的技术促进了低耦合;当应用了IOC,一个对象依赖的其他对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。

                     3)面向切面:Spring支持面向切面的编程,并且把应用业务逻辑和系统服务分开来。

                     4)容器:Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个bean如何被创建---基于一个可配置原型,你的bean可以创建一个单独的实例或者每次需要时都生成一个新的实例----以及他们是如何相互关联的。

                    5)框架:Spring可以简单的组件配置,组合成为复杂的应用;在Spring中,应用对象被声明式的组合,典型的是在一个XML文件里;Spring也提供了很多基础功能,如事务管理,持久化框架集成等,将应用逻辑的开发留给开发者。

              1.1.2 Spring核心组件

d27a0239cce34dc3a9ae8734f9d2b09e.png

            1.1.3 Spring 常用模块 

                  1. 常用模块

                      1)核心容器:核心容器提供Spring框架的基本功能,核心容器的主要组件是BeanFactory,它是工厂模式的实现。BeanFactory使用控制反转模式将应用程序的配置和依赖规范与实际的应用程序代码分开。

                      2)Spring上下文:它是一个配置文件,向Spring框架提供上下文信息,Spring上下文包含企业服务,例如JNDI,EJB,电子邮件等功能。

                      3)Spring AOP:通过配置管理特性,SpringAOP模块直接将面向切面的编程功能集成到了Spring框架中,可以将一些通用任务,如安全,事务,日志等集中进行管理,提高了复用性和管理的便捷性。

                      4)Spring DAO为了JDBC DAO抽象层提供了有意义的异常层次结构。可用该结构来管理异常处理和不同数据库供用抛出的错误信息。异常层次结构简化了错误处理,并且极大的降低了需要编写的异常代码数量。

                      5)Spring ORM:Spring框架插入了若干个ORM框架,从而提供了ORM的对象关系工具,其中包括JDO,ibatis SQL Map,所有这些都遵从Spring的通用事务和DAO异常层次结构。

                      6)Spring Web模块:Web上下文模块建立在应用程序上下文模块之上,为了基于Web的应用程序提供了上下文,所以Spring框架支持与structs的集成。Web模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。

                      7)Spring MVC框架:MVC框架是一个全功能的构建Web应用程序的MVC实现,通过策略接口,MVC框架变成为高度可配置的,MVC容纳了大量视图技术,其中包括JSP,Velocity,iText和POI。

               1.1.4 Spring 常用注解

                      bean注入和装配的方式有好多种,可以通过xml,get和set方法,构造函数或者注解等方式。简单易用的方式就是使用Spring注解,Spring提供了大量的注解方式。

                        1.1.4.1  常用注解:

                               1)@Controller :用于标注控制层组件;它用于标记在一个类上,使用它标记的类就是一个SpringMvc controller对象;分发处理器将会扫描使用了该注解的类的方法,并检测该方法是否使用了@RequestMapping注解;可以把request请求header部分的值绑定到该方法的参数上。

                               2)@RestController:相当于@Controller和@requestBody的组合效果。

                               3)@Component:泛指组件,当组件不好归类的时候,可以使用这个注解进行标注。

                               4)@Repository:用于注解Dao层,在daoImpl类上使用。

                               5)@Service:用于标注业务层组件类。

                               6)@ResponseBody:异步请求;该注解用于将Controller的方法返回的对象,通过适当httpMessageConverter转换为指定格式后写入到Response对象的body数据区中;

返回的数据不是html标签页面,而是其他某种数据(json,xml)时使用。

                               7)@RequestMapping:一个用来处理请求地址映射的注解,可用于类或方法上,用于类上表示类中的所有响应请求的方法都是以该地址作为父路径。

                               8)@Autowire:它可以对类成员变量、方法及构造函数进行标注,完成自动装配工作,通过@Autowire的使用来消除set、get方法。

                               9)@PathVarlable:用于将请求URL中的模板变量映射到功能处理方法的参数上,即取出URL模板中的变量作为参数。

                              10)@requestParam:主要用于在springMvc后台控制层获取参数,类似:request.getparam("name").

                               11) @requestHeader:可以把request请求header部分的值绑定到方法的参数上。

                               12)@ModelAttribute:该controller的所有方法在调用前,先执行@ModelAttribute方法,可用于注解和方法参数中,可以把这个@ModelAttribute特性应用在BaseController当中,所有的controller继承BaseController,即可实现在调用controller时,先执行@ModelAttribute方法。

                                13)@Valid:实体数据校验,可以结合hibernate validator一起使用。

                1.1.5  Spring IOC原理:

                        1.1.5.1 概念:                

                               Spring通过一个配置文件描述Bean及Bean之间的依赖关系,利用Java语言的反射功能实例化Bean并建立Bean之间的依赖关系。Spring的IOC容器在完成这些底层工作的基础上,还提供了Bean实例缓存、生命周期管理、Bean实例代理、事件发布、资源装载等高级服务。

                         1.1.5.2  Spring容器高层视图:

                                1)Spring容器高层视图是指Spring框架中的ApplicationContext,它是BeanFactory的子接口,提供了更多的功能和特性。ApplicationContext是Spring框架的核心,它负责管理Bean的生命周期,包括Bean的创建、初始化、销毁等。除此之外,ApplicationContext还提供了AOP、事务管理、国际化、资源加载等高级服务。相比于BeanFactory,ApplicationContext更加强大和灵活,是Spring应用开发中的重要组成部分

                                2)Spring 启动时读取应用程序提供的 Bean 配置信息,并在 Spring 容器中生成一份相应的 Bean 配
置注册表,然后根据这张注册表实例化 Bean,装配好 Bean 之间的依赖关系,为上层应用提供准
备就绪的运行环境。其中 Bean 缓存池为 HashMap 实现


 

              1.1.5.3  IOC容器实现:

                    BeanFactory是Spring框架最为核心的接口,它提供了高级IoC的配置机制。BeanFactory使管理不同类型的Java对象成为可能。BeanFactory是一个类工厂,但和传统的类工厂不同的是,传统的类工厂只负责构造一个或几个类的实例。而BeanFactory是类的通用工厂,它可以创建并管理各种类的对象。Spring称这些被创建和管理的Java对象为Bean。JavaBean是要满足一定的规范的,如必须提供一个默认不带参的构造函数、不依赖于某一特定的容器等,但Spring中所说的Bean比JavaBean更宽泛一些,所有可以被Spring容器实例化的Java类都可以成为Bean。BeanFactory的类体系结构如引用所示。而ApplicationContext建立在BeanFactory的基础之上,提供了更多面向应用的功能。几乎所有的应用场景我们都直接使用ApplicationContext而非底层的BeanFactory。

          1.1.5.3.1  BeanDefinitionRegistry 注册表 

              Spring配置文件中每一个节点元素在Spring容器里都通过一个BeanDefinition对象表示,它描述了Bean的配置信息。而BeanDefinitionRegistry接口提供了向容器手工注册BeanDefinition对象的方法。

          1.1.5.3.2  BeanFactory 顶层接口

               位于类结构树的顶端,它最主要的方法就是getBean(),该方法容器中返回特定名称的Bean,BeanFactory得功能通过其他的接口得到不断扩展。

          1.1.5.3.3  ListableBeanFactory

              该接口定义了访问容器中Bean基本信息的若干方法,如查看Bean的个数、获取某一类型Bean的配置名、查看容器中是否包括某一Bean等方法。

          1.1.5.3.4  HierarchicalBeanFactory  父子级联

               父子级联IOC容器的接口,子容器可以通过接口方法访问父容器;通过HierarchicalBeanFactory接口,Spring的IOC容器可以建立父子层级关联的容器体系,子容器可以访问父容器中的bean,但父容器不能访问子容器的bean。Spring使用父子容器实现了很多功能,比如在SpringMvc中,展现层Bean就可以引用业务层和持久层的bean,而业务层和持久层的bean的则看不到展现层的bean。

           1.1.5.3.5 ConfigurableBeanFactory

                 它是一个重要的接口,增强了Ioc容器的可定制性,它定义了设置类装载器、属性编辑器、容器初始化后置处理器等方法;

            1.1.5.3.6 AutowireCapableBeanFactory 自动装配

                  定义了将容器中的bean按某种规则进行自动装配的方法。

            1.1.5.3.7 SingleBeanregistry 运行期间注册单实例Bean的方法;

                  对于单实例的Bean来说,BeanFactory会缓存Bean实例,所以第二次使用getBean方法获取Bean时将直接从Ioc容器的缓存中获取Bean实例。Spring在DefauSingletonBeanRegistry类中提供一个用于缓存单实例Bean的缓存器,它是一个用HashMap实现的缓存器,单实例的Bean以beanName为键保存在这个Hashmap中。

             1.1.5.3.8  依赖日志框架

                   在初始化BeanFactory时,必须为其提供一种日志框架,比如使用Log4j,即在类路径下提供Log4j配置文件,这样在启动Spring容器才不会报错。

       1.1.5.4 Spring Bean 作用域                             

             Spring3中为Bean定义了5种作用域,分别为singleton(单例)、prototype(原型)、request、session和global session;

           1.1.5.4.1 singleton 单例模式

                Spring Ioc容器中只会存在一个共享的Bean实例,无论有多少个Bean引用它,始终指向同一对象。该模式在多线程下是不安全的。Singleton作用域是Spring中的缺省作用域,也可以显示的将Bean定义为singleton模式,配置为:<bean id ='userDao' class="类的路径” scope = “singleton”/>

            1.1.5.4.2 prototype 原型模式每次使用时创建

                  每次通过Spring容器获取prototype定义的bean时,容器都将创建一个新的Bean实例,每个Bean都有自己的属性和状态,而singleton全局只有一个对象。根据经验,对有状态的bean使用prototype作用域,而对无状态的bean使用singleton作用域。

            1.1.5.4.3 Request 一次request一次实例

                  在一次Http请求中,容器会返回该Bean的同一实例。而不同的Http请求则会产生新的Bean,而且该bean仅在当前的Http request内有效,当前Http请求结束,该bean实例也将会被销毁。

            1.1.5.4.4  session

                 在一次Http Session中,容器会返回该Bean的同一实例。而对不同的Session请求则会创建新的实例,该bean实例仅在当前Session内有效。同Http请求相同,每一次session请求创建新的实例,而不同的实例之间不共享属性,且实例仅在自己的session请求内有效,请求结束,该实例将会被销毁。

             1.1.5.4.5 global Session

                  在一个全局的http Session中,容器会返回该Bean的同一实例,仅在使用portlet context时有效;

       1.1.5.5 Spring Bean 生命周期

              Spring Bean 生命周期指的是在 Spring 容器中,一个 Bean 从创建到销毁的整个过程。这个过程可以分为以下几个阶段: 

  1. 实例化 Bean:Spring 容器根据配置文件或注解等方式创建 Bean 的实例。
  2. 设置对象属性:Spring 容器将配置文件或注解中的属性值或引用注入到 Bean 实例中。
  3. 调用 Bean 的初始化方法:如果 Bean 实现了 InitializingBean 接口或在配置文件中通过 init-method 指定了初始化方法,则 Spring 容器会在 Bean 实例化后调用该方法。
  4. Bean 可以使用了:Bean 实例化完成后,就可以使用了,它们会一直驻留在应用程序的上下文中,直到应用程序上下文被销毁。
  5. 当容器关闭时,Spring 容器会销毁 Bean 实例。在销毁之前,Spring 容器会调用 Bean 的销毁方法:如果 Bean 实现了 DisposableBean 接口或在配置文件中通过 destroy-method 指定了销毁方法,则 Spring 容器会在销毁 Bean 之前调用该方法。

   1.1.5.6  Spring 依赖注入的四种方式

       1.1.5.6.1 构造器注入:

           构造器注入是一种依赖注入的方式,它通过在类的构造函数中传入依赖对象来实现依赖注入。

           1.1.5.6.1.1 优点:

              1)可以保证依赖对象的完整性,即只有在所有依赖对象都被注入后,才会创建该类的实例。

              2)可以避免循环依赖的问题,因为构造器注入是一种显式的依赖注入方式,可以通过控制依赖对象的创建顺序来避免循环依赖。

              3)可以使类的依赖关系更加清晰明了,因为依赖对象都是通过构造函数传入的,不会出现隐式的依赖关系

           1.1.5.6.1.2 构造器注入实例:

              public class UserServiceImpl implements UserService {
                   private UserDao userDao;

                   public UserServiceImpl(UserDao userDao) {
                       this.userDao = userDao;
                    }

                        / / ...
               }

     1.1.5.6.2 setter方法注入:

         setter注入是指将一个类的依赖通过设置一个公共的setter方法注入到该类中,这样就能够让该类使用这个依赖。setter方法通常在类中定义为public,并且以set开头,接着是一个单词,表示注入的属性的名称。

       1.1.5.6.3 静态工厂注入:

          静态工厂顾名思义,就是通过调用静态工厂的方法获取自己需要的对象,为了让Spring管理所有对象,我们不能直接通过工程类.静态方()来获取对象,而是依然通过spring注入的形式获取:

 1.1.5.7   Spring Aop 原理

     1.1.5.7.1 概念:

        “横切”的技术,剖解开封装的对象内部,并将哪些影响了多个类的公共行为封装到一个可重用模块,并将其命名为Aspect,即切面。就是将哪些与业务无关,却为业务模块所公同调用的逻辑或者责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。

        Aop 主要应用场景有:Authentication 权限认证,Caching 缓存,Context passing 内容传递,Lazy loading 懒加载,logging,tracing 日志记录跟踪,Transactions 事物

    1.1.5.7.2 AOP核心概念:

        1.切面(aspect): 类是对物体特征的抽象,切面就是对横切关注点的抽象

        2.横切关注点:对那些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点

        3. 连接点(joinpoint):被拦截到的点,因为Spring只支持方法类型的连接点,所以在Spring中连接点指的就是被拦截的方法,实际上连接点还可以是字段或者构造器。

        4.切入点(pointcut):对连接点进行拦截的定义

        5.通知(advice):所谓通知指的是拦截到连接点之后要执行的代码,通知分为前置、后置

、异常、最终、环绕通知五类。

        6.目标对象:代理的目标对象。

        7.织入(weave):将切面应用到目标对象并导致代理对象创建的过程。

        8.引入(introduction):在不修改代码的前提下,引入可以在运行期间为类动态地添加一些方法或字段。

参考:spring Aop

1.1.5.8 AOP 两种代理方式 

      Spring 提供了两种方式来生成代理对象:JDK代理和Cglib代理,具体使用那种方式生成由Aop代理工厂根据支持对象的配置来决定。默认的策略如果目标类是接口,则使用JDK动态代理技术,否则使用Cglib来生成代理。

     1.1.5.8.1 JDK动态接口代理:

        JDK动态代理主要设及到lang.reflect包中的两个类:Proxy和InvocationHandler。InvocationHandler是一个接口,通过实现该接口定义横切逻辑,并通过反射机制调用目标类的代码,动态将横切逻辑和业务逻辑编制在一起。Proxy利用InvocationHandler动态创建一个符合某一个接口的实例,生成目标类的代理对象。

     1.1.5.8.2 Cglib动态代理:

          1. 它是强大的、高性能的代码生成库,被广泛应用于AOP框架,它底层使用ASM来操作字节码生成新的类,为对象引入间接级别,以控制对象的访问。CGLIB相比于JDK动态代理更加强大,JDK动态代理只能对接口进行代理,而CGLIB既可以代理普通类,也能够代理接口。

         2.CGLIB 通过动态生成一个需要被代理类的子类(即被代理类作为父类),该子类重写被代理类的所有不是 final 修饰的方法,并在子类中采用方法拦截的技术拦截父类所有的方法调用,进而织入横切逻辑。此外,因为 CGLIB 采用整型变量建立了方法索引,这比使用 JDK 动态代理更快(使用 Java 反射技术创建代理类的实例)

1.2 Spring MVC 原理     

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值