1. 程式人生 > >Spring核心之5 SpringIOC容器的引數值注入

Spring核心之5 SpringIOC容器的引數值注入

value

value元素可以通過字串特定屬性或者構造器引數的值.容器將字串從java.lang.String型別轉換為實際的屬性或引數型別後給Bean物件注入;

<bean id="messageBean" class="com.gaoxinfu.demo.spring.example.bean.MessageBean">
   <property name="moudleName" value="資費管理"></property>
   <property name="pageSize" value="5"></property>
   <
property name="password" value="root"></property> <property name="usesName" value="root"></property> </bean>

注入bean物件

<bean id="userService" class="com.gaoxinfu.demo.spring.example.service.UserService">
    <property name="userDao">
        <bean class="com.gaoxinfu.demo.spring.example.dao.OracleUserDAO"
></bean> </property> </bean>

注入外部Bean,引用方式,方便重用

 <bean id="userDao" class="com.gaoxinfu.demo.spring.example.dao.OracleUserDAO"></bean>
   <bean id="userService" class="com.gaoxinfu.demo.spring.example.service.UserService">
        <property name="userDao" ref=
"userDao"/> </bean>

注入集合

通過 及元素可以定義和設定與java型別中對應list set map及Properties的屬性值;

注入集合List

<bean id="messageBean" class="com.gaoxinfu.demo.spring.example.bean.MessageBean"> 
   <property name="someList">
        <list>
            <value>北京</value> 
            <value>上海</value>
            <value>天津</value>
        </list>
   </property>
</bean>

注入集合Set

注入集合map

注入集合properties

<bean id="messageBean" class="com.gaoxinfu.demo.spring.example.bean.MessageBean">
   <property name="moudleName" value="資費管理"></property>
   <property name="pageSize" value="5"></property>
   <property name="password" value="root"></property>
   <property name="usesName" value="root"></property>
   
   <property name="someList">
        <list>
            <value>北京</value> 
            <value>上海</value>
            <value>天津</value>
        </list>
   </property>
   
   <property name="someSet">
        <set>
            <value>Tom1</value>
            <value>Tom2</value>
            <value>Tom3</value>
        </set>
   </property>
   
   <property name="someMap">
        <map>
            <entry key="1001" value="java基礎"></entry>
            <entry key="1002" value="vb基礎"></entry>
            <entry key="1003" value="C++基礎"></entry>
        </map>
   </property>
   
   <property name="someProps">
    <props>
        <prop key="username">root</prop>
         <prop key="password">1234</prop>
    </props>
   </property>
</bean>

注入Spring表示式

Spring引入了一種表示式語言,這和統一的EL在語法上很相似,這種表示式語言可以用於定義基於XML和註解配置的Bean,注入一個properties檔案資訊

<?xml version="1.0" encoding="UTF-8"?>
<beans
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:util="http://www.springframework.org/schema/util"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/util 
    http://www.springframework.org/schema/util/spring-util-3.0.xsd" >


    <util:properties id="jdbcProperties"  location="classpath:db.properties" />
   
   <bean id="messageBean" class="com.gaoxinfu.demo.spring.example.bean.MessageBean">
       <property name="moudleName" value="資費管理"></property>
       <property name="pageSize" value="5"></property>
       <property name="password" value="root"></property>
       <!-- <property name="usesName" value="root"></property> -->
       <property name="usesName" value="#{jdbcProperties.name}"></property>
       </property>
   </bean>
   </beans>

bean003.xml檔案裡面 需要這段

xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd"

否則會報錯下面問題

org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 8 in XML document from class path resource [Beans003.xml] is invalid; nested exception is org.xml.sax.SAXParseException: The prefix "util" for element "util:properties" is not bound.
	at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:396)
	at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:334)
	at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:302)
	at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:174)
	at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:209)
	at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:180)
	at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:243)
	at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:127)
	at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:93)
	at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:130)
	at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:537)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:451)
	at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
	at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
	at com.gaoxinfu.demo.spring.example.bean.MessageBeanTest.testExecute(MessageBeanTest.java:14)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Caused by: org.xml.sax.SAXParseException: The prefix "util" for element "util:properties" is not bound.
	at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195)
	at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:174)
	at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:388)
	at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:318)
	at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:310)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2756)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:647)
	at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:140)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:511)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:808)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
	at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119)
	at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:232)
	at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:284)
	at org.springframework.beans.factory.xml.DefaultDocumentLoader.loadDocument(DefaultDocumentLoader.java:75)
	at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:388)
	... 37 more

注入null或空字串

Spring將屬性的空引數當做空String,下面給email屬性設定了空String值("")

 <util:properties id="jdbcProperties"  location="classpath:db.properties" />
   
   <bean id="messageBean" class="com.gaoxinfu.demo.spring.example.bean.MessageBean">
       <property name="moudleName" value="資費管理"></property>
       <property name="pageSize" value="5"></property>
      <!--  <property name="password" value="root"></property> -->
       <property name="password" value=""></property>
       <!-- <property name="usesName" value="root"></property> -->
       <property name="usesName" value="#{jdbcProperties.name}"></property>
   </bean>

如果需要注入null值,可以適用元素

<util:properties id="jdbcProperties"  location="classpath:db.properties" />
  
  <bean id="messageBean" class="com.gaoxinfu.demo.spring.example.bean.MessageBean">
      <property name="moudleName" value="資費管理"></property>
      <property name="pageSize" value="5"></property>
     <!--  <property name="password" value="root"></property> -->
      <property name="password" >
      <null/>
      </property>
      <!-- <property name="usesName" value="root"></property> -->
      <property name="usesName" value="#{jdbcProperties.name}"></property>
  </bean>