0%

spring | 各类型注入

类型分类

  • JDK 内置类型
    • 8 种基本类型 + String
    • 数组
    • set
    • list
    • map
    • properites
  • 用户自定义类型

set 注入

如果一个类中有各种定义的变量,比如用户自定义类型,那么应该怎么注入。

JDK内置类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package com.rhino;

import lombok.Data;

import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;

@Data
public class Person {

private Integer id;
private String name;
private String[] emails;
private Set<String> tels;
private List<String> addresses;
private Map<String,String> qqs;
private Properties p;

public Person(){
System.out.println("Person.person");
}


}

8 种基本类型 + String

使用

1
2
3
<property name="name">
<value>小明</value>
</property>

数组

1
2
3
4
5
6
<property name="emails">
<list>
<value>123@com</value>
<value>2222@com</value>
</list>
</property>

set 类型「无序」

1
2
3
4
5
6
7
8
<property name="tels">
<set>
<value>1239999</value>
<value>1239909</value>
<ref bean="">
</ref>
</set>
</property>

list 类型「有序」

1
2
3
4
5
6
7
8
9
10
<property name="addresses">
<list>
<value>123</value>
<value>1234445</value>
<value>1234445</value>
<set></set>
<ref bean=""/>
<list></list>
</list>
</property>

map

1
2
3
4
5
6
7
8
<property name="qqs">
<map>
<entry>
<key><value>suns</value></key>
<value>123</value>
</entry>
</map>
</property>

Properties

1
2
3
4
5
6
<property name="p">
<props>
<prop key="123">444</prop>
<prop key="1234">555</prop>
</props>
</property>

总结来说,整个代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<bean id="person" class="com.rhino.Person">
<property name="id"> <!--name 指向属性名字-->
<value>10</value>
</property>
<property name="name">
<value>小明</value>
</property>
<property name="emails">
<list>
<value>123@com</value>
<value>2222@com</value>
</list>
</property>
<property name="tels">
<set>
<value>1239999</value>
<value>1239909</value>
</set>
</property>
<property name="addresses">
<list>
<value>123</value>
<value>1234445</value>
<value>1234445</value>
</list>
</property>
<property name="qqs">
<map>
<entry>
<key><value>suns</value></key>
<value>123</value>
</entry>
</map>
</property>
<property name="p">
<props>
<prop key="123">444</prop>
<prop key="1234">555</prop>
</props>
</property>
</bean>

关于如何使用请参考

用户自定义类型

如果,一个类中嵌套另外一个自定义类。

第一种方式

新创建一个类,取名 User

1
2
3
4
5
6
7
8
package com.rhino;

import lombok.Data;

@Data
public class User {
private Person person; // 这个 person 就是上面的
}

然后在 applicationContext.xml 这样写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?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 http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="user" class="com.rhino.User">
<property name="person">
<!-- <bean class="com.rhino.Person">-->
<!-- <property name="name">-->
<!-- <value>小明</value>-->
<!-- </property>-->
<!-- </bean>-->
<bean class="com.rhino.Person"/>
</property>
</bean>
</beans>

上面的 xml 既可以赋值,也可以创建一个空对象。

然后在测试类中

1
2
3
4
5
6
@Test
public void test() {
ApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext.xml");
User user = (User) ctx.getBean("user");
System.out.println(user.getPerson().getName());
}

有正确输出小明。

这种方式有下面的几种缺点

  • 如果有一个类在多个类中使用,那么 xml 配置多次空对象,写了很多冗余代码
    • 并且,每一个类的 xml 配置,如果都写空对象,那么,这个空对象会创建很多次,分属于不同的对象

第二种方式

xml 的配置改成

1
2
3
4
5
6
<bean id="personImpl" class="com.rhino.Person"/>
<bean id="user" class="com.rhino.User">
<property name="person">
<ref bean="personImpl"/>
</property>
</bean>

在外面创建一个 personImpl ,然后在有需要的地方进行 ref 引用。

这样多个类中,保证 person 的类实现唯一。

请我喝杯咖啡吧~