用Spring来管理项目中的类的创建的时候,可以使用set注入。这种方式需要目标类的属性有setXxx()方法,不然会报错。以下是项目结构和配置文件使用set注入的代码。
UserSet.xml的代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!--手动一个个的配置属性,通过它们的setXxx()方法设置属性值-->
<bean id="user1" class="com.huchaun.pojo.User">
<property name="id" value="1"/>
<property name="name" value="胡川"/>
<property name="age" value="21"/>
<property name="address" ref="address"></property>
<property name="hobby">
<list>
<value>下棋</value>
<value>王者荣耀</value>
<value>和平精英</value>
</list>
</property>
<property name="card">
<map>
<entry key="card" value="510525222222222222"></entry>
</map>
</property>
<property name="info">
<props >
<prop key="username">admin</prop>
<prop key="password">admin</prop>
</props>
</property>
<property name="wife">
<null/>
</property>
</bean>
<bean id="address" class="com.huchaun.pojo.Address">
<property name="address" value="四川"/>
</bean>
</beans>
第二种方法是使用构造器注入,需要注意的是使用这种方法需要有对应的构造器,没有对应的构造器会提示错误。还有就是这里的name的值对应的是构造器里的形参名,不要写成属性名。代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!--通过构造器注入属性值,需要注意的是该实体类需要一个无参构造和有参构造-->
<bean id="user1" class="com.huchaun.pojo.User">
<constructor-arg name="id" value="1"/>
<constructor-arg name="name" value="胡川"/>
<constructor-arg name="age" value="20"/>
<constructor-arg name="address" ref="address"/>
<constructor-arg name="Hobby">
<list>
<value>下棋</value>
<value>和平精英</value>
</list>
</constructor-arg>
<constructor-arg name="card">
<map>
<entry key="card" value="510525222222222222"></entry>
</map>
</constructor-arg>
<constructor-arg name="info">
<props>
<prop key="username">admin</prop>
<prop key="password">123456</prop>
</props>
</constructor-arg>
<constructor-arg name="wife" value=""/>
</bean>
<bean id="address" class="com.huchaun.pojo.Address">
<property name="address" value="四川泸州"/>
</bean>
</beans>
需要知道的是,当属性中有另一个Class对象的情况下,可以显示的指定该属性对应的bean标签的id。不论是set注入还是构造器注入都一样。代码如下:
<!--set注入-->
<property name="address" ref="address"></property>
<!--构造器注入-->
<constructor-arg name="address" ref="address"/>
当然,也可以在bean标签中隐式的声明属性的自动注入 autowire="byName" ,其中的参数还可以是其它的。我个人比较喜欢byName,因为用byType的话如果一个类有多个不同的bean,byType处理可能会出错。需要注意的是,如果该类有toString()的话,需要处理输出语句,因为可能会出现属性.toString()中的属性为null。
byName : 通过bean标签的id进行属性注入。
byType : 通过bean标签的class的值和属性的值匹配来进行属性值的注入,这种方式不能用于有多 个相同class的bean标签,哪怕是在不同的配置文件也不可以。
constuctor : 这种表示byName和byType的组合,两个都匹配,才进行属性值的注入。
可以选择的参数如下: