直接值可理解为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">administrator@example.org</prop> <prop key="support">support@example.org</prop> <prop key="development">development@example.org</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">administrator@example.com</prop> <prop key="support">support@example.com</prop> </props> </property> </bean> <bean parent=‘parent‘> <property name="adminEmails"> <props merge="true"> <prop key="sales">sales@example.com</prop> <prop key="support">support@example.co.uk</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="something@somewhere.com"/>
使用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="something@somewhere.com"/>
如想向实例中某引用类型属性的属性赋值,可直接使用.的方式进行调用:
<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" />
韶光淑气_Spring_4.0 注入详解_2020年4月10日12:01:25
原文:https://www.cnblogs.com/agoodjavaboy/p/12672566.html