Spring学习理解

spring学习理解

第一章 spring基础概念

前言

spring是什么?作用是什么?

一、spring是什么?

首先spring是一个从实际开发中抽象出来的一个框架,完成了大部分开发过程中通用的步骤,开发只需关注特定部分的内容的实现。由Rod Johnson开发的2004年发布了第一版。
刚才说的完成了大部开发过程中通用步骤,即spring的核心机制:
(1)管理bean对象:程序主要是通过spring容器来访问容器中的Bean对象;ApplicationContext是Spring容器最常用的接口,该接口有如下两个实现类:
ClassPathXmlApplicationContext: 从类加载路径下搜索配置文件,并根据配置文件来创建Spring容器。
FileSystemXmlApplicationContext: 从文件系统的相对路径或绝对路径下去搜索配置文件,并根据配置文件来创建Spring容器。
(2)spring的依赖注入或控制反转:
从对象创建角度:比如A对象想调用B对象的方法,不使用spring框架时,有两种形式:一种由调用者A对象主动创建B对象,并调用该对象的方法;另一种使用简单工厂模式,A对象先找到被依赖的B对象,然后主动通过工厂去获取被依赖的B对象。上面两种方式都是通过主动创建获取依赖对象,这样会导致依赖对象A与被依赖对象B实现类的硬编码耦合,对程序的扩展、升级维护非常不利。
而使用spring框架,调用者从之前的主动创建,变成了被动接受,由spring容器为调用者的成员变量赋值即可,所以称之为控制反转(Inverse of Control,IoC);
从spring容器角度:spring将被依赖对象赋给调用者的成员变量,相当于为依赖着注入它需要调用的实例,因此称之依赖注入(Dependency Injection);
依赖注入的方式用两种:setter方式、构造注入
总结:不管是控制反转,还是依赖注入,其含义完全相同,只是从不同角度看。都实现了对象之间依赖的关系由spring框架来完成,主要分为两部分内容:spring容器是一个超级大工厂,负责创建、管理所有java对象,这些对象被称为bean;spring容器通过“依赖注入”的方式,管理容器中bean之间的依赖关系。

二、spring的作用是什么?

主要作用:解决java对象间依赖使用的硬编码耦合、对象的创建管理、程序维护成本及升级困难问题;通过spring框架实现对所有java对象的创建和管理,通过依赖注入的方式对对象间的依赖关系实现管理。
spring如何实现的和解决这些问题?
1、spring的依赖注入和控制反转
spring的核心功能有两个:一个bean的大工厂,负责创建bean管理bean
另一个由spring容器管理bean之间的依赖关系,使用“依赖注入的方式”关系;
注入bean的两种方式:setter注入(显示注入,简单直观符合开发者的习惯)、构造器注入(可以决定依赖注入的优先顺序,对于依赖关系无需变化的bean可以使用构造器注入;依赖关系只能在构造器中设定,只有组件的创建者才能改变组件的依赖关系,对调用者来说组件的内部关系完全透明,这也符合高内聚的原则),一般两者结合使用。
2、spring中每一个对象都是一个bean;它的作用域有哪些?
对于我们开发者来说,主要是开发bean、配置bean;对于spring来说根据开发者的配置文件创建bean实例,并调用bean实例的方法完成“依赖注入”–这就是控制反转的本质。
容器中bean的作用域,通过spring容器不仅可以实例化bean,还可以指定bean的作用域。spring支持以下5中作用域:
(1)singleton:单例模式,在spring容器中只生成一个bean
(2)prototye:每次通过容器的getBean()方法时,都会新生成一个bean对象;
(3)request:对于一次http请求,request作用域的bean将只生成一个实例,同一次请求只有一个实例;只有在web应用中使用spring时,该作用域才有效。
(4)session:该作用域限制于http会话中, 只有在web-aware Spring ApplicationContext的上下文中有效。
(5)global session:每个全局的http session对应一个bean实例。在典型情况下,只用使用portlet context时才有效,同样只有在web应用才有效。
3、spring容器中创建bean的几种方式:
(1)使用构造器创建bean实例,最常用的一种方式,如果不采用构造器注入,spring底层会默认调用对象的无参构造器,因此要求bean类提供一个无参构造器。
(2)使用静态工厂方法创建bean实例,需指定class属性(工厂类的class)spring才能确定由那个工厂创建bean实例,指定静态工厂方法,spring调用工厂方法返回bean实例,获取到bean实例之后就与普通方式创建的bean实例完全一样。如果静态工厂需要参数,可以通过指定。
(3)调用实例工厂方法创建bean,与静态工厂方法唯一区别是静态工厂需要指定工厂类即可,而实例工厂需要先配置工厂bean,配置工厂方法使用factory-bean指定工厂实例。采用实例工厂方法创建bean,需要指定两个属性,factory-bean:该属性值为工厂bean的id;factory-method:该属性值为实例工厂的工厂方法,返回具体bean。
4、spring能自动装配bean与bean的依赖关系,无需显示的指定bean,spring会根据xml配置文件中的配置,按照某种规则,为调用者bean注入被依赖的bean。spring自动装配可通过元素的default-autowire属性指定,该属性对所有的bean起作用;也可通过的autowire属性指定该bean的 依赖bean.;
autowire和default-autowire可接受如下值:
no:不使用自动装配,必须显示指定ref;这也是默认配置,指定清晰明了
byName:根据setter 方法进行自动装配。spring容器查找容器中全部的bean,找出其id与setter方法去掉set前缀首字母小写的bean完成注入,如果没找到不处理。
byType:根据setter方法进行自动装配。spring容器查找容器中全部的bean,如果找到bean类型与setter方法的形参类型匹配,就自动注入,如果找到多个就抛异常,如果没找到不处理;
constructor:与byType类似,匹配构造器的参数,如果找到多个抛异常
autodetect:spring容器根据bean内部结构,自行决定使用constructor或byType策略。
当bean即使用了自动装配,又使用ref显示的指定依赖时,则显示指定会覆盖自动装配的。对应大型应用不鼓励使用自动装配,应显示的指定依赖关系。

5、协调作用域不同步的bean. 当singleton作用域的bean依赖于prototype的bean时,会产生不同步的现象,原因是当容器初始化时,容器会预先初始化容器中所有的singleton的bean,由于singleton的bean依赖于prototype的bean,因此spring容器在初始化singleton时先初始化prototype的bean,并注入其中。 解决不同步的方法有两种: (1)放弃依赖注入:当singleton作用域的bean需要作用域prototype的bean时,每次从容器中获取新的bean (2)利用方法注入:方法注入通常使用lookup方法注入,使用lookup方法注入可以让spring容器重写容器中bean的抽象或具体方法,返回查找其他bean的结果。spring通过使用jdk动态代理或cglib库修改客户端的二进制码,实现上述内容。主要分两步:第一步将调用者的bean实现类定义为抽象类,并定义一个抽象方法来获取依赖bean;在bean元素中添加lookup-method在元素让spring为调用者bean的实现类实现指定抽象方法; 注意:spring会采用运行时动态增强,如果目标抽象类实现过接口,默认使用jdk的动态代理,如果没有实现过接口,采用cglib库实现抽象类的动态代理。Spring4.0的spring-core-xxx.jar包中已经集成了cglib类库。

总结

spring是一个框架,帮忙作何最通用和繁琐的事情,通过spring提高我们的编码效率,思维方式,利用spring将bean管理的更好,依赖关系更清晰,可扩展性更强。第一次文章,感觉能写出来真的不容,写出来和知道完全是两种感觉,希望能坚持。望各位大佬不吝指点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

强1223

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值