ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
[TOC] # 注意 如果字面值包含特殊字符串,可以用 `<![CDATA[]]>` 把字面值包裹起来 # 构造器注入 需要User类中有这个对应的构造方法 ~~~ <!-- 将User对象交给spring容器管理 --> <bean name="user" class="studySpring.User"> <!-- type可以指定类型 --> <constructor-arg value="jerry" type="java.lang.String"></constructor-arg> <constructor-arg ref="car" type="com.spring.Car"></constructor-arg> </bean> <!-- 将Car对象配置到容器 --> <bean name="car" class="studySpring.Car"> <!-- 为user类的name和age属性注入值 --> <property name="name" value="兰博基尼"></property> <property name="color" value="黄色"></property> </bean> ~~~ 如果来个构造函数重载呢? ~~~ public User(String name, Car car) { System.out.println("User(String name, Car car)!!"); this.name = name; this.car = car; } public User(Car car, String name) { System.out.println("User(Car car,String name)!!"); this.name = name; this.car = car; } public User(Integer name, Car car) { System.out.println("User(Integer name, Car car)!!"); this.name = name + ""; this.car = car; } ~~~ ~~~ <!-- 将User对象交给spring容器管理 --> <bean name="user" class="studySpring.User"> <!-- name属性:构造函数的参数名 --> <!-- index属性:构造函数的参数索引 --> <!-- type属性:构造函数的参数类型 --> <constructor-arg name="name" value="99" index="0" type="java.lang.Integer"></constructor-arg> <constructor-arg name="car" ref="car" index="1"></constructor-arg> </bean> <!-- 将Car对象配置到容器 --> <bean name="car" class="studySpring.Car"> <!-- 为user类的name和age属性注入值 --> <property name="name" value="兰博基尼"></property> <property name="color" value="黄色"></property> </bean> ~~~ # setter方法注入 **普通的值类型** ~~~ <!-- 将User对象交给spring容器管理 --> <bean name="user" class="studySpring.User"> <!-- 为user类的name和age属性注入值 --> <property name="name" value="tom"></property> <property name="age" value="18"></property> </bean> ~~~ **引用类型** ~~~ <!-- 将User对象交给spring容器管理 --> <bean name="user" class="studySpring.User"> <!-- 为user类的name和age属性注入值 --> <property name="name" value="tom"></property> <property name="age" value="18"></property> <!-- 把bean的name写这就行 --> <property name="car" ref="car"></property> </bean> <!-- 将Car对象配置到容器 --> <bean name="car" class="studySpring.Car"> <!-- 为user类的name和age属性注入值 --> <property name="name" value="兰博基尼"></property> <property name="color" value="黄色"></property> </bean> ~~~ **特殊字符** 特殊字符要使用`![CDATA[<ABC>]]`包起来 ~~~ <bean name="car" class="com.spring.Car"> <property name="name"> <value><![CDATA[<奔驰>]]></value> </property> <property name="color" value="黄色"></property> </bean> ~~~ **null** 可以使用专用的`<null />`元素标签为Bean的字符串或其他对象类型的属性注入null值 # 名称空间p和c的使用 Spring2.0以后提供了xml命名空间 ## p命名空间 可以通过p命名空间来配置Bean属性 首先配置文件 ![](https://box.kancloud.cn/efeb13d79d9dfc9c4117796dceca2f66_940x123.png) ~~~ <!-- 1.p名称空间注入 xmlns:p="http://www.springframework.org/schema/p" 2.使用p:属性完整注入 |-值类型: p:属性名="值" |-对象类型: p:属性名-ref="bean名称" --> <bean name="user1" class="studySpring.User" p:name="jack" p:age="20" p:car-ref="car"></bean> ~~~ ## c命名空间 使用c名称空间来解决构造器注入 ~~~ <bean id="user2" class="com.spring.User"> <constructor-arg index="0" value="jelly" /> <constructor-arg index="1" ref="car" /> </bean> ~~~ 在applicationContext.xml文件中添加c名称空间 ~~~ xmlns:c="http://www.springframework.org/schema/c" ~~~ ~~~ <bean id="user4" class="com.spring.User" c:name="jack" c:car-ref="car" /> ~~~ 注: 如果c或p名称空间操作的属性后缀是-ref代表要引入另一个已经存在的bean # 集合属性注入 首先准备个测试类 ~~~ public class CollectionBean { // 数组类型注入 private Object[] arr; // list/set 类型注入 private List list; // map类型注入 private Map map; // properties类型注入 private Properties prop; } ~~~ 然后生成get/set/tostring等方法 ## array注入 ~~~ <!-- array注入 --> <bean name="cb" class="studySpring.CollectionBean"> <!-- 如果数组只有一个值(对象),直接使用value|ref --> <!-- <property name="arr" value="tom"></property> --> <property name="arr"> <array> <value>tom</value> <value>jerry</value> <!-- 把这个bean注入进来 --> <ref bean="user" /> </array> </property> </bean> ~~~ ## list注入 ~~~ <bean name="cb" class="studySpring.CollectionBean"> <!-- 如果list组只有一个值(对象),直接使用value|ref --> <!-- <property name="list" value="jack"></property> --> <property name="list"> <list> <value>tom</value> <value>jerry</value> <!-- 把这个bean注入进来 --> <ref bean="user" /> </list> </property> </bean> ~~~ ## map注入 ~~~ <bean name="cb" class="studySpring.CollectionBean"> <property name="map"> <map> <entry key="url" value="jdbc:mysql://crm"></entry> <!-- bean的名字为user --> <entry key="user" value-ref="user"></entry> <!-- key也可以是引用类型 --> <entry key-ref="user" value-ref="user"></entry> </map> </property> </bean> ~~~ ## properties注入 ~~~ <bean name="cb" class="studySpring.CollectionBean"> <property name="prop"> <props> <prop key="driverClass">com.jdbc.mysql.Driver</prop> <prop key="userName">root</prop> <prop key="password">root</prop> </props> </property> </bean> ~~~ ## util配置 通过util命名空间配置集合类型的bean 首先给类表加个字段 ~~~ //要给setter和getter private List list; ~~~ 在配置文件中把list独立出去 ~~~ <!-- 通过util命名空间配置集合类型的bean --> <util:list id="refList"> <value type="java.lang.String">tom</value> <ref bean="car"/> </util:list> ~~~ 然后在user中注入 ~~~ <bean name="user" class="com.spring.User"> <property name="name" value="你好"/> <property name="list"> <ref bean="refList" /> </property> </bean> ~~~ # 级联属性赋值 ~~~ <bean name="car" class="com.spring.Car"> <property name="name"> <value><![CDATA[<奔驰>]]></value> </property> <property name="color" value="黄色"/> </bean> <bean name="user" class="com.spring.User"> <property name="name" value="你好"/> <!-- 把car这个bean引入进来 --> <property name="car" ref="car" /> <!-- 给级联属性赋值,也就是给car里面的属性赋值 --> <property name="car.name" value="奥迪" /> <property name="car.color" value="黑色" /> </bean> ~~~