栏目分类:
子分类:
返回
文库吧用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
文库吧 > IT > 软件开发 > 后端开发 > Java

Spring基础知识一

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring基础知识一

文章目录
  • 1、什么是Spring?有哪些特性?
  • 2、Spring框架的设计目标、设计理念和核心是什么?
  • 3、Spring的优缺点?
  • 4、Spring有哪些模块?
  • 5、Spring有哪些常用的注解?
  • 6、Spring中应用了哪些设计模式?
  • 7、什么是IoC?什么是DI?
  • 8、BeanFactory和ApplicationContext介绍?
  • 9、Spring的作用域和生命周期?
  • 10、Spring中的单例Bean会存在线程安全问题吗?
  • 11、什么是Spring的依赖注入?
  • 12、有哪些不同类型的依赖注入实现方式?
  • 13、什么是Bean的自动装配?


1、什么是Spring?有哪些特性?

Spring是一个开源的轻量级的J2EE应用程序框架,它解决了开发者在J2EE开发中遇到的许多常见的问题,提供了功能强大IOC、AOP及Web MVC等功能。

Spring最根本的使命是解决企业级应用开发的复杂性,即简化Java开发。

框架的特性:

  • 轻量:从大小和开销两方面而言Spring都是轻量的,完整的Spring框架可以在一个大小只有1MB的JAR文件里发布,并且其开销也是微不足道的,此外Spring是非侵入式的(侵入式指的是用户代码需要继承框架提供的类,非侵入式指的是用户代码不依赖于框架的代码信息)。
  • 控制反转(Inversion of Control,IoC):促进了对象与对象之间的低耦合,当应用了IoC时,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。IoC将创建对象的控制权转移到Spring容器中,容器根据配置文件去创建实例和管理各个实例之间的依赖关系。
  • 面向切面:Spring提供了面向切面的丰富支持,允许将纵向重复的代码(比如日志处理、事务支持等)横向抽取出来并封装为一个可重用的模块,这个模块就叫做“切面”。
  • 容器:Spring包含并管理应用对象的配置和生命周期,能够管理项目中的所有对象。
2、Spring框架的设计目标、设计理念和核心是什么?

Spring设计目标:为开发者提供一个一站式轻量级应用开发平台。
Spring设计理念:在JavaEE开发中,支持POJO(比JavaBEan更纯净的简单类或接口,严格地遵守简单对象地概念,而JavaBean中往往会封装一些简单逻辑)和JavaBean开发方式,使应用面向接口开发,充分支持面向对象设计方法;Spring通过IoC容器实现对象耦合关系的管理,并实现控制反转,将对象之间的依赖关系交给IoC容器,实现解耦。
Spring框架的核心:IoC容器和AOP模块,通过IoC容器管理POJO对象以及他们之间的耦合关系;通过AOP以动态非侵入的方式增强服务。IoC让相互协作的组件保持松散的耦合,而AOP编程允许你把遍布于应用各层的功能分离出来形成可重用的功能组件。

3、Spring的优缺点?

优点:

  • Spring是轻量级框架,可以自由选择使用哪几个Spring模块。
  • 对代码的侵入小,应用程序对Spring API的依赖比较少。
  • 通过控制反转与依赖注入,实现了对象之间的解耦。
  • 支持面向切面编程,将业务功能与额外功能分离,实现了高内聚。
  • 提供了Spring容器,统一管理对象的生命周期和配置信息。
  • 对主流的开源框架提供了很好的支持,简化开发过程,使开发人员能够更专注于业务逻辑的开发。

缺点:

  • 使用了大量的反射机制,比较占内存,并且效率不如直接调用高。
  • 配置比较复杂,但后来引入了注解配置,简化了配置过程。
  • Spring程序代码不直观,需要查看配置才能理解代码。
  • 调试阶段不容易定位到Bug问题所在。
4、Spring有哪些模块?

Spring框架有7个模块:

  • Spring Core:Spring的核心容器,它实现了IoC模式,提供了Spring框架的基础功能。此模块包含的BeanFactory类是Spring的核心类,负责JavaBean的配置与管理,采用工厂模式实现了依赖注入。
  • Spring Context:继承BeanFactory类,提供了Spring上下文环境,并且添加了事件处理、国际化(对于不同语言做出不同的响应)、资源装载、透明装载以及数据校验等功能。
  • Spring AOP:采用了面向切面编程的思想,使Spring框架管理的对象支持AOP,同时这个模块也提供了事务管理,可以不依赖于具体的EJB组件,就可以将事务管理集成到应用程序中;
  • Spring ORM:提供了对现有的ORM框架(ORM框架是连接数据库的桥梁,只要提供了持久化类与表的映射关系,ORM框架在运行时就能参照映射文件的信息,把对象持久化到数据库中)的支持,例如Hiberbate、mybatis等。
  • Spring DAO:提供了对DAO(Data Access Object,数据访问对象)模式和JDBC的支持。DAO模式思想是将业务逻辑代码与数据库交互代码分离,降低两者耦合。通过对JDBC的抽象,简化了开发工作,同时简化了对异常的处理。
  • Spring Web:提供了Servlet监听器的Context和Web应用的上下文,同时还集成了一些现有的Web框架,例如Struts等。
  • Spring Web MVC:提供了一个构建Web应用程序的MVC的实现。
5、Spring有哪些常用的注解?

Spring引入注解,通过“@xxx”的方式,让注解与Java Bean紧密结合,可以大大减少配置文件的体积,增加Java Bean的可读性与内聚性。
注解就是元数据,即一种描述数据的数据,用于对代码进行说明,可以对包、类、接口、字段、方法参数、局部变量等进行注解。

  • @Required:用于bean的setter方法上,表示此属性是必须的,必须在配置阶段注入,否则抛出BeanInitializationException。
  • @Autowired:用于bean的field、setter方法以及构造方法上,显示地声明依赖。
  • @Qualifier:此注解是和@Autowired一起使用,可以让我们对注入过程有更多地控制;可以用在单个构造器或者方法的参数上,当上下文有几个相同类型的bean时,使用@Autowired则无法区分要绑定的bean,此时则可以使用@Qualifier来指定名称。
  • @Configuration:此注解用在class上来定义bean,其作用和xml配置文件相同,表示此bean是一个Spring配置,此外,此类可以使用@Bean注解来初始化定义bean。
  • @ComponentScan:此注解一般和@Configuration注解一起使用,指定Spring扫描注解的package。
  • @Lazy:此注解使用在Spring的组件类上,默认Spring中的Bean依赖一开始就会被创建和配置,如果想要延迟初始化一个bean,那么可以在此类使用Lazy注解,表示此bean只有在第一次被使用的时候才会被创建和初始化;此注解也可以使用在被@Configuration注解的类上,表示其中所有被@Bean注解的方法都会延迟初始化。
  • @Value:此注解使用在字段、构造器参数和方法参数上,@Value可以指定属性取值的表达式,支持通过#{}使用SpringEL来取值,也支持使用${}来将属性来源(Properties文件、本地环境变量等)中的值注入到bean的属性中。
6、Spring中应用了哪些设计模式?
  • 简单工厂模式:Spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得bean对象。
  • 工厂方法模式:采用工厂方法模式,即应用程序将对象的创建及初始化职责交给工厂对象。如果应用程序自己的工厂对象交给Spring管理,那么Spring管理的就是工厂Bean。
  • 单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点,Spring提供了全局的访问点BeanFactory,并且Bean的作用域默认就是单例。
  • 适配器模式:在Spring的AOP中,使用Advice来增强被代理类的功能。Spring实现这一AOP功能的原理就是使用代理模式对类进行方法级别的切面增强,即生成被代理类的代理列,并在代理类的方法前,设置拦截器,通过执行拦截器中的内容增强了代理方法的功能,实现面向切面编程。
  • 装饰器模式:装饰器模式可以动态地给对象添加一些额外的属性或行为,相比于使用继承,装饰器模式更加灵活,Spring中根据每次不同的请求,动态的切换不同的数据源。Spring中含有Wrapper和含有Decorator的类都用到了装饰器模式。
  • 观察者模式:表示的是一种对象与对象之间具有依赖关系,当一个对象发生改变的时候,这个对象所依赖的对象也会做出反应,Spring事件驱动模型就是观察者模式中一个经典的应用。
  • 策略模式:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换,本模式使得算法可独立于使用它的客户而变化。Spring中在实例化对象的时候用到策略模式。
  • 模板方法模式:它是一种行为设计模式,定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤的实现方式。Spring中以Template结尾的类,比如jdbc Template等,都是使用了模板方法模式。
7、什么是IoC?什么是DI?

IoC,即Inversion of Control,控制反转。

IoC是一种思想,其中控制就是指控制对象的创建,本来创建对象的动作是由程序员在代码里指定,比如A依赖B对象,程序员需要写好如何创建B,这样才能创建出一个完整的A。
而反转后,这个创建对象的动作就由IoC容器触发,IoC容器在创建对象A的时候,发现依赖对象B,那么根据配置文件,它会创建B,并将对象B注入到A中。

DI,即Dependency Injection,依赖注入,是IoC的一种实现。
DI其实跟IoC的概念一致,只是从不同角度描述,可以理解为容器在运行的时候,可以找到被依赖的对象,然后将其注入,通过这样的方式,使得各对象之间的关系可由运行期间决定,而不用在编码时候明确。

Spring中的IoC实现原理就是工厂模式加反射机制。
8、BeanFactory和ApplicationContext介绍?

BeanFactory是Spring里面最底层的接口,提供了最简单的容器功能,而且只提供了实例化对象和拿对象的功能。

ApplicationContext是应用上下文,继承BeanFactory接口,它是Spring的一个更高级的容器,提供了更多的有用功能,包括国际化支持和框架事件体系等,更易于创建实际应用,因此开发直接用的是ApplicationContext而不是BeanFactory。

9、Spring的作用域和生命周期?

在Spring中,构成应用程序主干并由Spirng IoC容器管理的对象称为bean。
bean是一个由Spring IoC容器实例化、组装和管理的对象。

Spring的支持的bean作用域如下:

  • singleton:是Spring默认的作用域,在容器中只有一个实例。
  • prototype:每次从容器中调用bean时,都返回一个新的实例。
  • request:每个请求都会新建一个属于自己的bean实例,这种作用域仅存在Spring web应用中。
  • session:一个http session中共享一个bean实例,这种作用域仅存在Spring web应用中。
  • application:整个ServletContext生命周期里,只有一个bean,这种作用域仅存在Spring web应用中。
  • websocket:一个WebSocket生命周期内只有一个bean实例,这种作用域仅存在Spring web应用中。

Spring中的Bean的生命周期可以表示为:Bean定义->Bean的初始化->Bean的使用->Bean的销毁。

整个执行过程描述如下:
1、Spring启动,查找并加载需要被Spring管理的Bean,并实例化Bean。
2、利用依赖注入完成Bean中所有属性值的配置注入。
3、如果 Bean 实现了 BeanNameAware 接口,则 Spring 调用 Bean 的 setBeanName() 方法传入当前 Bean 的 id 值。
4、如果 Bean 实现了 BeanFactoryAware 接口,则 Spring 调用 setBeanFactory() 方法传入当前工厂实例的引用。
5、如果 Bean 实现了 ApplicationContextAware 接口,则 Spring 调用 setApplicationContext() 方法传入当前 ApplicationContext 实例的引用。
6、如果Bean实现了BeanPostProcessor接口(定义了回调方法,可以实现该方法来提供自己的实例化逻辑,依赖解析逻辑等),则Spring调用该接口的预初始化方法postProcessBeforeInitialization()对Bean进行加工操作,Spring中的AOP就是利用它实现的。
7、如果在Bean中实现了InitializingBean接口,则Spring将调用afterPropertiesSet()方法。
8、如果在配置文件中通过init-method属性指定了初始化方法,则调用该初始化方法。
9、如果BeanPostProcessor和Bean关联,则Spring将调用该接口的初始化方法,此时,Bean已经可以被应用系统使用了。
10、如果指定了该 Bean 的作用域为 singleton,则将该 Bean 放入 Spring IoC 的缓存池中,触发 Spring 对该 Bean 的生命周期管理;如果在 中指定了该 Bean 的作用域为 prototype,则将该 Bean 交给调用者,调用者管理该 Bean 的生命周期,Spring 不再管理该 Bean。
11、如果 Bean 实现了 DisposableBean 接口,则 Spring 会调用 destory() 方法销毁 Bean;如果在配置文件中通过 destory-method 属性指定了 Bean 的销毁方法,则 Spring 将调用该方法对 Bean 进行销毁。

10、Spring中的单例Bean会存在线程安全问题吗?

Spring中默认的bean作用域是singleton,没有进行封装处理,所以不是线程安全的。
但是共享不一定会有线程安全问题。
如果某个bean中定义了可以修改的共享数据(bean是有状态的),那么就会产生线程安全问题,需要我们自己来进行线程安全的保证。最简单的方法是将bean从单例设置成原型,也可使用ThreadLocal把变量编程线程私有的,或者使用synchronized、lock、CAS保证互斥访问临界区。

11、什么是Spring的依赖注入?

依赖注入是指程序运行过程中,如果需要创建一个对象,无须在代码中new创建,而是依赖外部的注入。我们不用在代码里创建对象,而只需要在配置文件里描述它如何被创建和组装。

依赖注入是Spring协调不同Bean实例之间的合作而提供的一种工作机制,在确保Bean实例之间合作的同时,并能保持每个Bean的相对独立性。
依赖注入的好处就是尽可能降低Bean之间的代码耦合,提高Bean重用的可能性,降低程序代码的维护难度。

12、有哪些不同类型的依赖注入实现方式?
  • 基于构造函数的依赖注入:通过Bean类的构造方法,将Bean所依赖的对象注入。构造函数的参数一般情况下就是依赖项。
  • 基于设置函数的依赖注入:将Bean所依赖的对象通过设置函数setXXX()注入,Bean需要为注入的依赖对象提供设置方法。
  • 基于注解的依赖注入:可以使用@Autowired注解对Bean类成员变量、方法及构造函数进行标注,完成依赖注入的自动装配工作;由于@Autowired是按照类型type匹配的,如果需要按名称name匹配,可以使用@Qualifier和@Autowired结合。
13、什么是Bean的自动装配?

Bean对象初始化时,IoC容器自动给Bean找到它所依赖的Bean,就是自动装配。
Spring自动装配可以分为两类:

  • 基于xml文件的自动装配:byType(容器会基于反射找到依赖类型相同的bean进行注入,这个注入需要setter方法来完成,因此必须存在setter方法),byName(容器会找到对应名称的bean注入),根据构造函数(容器会找到类型和构造函数中相匹配的bean注入)。
  • 基于注解的自动装配:使用@Autowired、@Resource、@Value。

自动装配的局限性: 不能自动装配简单的属性,如基本数据类型、String字符串和类;模糊特性,不如显示装配精。

参考
Spring

转载请注明:文章转载自 www.wk8.com.cn
本文地址:https://www.wk8.com.cn/it/1036658.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 wk8.com.cn

ICP备案号:晋ICP备2021003244-6号