Spring(二)__bean的装配

Bean的装配:

在spring容器内拼凑bean叫做装配。装 配bean的时候,需要告诉容器哪些bean 以及容器如何使用依赖注入将它们配合在一起。

上下文定义文件的根元素是<beans>.<beans>有多个<bean>子元素。每个<bean>元素定义了一个 bean如何被装配到spring容器中。

<beans>

  <bean id="foo" class="...Foo"/>

  <bean id="bar" class="...Bar"/>

</beans>

对bean的最基本的配置包括bean的ID和他的 全称类名(类的全路径)。 <bean id="foo" class="com.xidian.Foo"/> bean的id是foo。

bean的scope 的说明:

spring中的bean缺省情况下是单例模式。始终返回一个实 例。若想返回不同的实例的话需要定义成原型模式。

? 尽量使用 scope=”singleton” ,不要使用prototype,因为这样对我们的性能影响较大.

一、set方式给bean注入值

(1)注入依赖,引用其它bean

(2)内部bean

这种方式用的比较少。

(3)继承配置

public class Student

public class Gradate extends Student

在beans.xml文件中体现配置

<!-- 配置一个学生对象 -->

<bean id="student" class="com.hsp.inherit.Student">

<property name="name" value="顺平" />

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

</bean>

<!-- 配置Grdate对象 -->

<bean id="grdate" parent="student" class="com.hsp.inherit.Gradate">

<!-- 如果自己配置属性name,age,则会替换从父对象继承的数据  -->

<!-- <property name="name" value="小明"/> -->

<property name="degree" value="学士"/>

</bean>

特别注意:parent="student"属性应该是bean id名,而不是类名Student

1.配置bean的简单属性,基本数据类型和string

<bean id="foo" class="...Foo">

<property name="name">

<value>tom</value>

</property>

</bean>

2.给集合类型注入值

<!-- 给数组注入值 -->
<property name="empName">
    <list>
        <value>小明</value>
        <value>小明小明</value>
        <value>小明小明小明小明</value>
    </list>
</property>
<!-- 给list注入值 list 中可以有相当的对象 -->
<property name="empList">
    <list>
        <ref bean="emp2" />
        <ref bean="emp1"/>
        <ref bean="emp1"/>
    </list>
</property>
<!-- 给set注入值 set不能有相同的对象 -->
<property name="empsets">
    <set>
        <ref bean="emp1" />
        <ref bean="emp2"/>
        <ref bean="emp2"/>
    </set>
</property>
<!-- 给map注入值 map只有key不一样,就可以装配value -->
<property name="empMaps">
    <map>
        <entry key="11" value-ref="emp1" />
        <entry key="22" value-ref="emp2"/>
        <entry key="33" value-ref="emp1"/>
    </map>
</property>
<!-- 给属性集合配置 --><property name="pp">
    <props>
        <prop key="pp1">abcd</prop>
        <prop key="pp2">hello</prop>
    </props>
</property>
</bean>
<bean id="emp1" class="com.hsp.collection.Employee">
<property name="name" value="北京"/>
<property name="id" value="1"/>
</bean>
<bean id="emp2" class="com.hsp.collection.Employee">
<property name="name" value="天津"/>
<property name="id" value="2"/>
</bean>
</beans>

 二、构造函数注入

public Employee(String name, Integer age) {
this.name = name;
this.age = age;
}

<bean id="employee" class="com.hsp.constructor.Employee">
<!-- 通过构造函数来注入属性值 -->
<constructor-arg index="0" type="java.lang.String" value="大明" />
<constructor-arg index="1" type="java.lang.Integer" value="22" />
</bean>

注意:spring反射机制中不支持自动装箱和拆箱。类型一定要严格指定。

String、Integer这种包装类只能用 type="java.lang.Integer"不可以是 type="Integer"或其他。

将构造函数中age的类型改成int基本数据类型,只能 type="int"不能使用type="java.lang.Integer"

比较:

set注入的缺点是无法清晰表达哪些属性是必须的,哪些是可选的,构造注入的优势是通过构造强制依赖关系,不可能实例化不 完全的或无法使用的bean。

虽然如此,还是常用set注入的方法。

 三、自动装配属性值

强调:自动装配是在没有显示设置属性值的时候,根据匹配规则进行自动装配。如已经设置,则按显示设置。

<bean id="foo" class="com.xidian.Foo" autowire="autowire type">

1.byName寻找和属性名相同的bean,若找不到,则装不上。

   一定要将bean id和属性名设置一致

public class Master {

private String name;
private Dog dog;

<!-- 配置一个master对象 -->
<bean id="master" class="com.hsp.autowire.Master" autowire="byName">
<property name="name" value="xkj"/>
</bean>

<!-- 配置dog对象 -->
<bean id="dog"  class="com.hsp.autowire.Dog">
<property name="name" value="小黄"/>
<property name="age" value="3"/>

2.byType:寻找和属性类型相同的bean,找不到,装不上,找到多个抛异常。

public class Master {

private String name;
private Dog dog;

<!-- 配置一个master对象 -->
<bean id="master" class="com.hsp.autowire.Master" autowire="byType">
<property name="name" value="xkj"/>
</bean>

<!-- 配置dog对象 -->
<bean id="dog2"  class="com.hsp.autowire.Dog">
<property name="name" value="小黄"/>
<property name="age" value="3"/>
</bean>

3.constructor:查找和bean的构造参数一致的一个或 多个bean,若找不到或找到多个,抛异常。按照参数的类型装配

autowire="constructor"

public class Master {

private String name;
private Dog dog;
//构造函数注入dog
public Master(Dog dog) {
this.dog=dog;
}

4.autodetect

说明 :  autowire="autodetect"

3和2之间选一个方式。优先选择3,没有则选择2.

5.defualt

这个需要在<beans defualt-autorwire=“指定” />

当你在<beans >指定了 default-atuowrite后, 所有的bean的 默认的autowire就是 指定的装配方法;

如果没有在<beans defualt-autorwire=“指定” /> 没有  defualt-autorwire=“指定” ,则默认是defualt-autorwire=”no”

<bean autorwire=”default”>则根据defualt-autorwire指定。

6. no: 不自动装配

讨论:自动装配能不用就不用,相对set方式,不够清晰明确,太绕。除非有特殊要求。

 四、从属性文件中读取信息

如果不同的bean需要读取相同的信息,可以使用分散配置。使用占位符变量代替bean装配文件中的硬编码配置。

beans.xml
说明: 当通过 context:property-placeholder 引入 属性文件的时候,有多个需要使用 , 号间隔.
<!-- 引入我们的db.properties文件 -->
<context:property-placeholder location="classpath:com/hsp/dispatch/db.properties,classpath:com/hsp/dispatch/db2.properties"/>-

<!-- 配置一DBUtil对象 $占位符号 -->
<bean id="dbutil" class="com.hsp.dispatch.DBUtil">
<property name="name" value="${name}" />
<property name="drivername" value="${drivername}" />
<property name="url" value="${url}" />
<property name="pwd" value="${pwd}" />
</bean>

<!-- 配置一DBUtil对象 -->
<bean id="dbutil2" class="com.hsp.dispatch.DBUtil">
<property name="name" value="${db2.name}" />
<property name="drivername" value="${db2.drivername}" />
<property name="url" value="${db2.url}" />
<property name="pwd" value="${db2.pwd}" />
</bean>
db.properties:
name=scott
drivername=oracle:jdbc:driver:OracleDirver
url=jdbc:oracle:thin:@127.0.0.1:1521:hsp
pwd=tiger
时间: 2024-07-29 13:05:09

Spring(二)__bean的装配的相关文章

Spring(六)之自动装配

一.自动装配模型 下面是自动连接模式,可以用来指示Spring容器使用自动连接进行依赖注入.您可以使用元素的autowire属性为bean定义指定autowire模式. 可以使用 byType 或者 constructor 自动装配模式来连接数组和其他类型的集合. 自动装配的局限性 当自动装配始终在同一个项目中使用时,它的效果最好.如果通常不使用自动装配,它可能会使开发人员混淆的使用它来连接只有一个或两个 bean 定义.不过,自动装配可以显著减少需要指定的属性或构造器参数,但你应该在使用它们之

Spring实战3:装配bean的进阶知识

主要内容: Environments and profiles Conditional bean declaration 处理自动装配的歧义 bean的作用域 The Spring Expression Language 在装配bean—依赖注入的本质一文中,我们探讨了Spring的三种管理bean的方式:自动装配.基于JavaConfig.基于XML文件.这篇文字将探讨一些Spring中关于bean的管理的高级知识,这些技能你可能不会每天都用,但是非常重要. 3.1 Environments

Spring 实战-第二章-装配Bean

Bean是Spring对象的声明(装配wiring),要使用Spring,必须先装配需要使用的对象,有3种装配的方式 自动化装配Bean 通过Java代码装配 通过XML装配 自动化装配Bean 自动化装配Bean很简单 1.声明接口 package soundsystem; public interface CompactDisc { void play(); } 2.添加注解 package soundsystem; import org.springframework.stereotype

Spring IOC容器-自动装配

1 autowire="byName" 根据名称自动装配,自动去IOC容器中找与属性名同名的引用的对象,并自动注入. <!-- ###############自动装配############### --> <bean id="userDao" class="d_auto.UserDao"></bean> <bean id="userService" class="d_auto

Spring 源码(九)@Autowired注解实现原理(Spring Bean的自动装配

@Autowired注解的实现过程,其实就是Spring Bean的自动装配过程.通过看@Autowired源码注释部分我们可以看到@Autowired的实现是通过AutowiredAnnotationBeanPostProcessor后置处理器中实现的. AutowiredAnnotationBeanPostProcessor 类图 PriorityOrdered:确认 AutowiredAnnotationBeanPostProcessor 后置处理器的执行优先级 BeanFactoryAw

Spring 源码(九)@Autowired注解实现原理(Spring Bean的自动装配)

@Autowired注解的实现过程,其实就是Spring Bean的自动装配过程.通过看@Autowired源码注释部分我们可以看到@Autowired的实现是通过AutowiredAnnotationBeanPostProcessor后置处理器中实现的. AutowiredAnnotationBeanPostProcessor 类图 PriorityOrdered:确认 AutowiredAnnotationBeanPostProcessor 后置处理器的执行优先级BeanFactoryAwa

Spring(二)scope、集合注入、自动装配、生命周期

原文链接:http://www.orlion.ga/189/ 一.scope bean的scope属性中常用的有两种:singleton(单例,默认)和prototype(原型,每次创建新对象) 例:beans.xml <bean id="userService" class="ml.orlion.service.UserService" scope="prototype">     <property name="u

Spring入门(二):自动化装配bean

Spring从两个角度来实现自动化装配: 组件扫描(component scanning):Spring会自动发现应用上下文中需要创建的bean. 自动装配(autowiring):Spring会自动满足bean之间的依赖. 为了更形象的解释组件扫描与自动装配,我们举一个音响系统的例子,主要包含以下内容: CD接口 CD接口的一个实现类 CD播放器 关于CD和CD播放器关系的解释: 如果你不将CD插入(注入)到CD播放器中,那么CD播放器其实是没有太大用处的.所以,可以这样说, CD播放器依赖于

Spring框架之自动装配

Spring的IoC容器通过Java反射机制了解了容器中所存在Bean的配置信息,这包括构造方法的结构,属性的信息,而正是由于这个原因,Spring容器才能通过某种规则来对Bean进行自动装配,而无须通过显式的方法进行配置. 一.自动装配类型:Spring IoC容器可以自动装配相互协作Bean之间的关联关系.因此,可以自动使Spring通过检查BeanFactory中的内容,来指定Bean协作(其它被依赖的Bean),,下面来介绍这4种类型: 1.byName类型:根据属性名自动装配.此类型将