Spring入门2. IoC中装配Bean

本文内容纲要:Spring入门2. IoC中装配Bean

Spring入门2. IoC中装配Bean 20131125

前言:

上一节学习了Spring在JavaProject中的配置,通过配置文件利用BeanFactory和ApplicationContext实现了IoC的功能。这一节进一步学习Ioc 中的Bean装配。在Spring容器中的Bean装配方式,配置文件的深入等等。

1.Spring配置文件的方式

DTD格式 和Schema格式,推荐使用Schema格式.

使用Schema格式的配置文件拥有自己的命名空间,文件格式如下:

<beans

xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:aop="http://www.springframework.org/schema/aop"

xmlns:tx="http://www.springframework.org/schema/tx"

xsi:schemaLocation="

http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-3.2.xsd

http://www.springframework.org/schema/aop

http://www.springframework.org/schema/aop/spring-aop-3.2.xsd

http://www.springframework.org/schema/tx

http://www.springframework.org/schema/tx/spring-tx-3.2.xsd"

default-lazy-init="true">

<bean id="customer" class = "com.yang.model.Customer">

<property name="userName" value="杨腾飞"/>

<property name="password" value="12345"/>

<property name="age" value = "21"/>

2.Bean基本配置

在Spring配置文件中配置一个bean的规范:

一般情况之下,SpringIoC容器中的一个Bean对应配置文件中的一个,其中id对应的是Bean的名称,可以通过容器的getBean(String name)便可以获得对应的Bean

3.依赖注入的方式

依赖注入(Dependency Injection,DJ)和反转控制(Inversion Of Control)是类似的概念。具体的含义就是:当某个Java实例需要另一个Java实例的时候,在传统的程序程序设计过程中,通常由调用者来创建被调用者的实例;但是在Spring中,这个创建的工作不在有调用者来完成,因此被称为反转控制;创建被调用者实例的工作实际上是Spring容器完成的,然后注入给调用者,因此被称为依赖注入。根据注入方式的不同,依赖注入有一下两种:

设值注入:通过setter的方法注入到Bean的属性值或者是对象中;在Spring中大量的使用这种方法,因为其比较直观、简单。设值注入的方式需要类提供一个默认的无参构造方法,并且需要为对应的属性提供对应的setter方法。同时使用关键字property设值属性的值:

构造注入:通过使用构造器来注入Bean属性值或者是依赖对象。这种方式可以确保一些必要的属性在Bean实例化的时候,就已经得到初始值,从而使Bean在实例话之后就可以直接使用。

构造注入的方式和设值注入的方式有所不同。我们通过一个实例来说明通过构造注入的方式:

首先是Model的修改,因为是构造注入,所以我们需要有一个和参数类型相匹配的构造函数,同时因为添加了构造函数,就会覆盖原来默认的构造函数,所以我们需要显式的声明默认构造函数:

public Customer(){

System.out.println("Customer() constructor");

}

public Customer(String name, String pwd, Integer age){

this.userName = name;

this.password = pwd;

this.age = age;

}

然后再bean中配置bean实例信息;

<bean id="customer2" class="com.yang.model.Customer">

<constructor-arg type="java.lang.String">

追梦的飞飞

<constructor-arg type="java.lang.String">

45678

<constructor-arg type="java.lang.Integer">

23

两种方式比较:

设值注入与传统的JavaBean写法相似,便于程序开发者理解,通过setter设值属性值比较直观;同时对于复杂的依赖关系,这种方式相比构造注入比较简洁。Spring在创建bean的时候,需要同时实例化其依赖的全部实例,导致性能下降,从而使用设值注入,可以避免这些问题;

构造注入可以在构造器中决定依赖关系的注入顺序,比如使用数据库的时候需要优先注入数据库连接;对于依赖关系无需变化的Bean,如果没有setter方法,所有依赖关系都是在构造函数中实现,后续代码不会对其产生影响,依赖关系仅仅在构造函数中,符合高内聚低耦合的规则。

随意推荐使用的是设置注入的方式,以构造注入的方式为辅,对于构造关系无需变化的注入尽量采用构造注入。

4.注入值得类型

直接的字面值,就是我们之前使用的string和int等类型

引用其他的bean值:SpringIoC 容器中定义的Bean是可以相互引用的,IoC容器负责装配

使用关键字ref

<bean id= beanId class="Package".ClassName>

或者可以简单的表示为

集合值:在bean中使用的是List set map等等集合值得时候,使用设值集合属性的值。

<bean id="empl" class="com.yang.model.Employee">

<property name="schools">

中山大学

河北衡水中学

阜城县长城双语学校

古城镇初级中学

<property name="equi">

<entry key="主机" value="联想"/>

<entry key="显示器" value="三星"/>

<property name="address">

<prop key="祖籍">河北衡水

<prop key="居住地">广东广州

<property name="work">

软件工程师

本科生

5.Bean之间的关系

Bean之间的关系有两种:继承和依赖

继承关系:如果存在多个Bean存在相同的配置信息,Spring允许顶一个而一个父Bean,然后为其定义子bean,将自动继承其配置信息。Spring通过bean元素的parent属性为其指定父类的Bean。

使用bean关键字的abstract表示该实例是抽象的,所以不能够在程序中实例化。

<bean id="abstractCustomer" class="com.yang.model.Customer" abstract="true">

<property name="userName" value="杨腾飞"/>

<property name="password" value="12345"/>

<property name="age" value = "21"/>

<bean id="customer3" parent="abstractCustomer">

<property name="age" value="23"/>

<bean id="customer4" parent="abstractCustomer">

<property name="age" value="24"/>

依赖关系:使用关键字ref建立bean之间的依赖关系,Spring负责管理这些bean之间的依赖关系,当实例化一个bean的时候,Spring保证高bean的所依赖的其他的bean已经初始化。如果不是直接的依赖关系的话,在bean中的属性depends-on可以指定前置依赖。

这样就会指定依赖关系,在构造sailorder2的时候首先会去构造前面的bean。

还可以使用标签

6.Bean作用域

指定bean的作用域,这样对于bean会产生一定的影响。Spring支持五种bean作用域:

**singleton:**在每一个Spring容器中,一个Bean定义对应唯一的对象实例,并且bean是以单例的方式存在。只要ID相匹配,每一个获得的都是相同的实例。并且spring只会创建一个该bean的实例,这一个单例会被存储到单例缓存中(singleton cache)中,并且所有针对该bean的访问请求,都返回的同一个缓存中的实例。

**prototype:**一个Bean定义对应多个实例对象,每一次调用getBean()就会创建一个新的Bean实例。容器负责跟踪bean实例的状态,维护bean的生命周期的行为。如果一旦一个Bean被设置成为prototype作用域,每一次请求Bean的id,就会生成一个新的bean实例。

当bean不指定作用域的时候,默认会使用singleton作用域。Java在创建实例的时候,需要申请内存,实例不在使用的时候,还可能进行垃圾回收,这些工作都会导致比较大的系统开销,因此使用prototype的代价是比较大的,而singleton则是对象的复用,所以尽量避免使用prototype作用域。

request**:**这是在HTTP请求中使用的,一个bean对应一个实例,级每一次HTTp请求都会生成各自的bean实例,作用域仅仅是在基于Web的Spring ApplicationContext下面有效。

session**:**作用域是在一个HTTP Session,一个bean对应一个实例,也是仅仅在Web的Spring的ApplicationContext下面有效。

global session:全局的HttpSession中有效,也是在Web的Spring 的ApplicationContext下面有效。

7.自动装配

SpringIoC容器提供相互协作的Bean自动装配机制,可以自动让Spring通过检查BeanFactory中的内容,来替开发人员指定Bean的依赖关系。由于autoware可以针对单个Bean进行设置,因此可以让有些bean使用autoware,有些不采用。Autoware的方便之处在于减少或者消除对属性或构造器的设置,简化配置文件。

在Spring配置文件中,autoware一共有五种类型,可以在bean元素中使用autoware属性设置

no:默认属性,表明不适用自动装配机制,必须使用显式的指出bean之间的依赖关系,这样可以是配置更加灵活和清晰,对于较大的部署配置,推荐使用这一种方式。

byName:根据属性名称自动装配,此选项将检查容器并且根据名字查找和属性完全一致的bean,将其自动装配。例如bean中使用了autoware为byName,而该bean包含master属性,同时提供了setter方法,Spring就会查找属性名称是master的bean定义,装配master属性;

byType:容器中存在一个和指定属性类型相同的bean,那么该属性会自动装配

constructor:应用于构造函数的参数,如果在容器中没有找到和构造函数参数一致的bean,会抛出异常;

autodetect:由框架本身决定使用哪一种方式。

YangTengfei

2013.11.25

本文内容总结:Spring入门2. IoC中装配Bean

原文链接:https://www.cnblogs.com/hbhzsysutengfei/p/3473166.html

以上是 Spring入门2. IoC中装配Bean 的全部内容, 来源链接: utcz.com/z/295925.html

回到顶部