• Spring配置bean的详细知识


    在Spring中配置bean的一些细节。具体信息请参考下面的代码及注释

    applicationContext.xml文件

      1 <?xml version="1.0" encoding="UTF-8"?>
      2 <beans xmlns="http://www.springframework.org/schema/beans"
      3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      4     xmlns:util="http://www.springframework.org/schema/util"
      5     xmlns:p="http://www.springframework.org/schema/p"
      6     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
      7         http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.1.xsd">
      8 
      9     <!-- 配置bean 
     10         class:bean的全类名,通过反射的方式在IOC容器中创建Bean,所以要求Bean中必须有无参数的构造器
     11         id:标识容器中的bean,id唯一。
     12     -->
     13     <bean id="helloSpring" class="com.yl.HelloSpring">
     14         <property name="name" value="Spring"></property>
     15     </bean>
     16     <!-- 使用构造器注入属性值可以指定参数的位置和参数的类型,以区分重载的构造器 -->
     17     <bean id="car" class="com.yl.Car">
     18         <constructor-arg value="Audi" index="0"></constructor-arg>
     19         <constructor-arg value="Shanghai" index="1"></constructor-arg>
     20         <constructor-arg value="300000" type="double"></constructor-arg>
     21     </bean>
     22     
     23     <bean id="car2" class="com.yl.Car">
     24         <constructor-arg value="BMW" type="java.lang.String"></constructor-arg>
     25         <!-- 如果字面值包含特殊字符,可以使用<![CDATA[]]> 包裹起来-->
     26         <!-- 属性值还可以使用value子节点进行配置 -->
     27         <constructor-arg type="java.lang.String">
     28             <value><![CDATA[<ShangHai~>]]></value>
     29         </constructor-arg>
     30         <constructor-arg value="200" type="int"></constructor-arg>
     31     </bean>
     32     
     33     
     34     <bean id="person" class="com.yl.Person">
     35         <property name="name" value="Tom"></property>
     36         <property name="age" value="24"></property>
     37         <!-- 可以使用property的ref属性建立bean之间的引用关系 -->
     38         <!-- <property name="car" ref="car2"></property> -->
     39         <!-- <property name="car">
     40             <ref bean="car2"/>
     41         </property> -->
     42         <!-- 内部Bean,不能被外部引用,只能在内部使用  -->
     43         <property name="car">
     44             <bean class="com.yl.Car">
     45                 <constructor-arg value="Ford"></constructor-arg>
     46                 <constructor-arg value="BeiJing"></constructor-arg>
     47                 <constructor-arg value="100000"></constructor-arg>
     48             </bean>
     49         </property>
     50     </bean>
     51     
     52     
     53     <bean id="person2" class="com.yl.Person">
     54         <constructor-arg value="Jerry"></constructor-arg>
     55         <constructor-arg value="25"></constructor-arg>
     56         <!-- <constructor-arg ref="car"></constructor-arg> -->
     57         <!-- 测试null值 -->
     58         <!-- <constructor-arg><null/></constructor-arg> -->
     59         <!-- 为级联属性赋值。注意:属性需要先初始化后才可以为级联属性赋值,否则会有异常 -->
     60         <constructor-arg ref="car"></constructor-arg>
     61         <property name="car.speed" value="260"></property>
     62     </bean>
     63     
     64     
     65     <!-- 测试集合属性 -->
     66     <bean id="person3" class="com.yl.collections.Person">
     67         <property name="name" value="Mike"></property>
     68         <property name="age" value="30"></property>
     69         <property name="cars">
     70             <!-- 使用list节点为List类型的属性赋值 -->
     71             <list>
     72                 <ref bean="car"/>
     73                 <ref bean="car2"/>
     74                 <bean class="com.yl.Car">
     75                     <constructor-arg value="Ford"></constructor-arg>
     76                     <constructor-arg value="BeiJing"></constructor-arg>
     77                     <constructor-arg value="100000"></constructor-arg>
     78                 </bean>
     79             </list>
     80         </property>
     81     </bean>
     82     
     83     <!-- 配置Map属性值 -->
     84     <bean id="newPerson" class="com.yl.collections.NewPerson">
     85         <property name="name" value="Rose"></property>
     86         <property name="age" value="24"></property>
     87         <property name="cars">
     88             <!-- 使用map节点机map的entry子节点配置Map类型的成员变量 -->
     89             <map>
     90                 <entry key="AA" value-ref="car"></entry>
     91                 <entry key="BB" value-ref="car2"></entry>
     92             </map>
     93         </property>
     94     </bean>
     95     
     96     <!-- 配置Properties属性值 -->
     97     <bean id="dataSource" class="com.yl.collections.DataSource">
     98         <property name="properties">
     99             <!-- 使用props和prop子节点来为Properties属性赋值 -->
    100             <props>
    101                 <prop key="user">root</prop>
    102                 <prop key="password">1234</prop>
    103                 <prop key="jdbcUrl">jdbc:mysql:///test</prop>
    104                 <prop key="driverClass">com.mysql.jdbc.Driver</prop>
    105             </props>
    106         </property>
    107     </bean>
    108     
    109     <!-- 配置单例的集合bean,以供多个bean进行引用.需要导入util命名空间 -->
    110     <util:list id="cars">
    111         <ref bean="car"/>
    112         <ref bean="car2"/>
    113     </util:list>
    114     
    115     <bean id="person4" class="com.yl.collections.Person">
    116         <property name="name" value="Jack"></property>
    117         <property name="age" value="25"></property>
    118         <property name="cars" ref="cars"></property>
    119     </bean>
    120     
    121     <!-- 通过p命名空间为bean的属性赋值,需要先导入p命名空间,相对于传统的方式,更加简洁 -->
    122     <bean id="person5" class="com.yl.collections.Person" p:name="Queen" p:age="27" p:cars-ref="cars"></bean>
    123     
    124     
    125     
    126     
    127     
    128     
    129 </beans>

     

    Spring自动装配bean
    Spring IOC容器可以自动装配bean,需要做的仅仅是在<bean>的autowire属性里指定装配的模式
    byType:根据类型自动装配,若IOC容器中有多个与目标类型一致的bean,在这种情况下,Spring将无法判定哪个bean最合适该属性,所以不能执行
    byName:根据名称自动装配,必须将目标bean的名称和属性名设置的完全相同
    constructor:通过构造器自动装配,当bean中存在多个构造器时,此种自动装配方式将会很复杂。不推荐使用。具体信息参考下面的文件及注释


    beans.xml文件

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans"
     3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4     xmlns:p="http://www.springframework.org/schema/p"
     5     xmlns:util="http://www.springframework.org/schema/util"
     6     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
     7         http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.1.xsd">
     8     
     9     <bean id="address" class="com.yl.autowire.Address"
    10         p:city="BeiJing" p:street="HuiLongGuan"></bean>
    11 
    12     <bean id="car" class="com.yl.autowire.Car"
    13         p:brand="Audi" p:price="30000"></bean>
    14         
    15     <!-- <bean id="person" class="com.yl.autowire.Person"
    16         p:name="Tom" p:address-ref="address" p:car-ref="car"></bean> -->
    17     <!-- 可以使用autowire属性指定自动装配的方式,
    18         byName根据bean的名字和当前bean的setter风格的属性名进行自动装配 ,若有匹配的,则进行自动装配,若没有匹配的,则不装配 
    19         byType根据bean的类型和当前bean的属性的类型进行自动装配,若IOC容器中有一个以上的类型匹配的bean,则抛出异常    
    20     -->
    21     <bean id="person" class="com.yl.autowire.Person"
    22         p:name="Tom" autowire="byName"></bean>
    23 </beans>


    自动装配的缺点
    在bean配置文件里设置autowire属性进行自动装配将会装配bean的所有属性,然而,若只希望装配个别属性时,autowire就不够灵活了。
    autowire属性要么根据类型自动装配,要么根据名称自动装配,不能两者兼而有之
    一般情况下,在实际的项目中很少使用自动装配功能,因为和自动装配功能所带来的好处比起来,明确清晰的配置文档更有说服力。

  • 相关阅读:
    与人相处的二十四条黄金法则(转载)
    User.UserType: NoLogin 不是SQL Server 2005 的有效选项 的解决方案
    腾讯QQ的验证码,很黄很暴力
    具有Ajax自动建议功能的TextBox控件(附源码)
    30+英文电子书免费下载网站,跟喜欢看英文电子书的朋友分享
    Ajax实现多任务指示器(附源码)
    批量替换数据库记录内容的一条SQL语句
    MAC地址为FFFFFFFFFFFF,接受数据包为0,局域网电脑不能上网的解决办法
    不小了,该谈朋友结婚了,年前能实现吗?
    WordPress中J.parentNode’为空或不是对象的解决方法
  • 原文地址:https://www.cnblogs.com/dreamfree/p/4080000.html
Copyright © 2020-2023  润新知