Spring基本用法<一>:从Spring起源,bean的创建到IoC/依赖注入

来源:互联网 发布:网络社交的利与弊英语 编辑:程序博客网 时间:2024/05/16 12:42

Spring基本用法<一>:从起源到bean的创建

基本情况

Spring为企业应用开发提供了一个轻量级的解决方案。该解决方案包括:基于依赖注入的核心机制(IoC 控制反转),基于AOP的声明事务管理,与多种持久层耦合,优秀的前端MVC框架.

Spring框架的组成结构图:

Core Container部分是Spring的核心机制,为必不可少的。其他部分包括:JDBC,ORM,WEB,STRUTS都是可选的。从这也不难看出Spring是一个既可以提供一站式解决方案的框架,也是一个可以选择使用其中部分功能的框架,它保证了良好的模块化。

IoC 依赖注入

类间方法的互相调用有一个明显的历史演变过程。

直接在调用方中新建被调用对象,来获取方法—->调用者找到被调用者的工厂,依赖抽象的工厂接口来获得对象和方法—->调用者不再主动创建被调用的对象,而被是被动的接受Spring框架将需要的对象注入到调用者中

Spring框架将调用者获取被依赖对象的方式,由主动获取变为被动接受,这就是IoC 控制反转

从Spring的角度看,Spring负责将被依赖对象的实例赋值到调用者中,相当于为调用者注入它需要的实例,所以这种方式被称为依赖注入。

设值注入

通过在调用者中创建一个setter方法,用来传入被调用者的实例

bean语法

构造注入

通过在调用者的构造函数中传入被调用者的实例

bean语法

两种注入方式的比较:设值注入更容易理解,而且不会因为传入实例过多而使得函数臃肿,甚至导致性能下降;
构造注入可以决定依赖关系的注入顺序,无需担心对后面代码的破坏。建议采用设置为主构造为辅的策略。

使用Spring 容器

Spring的两个核心接口BeanFactory 和 ApplicationContext都可以创建容器并管理bean,但是大部分时候都不会把BeanFactory作为容器,原因是后者除了提供前者全部的功能外,还额外提供:

1.默认预初始化所有的singletion bean,当然也可以取消

2.它继承了MessagerSource接口,提供国际化支持

3.资源访问机制,比如URL和文件

4.事件机制:按照观察者模式设计,通过实现ApplicationEvent和ApplicationListener接口实现事件处理

5.同时加载多个配置文件

6.以声明式的方式启动被创建Spring容器

为了让bean获取Spring容器,可以让bean实现setBeanFactory接口

Spring容器中的bean

对于开发者来说,使用Spring框架主要干两件事。1.开发bean 2.配置bean

beans

理解beans根元素下不同属性的功能,包括:
default-lazy-init 延迟初始化,
default-merge 指定所有bean的默认行为 ,
default-autowire指定根元素下所有bean默认的装配行为,
default-autowire-candidates指定该元素配置下的所有bean默认是否作为自动转配的候选bean
default-init-method 指定所有bean的初始化方法
default-destory-method 指定所有bean的回收方法

bean

id:确定该bean在容器中的唯一标识

class:该类的完整限定名

name:指定名称/alias指定别名

bean的作用域

Spring支持:singleton prototype request seesion global session五个作用域,默认为singleton,即每个类在同一个容器中只创建一个实例,prototype指定每次都会创建一个新的实例,其他作用域依据名称可以判断

配置依赖

Spring允许通过如下元素为setter方法,构造器指定参数

value ref map props/list/set/map分别代表了bean类的四种成员变量,注入参数值根据各种类型的不同而有不同bean配置模式。

设置普通属性值

注入普通属性值,包括所有的基本类型和包装类

<bean id="id" class="...">    <property name="类成员变量名" value=“希望注入的值x”/>    <property name="类成员变量名" value=“希望注入的值x”/></bean>

设置其他实例属性值

注入的属性值是容器中另外一个bean实例

<bean id="steelshit" class="bulabula"/><bean id="id" class="...">    <property name="被调用类成员的实例名" ref=“steelshit”/></bean>

使用自动装配注入合作者bean

自动装配可以直观的理解为:一种持有特定筛选对象和筛选函数的全容器bean实例遍历方法。主要的筛选方法有

  1. no,不进行筛选,即不使用自动装配,所有的依赖注入都通过ref标明
  2. byName,根据setter方法进行自动装配。去掉setter方法的“set”后作为筛选exp,去匹配容器中的其他bean
  3. byType,跟你讲setter的形参类型自动装配。如果有多个相同类型的bean实例,则抛出异常。如果未检测到相同类型的bean实例,则不进行注入
  4. contrutor,与byType类似。区别是contrutor应用于构造器函数的参数匹配
  5. autodetecet,Spring根据bean的内部结构自行决定使用byType或者constructor

注入嵌套bean

如果某个bean依赖的bean不想被Spring容器所访问(可能是有bean),可以把这个bean隐藏在property中

<bean id="id" class="...">    <property name="被调用类成员的实例名">        <bean class="">    </property></bean>

注入集合值

list set map 和 property都有自己的对应的bean语法

list

<bean id="id" class="...">    <property name="list/set">        <list/set>            <value>小学</value>            <value>中学</value>            <value>大学学</value>        </list/set>    </property></bean>

property

<bean id="id" class="...">    <property name="somthing">        <props>            <props key="王者荣耀">小学</props>            <props key="穿越火线">中学</props>            <props key="风暴英雄">大学学</props>        </props>    </property></bean>

map

<bean id="id" class="...">    <property name="somethingaboutthismap">        <map>            <entry key="王者荣耀" value="小学"></props>            <entry key="穿越火线" value="中学"></props>            <entry key="风暴英雄" ref- value="大学学"></props>        </map>    </property></bean>

javabean和Springbean的区别

javabean主要作为DTO,永磊封装值对象,在各层之间实现数据传输(例如和持久层交互的dao)而Spring中的bean泛指所有位于Spring容器中的对象实例。javabean要求为所有的成员变量提供set和get方法,而Spring中的bean并不要求一定要为所有的成员变量提供set和get方法。

原创粉丝点击