首页 > 技术文章 > Spring DI注入

xfdhh 2019-09-07 20:56 原文

Setter注入

1、最常用的注入方法,需要在xml文件中手动配置。

2、要求:需要对象中需要注入值的属性都有setter方法

3、如何配置?

  为对象的每个属性配置一个property标签,<property name="" />

4、对象中的属性分为几种类型,不同的类型需要使用不同的注入方式

  1.简单数据类型(八大基本类型,String,BigDecimal,Date等),使用value。会自动进行类型转换。

  2.引用数据类型,使用ref。ref的值为Spring容器中已经存在的对象的名字。

  3.集合数据类型,需要将property属性展开,对于不同类型的结合,是用其对应的标签进行注入。

5、代码示例:

  在pom.xml中导入依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.test</groupId>
    <artifactId>spring02</artifactId>
    <version>1.0.0</version>

    <properties>
        <project.spring.version>5.0.0.RELEASE</project.spring.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${project.spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${project.spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${project.spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>${project.spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.20</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.10</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.38</version>
        </dependency>

    </dependencies>

    <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.xml</include>
                    <include>**/*.properties</include>
                </includes>
            </resource>
        </resources>
    </build>
</project>
pom.xml
@Setter
public class Student {
    private String name;
    private Integer age;
    private Date birthday;
    private Teacher teacher;
}
bean类1
@Setter
public class Teacher {
    private String name;
}
bean类2
@Setter
public class TestBean {
    private Set<String> set;
    private List<String> list;
    private String[] strrs;
    private Map<String,Student> map;
    private Properties prop;

    @Override
    public String toString() {
        return "TestBean{" +
                "set=" + set +
                ", list=" + list +
                ", strrs=" + Arrays.toString(strrs) +
                ", map=" + map +
                ", prop=" + prop +
                '}';
    }
}
bean类3
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class App {
    @Autowired
    private TestBean testBean;
    @Test
    public void testBean(){

        System.out.println(testBean);
    }
}
App测试类
<?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="student" class="com.test.test01_setter.Student">
        <!--简单类型对象赋值使用property的name和value即可-->
        <property name="age" value="22"/>
        <property name="birthday" value="2018/2/2"/>
        <property name="name" value="qq"/>
        <!--引用类型数据,使用property标签的ref属性,引用容器中已经存在的一个对象-->
        <property name="teacher" ref="teacher"/>
    </bean>

    <bean id="teacher" class="com.test.test01_setter.Teacher">
        <property name="name" value="rose"/>
    </bean>

    <bean id="testBean" class="com.test.test01_setter.TestBean">
        <!--为集合类型数据赋值,使用property标签,然后使用对应类型的各自的标签
            set集合使用set-value
            list集合使用list -value
            数组使用array-value
            map使用map-entry中的key-value,都写在标签里
            properties使用props-prop中的key,注意prop的值写在标签之间
        -->
        <property name="set">
            <set>
                <value>set1</value>
                <value>set1</value>
                <value>set1</value>
            </set>
        </property>
        <property name="list">
            <list>
                <value>list1</value>
                <value>list1</value>
                <value>list1</value>
            </list>
        </property>
        <property name="strrs">
            <array>
                <value>str1</value>
                <value>str1</value>
                <value>str1</value>
            </array>
        </property>
        <!--value-ref:为引用类型对象赋值,引用容器中已经存在的一个对象-->
        <property name="map">
            <map>
                <entry key="we" value-ref="student"></entry>
                <entry key="ww" value-ref="student"></entry>
            </map>
        </property>
        <property name="prop">
            <props>
                <prop key="prop">prop</prop>
                <prop key="prop1">prop</prop>
                <prop key="prop2">prop</prop>
            </props>
        </property>
    </bean>
</beans>
App-Context.xml

构造器注入

1、利用构造函数为对象中的属性注入值,需要在xml文件中手动配置

2、要求:对象中必须存在需要注入值的元素的构造函数。

3、如何配置?

  需要为对象中需要注入值的每个属性配置一个“constructor-arg”标签:<constructor-arg name='"/>

  其中name属性的值为构造函数中形参的名字,给属性注入值时需要确定属性的类型

4、对象的属性分为三种类型,不同的类型使用不同的注入方式

  1.简单数据类型(八大基本类型,String,BigDecimal,Date等),使用value。会自动进行类型转换。

  2.引用数据类型,使用ref。ref的值为Spring容器中已经存在的对象的名字。

  3.集合数据类型,需要将property属性展开,对于不同类型的结合,是用其对应的标签进行注入。

5、代码示例 pom.xml同上

public class Dog {

}
bean类1
public class People {
    private String name;
    private int age;
    private Dog dog;
    private Map<String,String> map;
    @Override
    public String toString() {
        return "People{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", dog=" + dog +",map="+map+
                '}';
    }

    public People(String name, int age, Dog dog,Map map) {
        this.name = name;
        this.age = age;
        this.dog = dog;
        this.map=map;
    }
}
bean类2
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class App {

    @Autowired
    private People people;
    @Test
    public void testPeople(){
        System.out.println(people);
    }
}
测试类
<?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="dog" class="com.test.test02_constructor.Dog"/>

    <!--构造函数设置参数的方法基本上与setter方法一致,只是property换成了constructor-arg-->
    <bean id="people" class="com.test.test02_constructor.People">
        <constructor-arg name="name" value="qq"/>
        <constructor-arg name="age" value="11"/>
        <constructor-arg name="dog" ref="dog"/>
        <constructor-arg name="map">
            <map>
                <entry key="ww" value="1234"/>
                <entry key="qq" value="1234"/>
            </map>
        </constructor-arg>
    </bean>
</beans>
App-Context.xml

 

推荐阅读