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显示的指定依赖时,则显示指定会覆盖自动装配的。对应大型应用不鼓励使用自动装配,应显示的指定依赖关系。
总结
spring是一个框架,帮忙作何最通用和繁琐的事情,通过spring提高我们的编码效率,思维方式,利用spring将bean管理的更好,依赖关系更清晰,可扩展性更强。第一次文章,感觉能写出来真的不容,写出来和知道完全是两种感觉,希望能坚持。望各位大佬不吝指点。