Spring学习笔记--组合式基于XML配置metaData

 <beans>
    <import resource="services.xml"/>
    <import resource="resources/messageSource.xml"/>
    <import resource="/resources/themeSource.xml"/>
    <bean id="bean1" class="..."/>
    <bean id="bean2" class="..."/>
    <alias name="fromName" alias="toName"/>
 </beans>

它可与用于组合多个 XML 文件

配置形式如下:


其中 import的作用类似于javaimport作用,是用于导入资源的

 Alias 的作用是用于bean的别名

fromName表示在同一个容器中命名为fromNamebean,可以是上面配置中的bean1或者是bean2

toName表示fromName Bean的别名

 

Bean的配置

一个Spring IoC容器管理着一个或者多个bean, 你可以通过XML配置创建的Bean提供给容器如下表格式XML方式配置Bean的定义

 

 

 

Bean的命名

 

每个Bean有一个或多个的标示符这些标示符是唯一的基于XML配置的Bean, 可以通过id或者name属性来指定Bean的标示符的但是需要注意的是, id属性值在早些时候的版本是不可以包含特殊字符的(这里我采用的是Spring2.5.3版本来进行测试,发现这个版本id不支持特殊字符)

如果使用特殊的字符串会报如下类型的错误:

org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 10 in XML document from class path resource 

[com/wenj/resources/beans.xml] is invalid; nested exception is org.xml.sax.SAXParseException: cvc-datatype-valid.1.2.1: 

'hello;' is not a valid value for 'NCName'.

而最新版本(我现在学习的是Spring4.0.2.RELEASE)我测试的时候是没有这个错误的

我查了下文档,发现在早些时候的版本id的属性是定义为: xsd:ID类型的,而在之后的版本id的属性是定义为: xsd:string类型的所以这点在使用较早版本的Spring需要注意这一点

 

还有也可以不用Bean进行命名如果这样的话容器会自动的创建一个唯一的标识符给Bean

可以通过容器getBean(Class<T> requiredType)这个方法来获取

:

BeanType bt = cxt.getBean(BeanType.class);

 

但是如果你想通过名称来引用Bean, 也就是通过ref元素或者Service Locator来查找的话,那么必须给Bean命名, 如果真的不想用id或name属性的话, 那么可以采用内部Bean或者autowiring collaborators的方法

 

Bean的别名

 

可以通过之前示例的<alias />标签来实现

<alias name="fromName" alias="toName"/>

实例化Bean

以构造器来实例化一个Bean

1) 使用默认的空构造器来配置Bean

xml可以这样配置

<bean id=... class=....../>

2) 使用有参构造器来配置Bean

1:

package com.wenj.servicesimpl;
public class C {
    public C(A a, B b){
    //...
    }
}


 

xml中可以这样配置

 <bean id="a" class="com.wenj.servicesimpl.A"/>
    <bean id="b" class="com.wenj.servicesimpl.B"/>
    <bean id="c" class="com.wenj.servicesimpl.C">
    <constructor-arg ref="a"/>
    <constructor-arg ref="b"/>
</bean>


 

2: 

package com.wenj.servicesimpl;

public class C {
    private int age;
    private String name; 
    public C(int age, String name){
        this.age = age;
        this.name = name;
        System.out.println(age + ", " + name);
    }
}


 

xml中可以通过类型匹配来配置

<bean id="c2" class="com.wenj.servicesimpl.C">
    <constructor-arg type="int" value="110"/>
    <constructor-arg type="String" value="Name"/>
</bean>


 

也可以通过构造器的参数Index(0~开始)来配置

<bean id="c2" class="com.wenj.servicesimpl.C">
    <constructor-arg index="0" value="110"/>
    <constructor-arg index="1" value="Name"/>
</bean>

 

也可以通过构造器的参数名来配置

<bean id="c2" class="com.wenj.servicesimpl.C">
    <constructor-arg name="age" value="110"/>
    <constructor-arg name="name" value="Name"/>
</bean>
以静态工厂方法实例化Bean

例 1:

package com.wenj.servicesimpl;

public class C {
    private static C c = new C();
    public C(){
        System.out.println("C");
    }
    public static C createCInstance(){
        return c;
    }
}


 

xml中可以这样配置:

 

<bean id="c3" class="com.wenj.servicesimpl.C" factory-method="createCInstance"/>

 

以工厂方法实例化Bean

1:

package com.wenj.servicesimpl;

public class C {
    public C(){
        System.out.println("C");
    }
}

//factory
package com.wenj.servicesimpl;

public class CFactory {
    private static C c = new C();
    public C createCInstance(){
        return c;
    }
}


 

xml中可以这样配置

 <bean id="cFactory" class="com.wenj.servicesimpl.CFactory"/>

 <bean id="c4" factory-bean="cFactory" factory-method="createCInstance"/>

 

注意: 工厂类也可以处理多个对象, 持有多个不同对象的工厂方法


setter的方式实例化Bean

基于setterDI是由容器在调用完默认构造方法或者静态工厂方法后调用setter方法来实例化Bean

 

例 1:

package com.wenj.servicesimpl;

public class C {
    private int age;
    private String name;
    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}


xml可以这样配置:

<bean id="c5" class="com.wenj.servicesimpl.C">
       <property name="age" value="110"/>
       <property name="name" value="username"/>
</bean>


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值