当前位置:   article > 正文

[spring学习]3、基于xml配置bean的常见方式_spring xml配置bean

spring xml配置bean

目录

前言

配置bean基础属性

通过构造器配置bean

通过p名称空间配置

通过ref引用其他对象

配置内部bean

配置集合、数组类型

字符串

List集合

Map集合

Set集合

配置数组

配置Properties

级联属性赋值

通过静态工厂获取bean

通过实例工厂获取bean

通过FactoryBean获取对象

bean配置信息重用(继承)

总结


前言

        在这篇文章中,将会讲解基于xml配置bean的一些常见配置方法,由于内容太多,只给出配置的代码,还请自己创建测试类来进行测试....


配置bean基础属性

        我们的bean里面一般都会有属性值,我们在配置的时候一般情况下都会要配置属性,下面先来了解最基础的配置bean。

        bean的内容如下

        下面我们来对这个bean进行配置

  1. <!--配置monster对象-->
  2. <bean class="com.ttpfx.spring.beans.Monster" id="monster01">
  3. <property name="id" value="1"/>
  4. <property name="name" value="牛魔王"/>
  5. <property name="skill" value="狮吼功"/>
  6. </bean>

        解释一下,class表示要配置bean的全路径,id为bean在spring容器中的唯一标识。下面的<property />就是配置bean的属性,name表示属性名,value表示要配置的值。 


通过构造器配置bean

        我们可以通过类的构造器来初始化bean,配置如下

  1. <!--配置monster对象-->
  2. <bean class="com.ttpfx.spring.bean.Monster" id="monster03">
  3. <constructor-arg value="2" name="id"/>
  4. <constructor-arg value="孙悟空" name="name"/>
  5. <constructor-arg value="七十二变" name="skill"/>
  6. </bean>

        上面的配置就是根据构造器来进行注入的,当然,肯定要有这个构造器才行。我们通过<construcor-arg />这个标签来进行配置,value就是要注入的值,name就是属性的名称,自己定义的。还有一种方式如下

  1. <!--配置monster对象-->
  2. <bean class="com.ttpfx.spring.bean.Monster" id="monster04">
  3. <constructor-arg value="2" type="java.lang.Integer"/>
  4. <constructor-arg value="孙悟空" type="java.lang.String"/>
  5. <constructor-arg value="七十二变" type="java.lang.String"/>
  6. </bean>

         这个是根据类型来注入的,这种注入有个要求,就是必须按照构造器中参数的顺序来进行。当然,也可以不用写类型,直接通过索引来配置,差不多的,也是要按照顺序。

  1. <!--配置monster对象-->
  2. <bean class="com.ttpfx.spring.beans.Monster" id="monster02">
  3. <constructor-arg value="2" index="0"/>
  4. <constructor-arg value="孙悟空" index="1"/>
  5. <constructor-arg value="七十二变" index="2"/>
  6. </bean>

        上述三种就是构造器的常见配置,个人比较喜欢用第一种 


通过p名称空间配置

        在spring中,我们使用可以p名称空间来进行配置,使用这个来进行配置会简洁一点。使用前首先要引入命名空间如下

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

        还是配置上面个Monster,配置如下

  1. <!--通过p命名空间配置-->
  2. <bean class="com.ttpfx.spring.beans.Monster" id="monster05"
  3. p:id="1"
  4. p:name="孙悟空"
  5. p:skill="金箍棒"
  6. />

        这个配置就很简单了,p:属性名=值 就行了。


通过ref引用其他对象

        我们都知道,在bean里面往往会引用其他bean,例如service就会应用dao,这时我们就要使用ref进行引用,不能使用value。

        首先创建一个Service和Dao类

         下面来对MemberService的MemberDao进行配置

  1. <!--通过ref来进行引用-->
  2. <bean class="com.ttpfx.spring.beans.MemberDao" id="memberDao"/>
  3. <bean class="com.ttpfx.spring.beans.MemberService" id="memberService">
  4. <property name="memberDao" ref="memberDao"/>
  5. </bean>

        上面配置中的memberService通过ref就可以引用到配置的memberDao


配置内部bean

        在上面的ref引用中,我们需要在xml中配置了相应的对象后才能引用,如果不想配置,那么直接使用内部bean配置即可

  1. <!--直接指明路径,可以不需要配置要引用的对象-->
  2. <bean class="com.ttpfx.spring.beans.MemberDao" id="memberDao1"/>
  3. <bean class="com.ttpfx.spring.beans.MemberService" id="memberService1">
  4. <property name="memberDao">
  5. <bean class="com.ttpfx.spring.beans.MemberDao"/>
  6. </property>
  7. </bean>

        上面就是没有使用ref,而是指明的要配置的bean的全路径


配置集合、数组类型

        上面的配置都比较简单,不是字符串就是ref引用,那我们要配置集合或者数组该怎么办呢?下面就来看一下,首先准备一个bean来进行测试。

        上面的这个类有字符串,List,Map,Set,数组,Properties,下面来对这些属性进行配置

字符串

        <property name="name" value="观音菩萨"/>

List集合

  1. <!--配置list属性-->
  2. <property name="masterList">
  3. <list>
  4. <ref bean="monster01"/>
  5. <ref bean="monster02"/>
  6. <bean class="com.ttpfx.spring.beans.Monster">
  7. <property name="id" value="123"/>
  8. <property name="name" value="红孩儿"/>
  9. <property name="skill" value="三味真火"/>
  10. </bean>
  11. </list>
  12. </property>

        解释一下,monster01和monster02就是上面配置的,下面一个bean就是现在创建的一个bean,给了初始值。list属性配置就是使用<list />标签。

Map集合

  1. <!--配置map属性-->
  2. <property name="masterMap">
  3. <map>
  4. <entry key="monster03" value-ref="monster03" />
  5. <entry key="monster04" value-ref="monster04"/>
  6. </map>
  7. </property>

        map配置也很简单,就是通过<map />标签,里面使用<entry />进行配置即可,key为map的key,value-ref就是key所对应的value,后面的ref表示引用,如果不是引用就不需要加。

Set集合

  1. <!--配置set属性-->
  2. <property name="masterSet">
  3. <set>
  4. <ref bean="monster01"/>
  5. <ref bean="monster02"/>
  6. <bean class="com.ttpfx.spring.beans.Monster">
  7. <property name="id" value="123"/>
  8. <property name="name" value="红孩儿"/>
  9. <property name="skill" value="三味真火"/>
  10. </bean>
  11. </set>
  12. </property>

        其实后面的配置和前面都差不多了,就是换个名称,配置set就是使用<set />标签

配置数组

  1. <!--配置数组-->
  2. <property name="masterNames">
  3. <array>
  4. <value>唐僧</value>
  5. <value>孙悟空</value>
  6. <value>猪八戒</value>
  7. <value>沙悟净</value>
  8. </array>
  9. </property>

        配置数组就是使用<array />标签,里面写要配置的值就行了

配置Properties

  1. <!--配置properties-->
  2. <property name="properties">
  3. <props>
  4. <prop key="username">root</prop>
  5. <prop key="password">root</prop>
  6. </props>
  7. </property>

        配置Properties也是大同小异,使用<props />标签即可,里面写要配置的值。<prop />表示每一项,key就是Properties的key,标签中间写配置的value


级联属性赋值

        这个名称不好理解,其实就是直接给对象属性的属性赋值,相当于A类引用B类,B类有一个属性,那么可以在配置A类时直接指定B类的属性,下面直接看代码

  1. <bean class="com.ttpfx.spring.beans.B" id="b"/>
  2. <bean class="com.ttpfx.spring.beans.A" id="a">
  3. <property name="b" ref="b"/>
  4. <property name="b.name" value="亚丝娜"/>
  5. </bean>

         我们在B类里面有属性name,但是配置B类时没有指定,我们可以在A类里面对要引用的B类的属性进行配置,这个就是级联属性赋值。


通过静态工厂获取bean

        首先创建一个类,提供一个静态方法

         我们可以发现,这个类有一个静态方法,通过这个静态方法可以获取Monster对象,下面我们就通过这个来配置bean。

  1. <!--通过静态工厂来获取-->
  2. <bean id="my_monster" class="com.ttpfx.spring.factory.MyStaticFactory"
  3. factory-method="getMonster">
  4. <constructor-arg value="monster01"/>
  5. </bean>

         解释一下,上面的class就是指向我们自己创建的提供静态方法的类,后面的factory-method就是指定静态方法,下面的constructor-arg就是指定参数的。


通过实例工厂获取bean

        这个和上面的静态工厂特别像,只是去掉的static,还是一样的,首先创建一个类作为实例工厂

        可以看见,这个工厂类提供了一个方法来获取bean,下面通过配置来使用

  1. <!--通过实例工厂来获取-->
  2. <bean class="com.ttpfx.spring.beans.MyInstanceFactory" id="myInstanceFactory"/>
  3. <bean factory-bean="myInstanceFactory" factory-method="getMonster" id="my_monster01">
  4. <constructor-arg value="monster02"/>
  5. </bean>

         解释一下,第一个bean先把我们的工厂类配置进spring容器,第二个bean就是通过工厂类来获取bean,factory-bean就是指定工厂类,factory-method就是指定获取bean的方法,下面的constructor-arg就是指定方法的参数。


通过FactoryBean获取对象

        我们可以通过实现FactoryBean接口来创建一个Bean工厂

  1. public class MyFactoryBean implements FactoryBean<Monster> {
  2. private String key;
  3. private Map<String, Monster> monsterMap;
  4. {
  5. monsterMap = new HashMap<>();
  6. monsterMap.put("monster01", new Monster(100, "孙悟空", "金箍棒"));
  7. monsterMap.put("monster02", new Monster(200, "唐僧", "紧箍咒"));
  8. monsterMap.put("monster03", new Monster(300, "猪八戒", "九齿钉耙"));
  9. monsterMap.put("monster04", new Monster(400, "沙悟净", "大师兄~~~"));
  10. }
  11. public void setKey(String key) {
  12. this.key = key;
  13. }
  14. @Override
  15. public Monster getObject() throws Exception {
  16. return monsterMap.get(key);
  17. }
  18. @Override
  19. public Class<?> getObjectType() {
  20. return this.getClass();
  21. }
  22. @Override
  23. public boolean isSingleton() {
  24. return true;
  25. }
  26. }

        我们继承FactoryBean工厂,需要实现3个方法getObject(),getObjectType(),isSingletion(),getObject就是返回工厂对象,getObjectType()就是返回类型,isSingletion就是返回是否是单例对象。

        使用这个BeanFactory非常简单,直接指定就行,会自动调用getObject进行返回。

  1. <!--通过factoryBean来配置bean-->
  2. <bean class="com.ttpfx.spring.beans.MyFactoryBean" id="my_monster02">
  3. <property name="key" value="monster01"/>
  4. </bean>

bean配置信息重用(继承)

        我们在配置信息时,如果遇到许多相同的配置,可以将其提取出来,然后其他bean来进行继承,实现重用的目的。

        先创建一个bean用于测试

         配置如下

  1. <!--如果配置了abstract属性,那么就不能被实例化,只能被用于继承-->
  2. <bean class="com.ttpfx.spring.beans.People" id="people01" >
  3. <property name="id" value="001"/>
  4. <property name="name" value="路飞"/>
  5. <property name="gender" value="男"/>
  6. </bean>
  7. <bean class="com.ttpfx.spring.beans.People" id="people02" parent="people01"/>

        上面的配置就表示将id为people01的bean作为被继承的对象,people02继承people01的值,我们可以指定abstract,指定后就不能被实例化,只能用于继承。


总结

        在这篇文章中,讲解了一些基于xml配置bean的常用方式,当然,方式还有很多,这里只说明了一些,上面的只有配置,就单纯看的化肯定会有点模糊,大家可以自己创建一个测试类来对每种配置进行测试。篇幅有限,其他的配置方法在下一篇文章中进行说明。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/90440
推荐阅读
相关标签
  

闽ICP备14008679号