-
直接值可理解为String类型或其他基本类型值,可将这类值直接注入到实例中:
<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <!-- results in a setDriverClassName(String) call --> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mydb"/> <property name="username" value="root"/> <property name="password" value="masterkaoli"/> </bean>
-
不仅可使用以上常规的setter方法进行注入,还可使用p-属性名的方式进行注入,这类内容作为属性存放在bean标签中。需要注意的是,要在xmlns中添加对p-指令的相关约束:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" p:driverClassName="com.mysql.jdbc.Driver" p:url="jdbc:mysql://localhost:3306/mydb" p:username="root" p:password="masterkaoli"/> </beans>
-
直接值还可书写在value标签中,存在于property标签中:
<bean id="mappings" class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer"> <property name="properties"> <value> jdbc.driver.className=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/mydb </value> </property> </bean>
value属性中的键值对格式数据将被转换为java.util.Properties类型实例,并对相应的键进行赋值。
-
在进行注入时,还可直接指定id进行属性注入,使用idref标签进行指定,此类方式优于其他bean指定方式,因其会在部署时验证idref所指向的bean是否存在,而其他方式仅会在运行时发成错误:
<bean id="theTargetBean" class="..."/> <bean id="theClientBean" class="..."> <property name="targetName"> <idref bean="theTargetBean"/> </property> </bean>
引用其他实例
-
在xml文件中,可通过consructor-arg对构造方法参数进行赋值,或使用property调用setter方法进行赋值。
-
并且还可以使用ref标签进行bean的引用,这种引用方式与填入bean的id的方式是相同的。
<bean id="accountService" class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="target"> <ref parent="accountService"/> </property> </bean>
内部类实例
-
可在bean标签中内嵌bean标签,从而给内部类创建实例。
<bean id="outer" class="..."> <property name="target"> <bean class="com.example.Person"> <!-- this is the inner bean --> <property name="name" value="Fiona Apple"/> <property name="age" value="25"/> </bean> </property> </bean>
集合赋值
-
失灵list、set、map、props标签可定义集合内容进行注入。
-
list标签主要用于List相关子类赋值,value标签中的内容为基本类型与String类型,ref为引用其他实例赋值:
<bean class='...' id='...'> <property name="someList"> <list> <value>a list element followed by a reference</value> <ref bean="myDataSource" /> </list> </property> </bean>
-
set标签主要用于Set子类赋值,与list标签使用方式相同:
<bean class='...' id='...'> <property name="someSet"> <set> <value>just some string</value> <ref bean="myDataSource" /> </set> </property> </bean>
-
map标签用于给Map子类赋值,其中使用entry标签指定键值对,key属性表示键内容,value可指定为String类型或基本类型,value-ref用于指定其他实例:
<bean class='...' id='...'> <property name="someMap"> <map> <entry key="an entry" value="just some string"/> <entry key ="a ref" value-ref="myDataSource"/> </map> </property> </bean>
-
props中存在prop字标签,其中可存放Map或List或Set的任意类型值:
<bean> <property name="adminEmails"> <props> <prop key="administrator">[email protected]</prop> <prop key="support">[email protected]</prop> <prop key="development">[email protected]</prop> </props> </property> </bean>
集合合并
-
可对一个bean中的集合做合并操作,合并进去的内容需要在另一个bean中定义。被合并bean要添加abstract属性并定义为true,合并的bean要调价parent属性指定要合并到哪里去。合并的集合可以使用props标签定义,并需添加merge属性而true表示融合:
<bean id='paret' abstract='true' class='...'> <property name='adminEmails'> <props> <prop key="administrator">[email protected]</prop> <prop key="support">[email protected]</prop> </props> </property> </bean> <bean parent='parent'> <property name="adminEmails"> <props merge="true"> <prop key="sales">[email protected]</prop> <prop key="support">[email protected]</prop> </props> </property> </bean>
-
如上文所示,合并之后的相同的key值的内容将覆盖本来存在的key的值。
-
不可对不同类型集合进行合并,只能同类类型合并。merge要在子集合中定义,在父集合中定义多余。
存在泛型集合的注入
-
自Java1.5之后,存在泛型的概念,即集合存储的值的类型有一定限制,故要对值进行考虑。
-
Spring会通过反射的方式读取到泛型内容,并对内容进行自动转型后赋值。
<beans> <bean id="something" class="x.y.SomeClass"> <property name="accounts"> <map> <entry key="one" value="9.99"/> <entry key="two" value="2.75"/> <entry key="six" value="3.99"/> </map> </property> </bean> </beans>
public class SomeClass { private Map<String, Float> accounts; public void setAccounts(Map<String, Float> accounts) { this.accounts = accounts; } }
上文集合泛型值类型为Float,那将对value属性中的内容进行转换后赋值。
空与空串
-
Spring中指定空字符串依然可使用
""
表示,其等效于java中的空字符串。 -
如果要存储类似java的null值的内容,需使用null单标签:
<property name="email"> <null/> </property>
快捷输入方式
-
p-namespace可用于类似property标签的替代,使用属性的方式减少标签的数量:
<bean name="john-modern" class="com.example.Person" p:name="John Doe" p:spouse-ref="jane"/>
-
在使用p:的时候,需要引入相关xml格式约束:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
-
c-namespace可用于constructor-arg标签的替代,及构造函数参数赋值:
<bean id="beanOne" class="x.y.ThingOne" c:thingTwo-ref="beanTwo" c:thingThree-ref="beanThree" c:email="[email protected]"/>
-
使用c:时同样要引入相关xml格式约束文件:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:c="http://www.springframework.org/schema/c" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
-
以上使用方式中,凡是以-ref后缀的参数名皆参考自其它bean标签。
-
使用c:方式还可指定构造方法参数下标的方式进行赋值,因为语法限制的问题,下标前要前缀_:
<bean id="beanOne" class="x.y.ThingOne" c:_0-ref="beanTwo" c:_1-ref="beanThree" c:_2="[email protected]"/>
属性的属性
-
如想向实例中某引用类型属性的属性赋值,可直接使用.的方式进行调用:
<bean id="something" class="things.ThingOne"> <property name="fred.bob.sammy" value="123" /> </bean>
以上及表示想本实例中fred属性的bob属性的sammy属性中赋值为123。
强制初始化
-
一般情况下,依赖可以叫做对象中属性实例的创建,但是有时候依赖并没有这样直接,而是由很多错综复杂的情况构成。故创建此实例时,要将看似不相干的一个或多个实例创建出来,因为可能其简介存在依赖关系。
-
这类依赖要在当前实例创建之前实例化,使用depends-on在当前实例指定实例,即可在创建此实例时优先创建指定的实例后在创建本实例:
<bean id="beanOne" class="ExampleBean" depends-on="manager"/> <bean id="manager" class="ManagerBean" />
-
若对多个实例形成间接依赖,则可使用逗号将多个实例隔开:
<bean id="beanOne" class="ExampleBean" depends-on="manager,accountDao"></bean> <bean id="manager" class="ManagerBean" /> <bean id="accountDao" class="x.y.jdbc.JdbcAccountDao" />