Spring 依赖注入的方法(基于xml配置)

Spring 依赖注入的方法(基于xml配置)

前言

Spring依赖注入的方法有三种:

  1. 属性注入(setter方法注入)
  2. 构造函数注入(入参方式有所差异)
  3. 工厂方法注入(静态方法和非静态方法)

Spring依赖注入原理:是利用Java的反射机制

注: Spring可以注入类实现所需要的外部资源,实例主要注入的是属性,所有的实例都可以在idea上运行测试,文章末尾附了一些maven工程结构和配置

属性注入(set注入)

属性注入条件:类中有默认的构造方法(即无参构造方法),有属性对应的setter方法。
实例:(在Animal类中生成setter方法)

public class Animal {
    private String name;
    private String food;
    public void printAnlimal(){
        System.out.println(name + "吃" + food);
    }
    /*java类中如果没有构造方法会自动生成默认的无参构造方法, 如果有带参数
    的构造方法,Java类就不会自动生成默认构造方法,就需要手动创建无参构造方法*/
    public void setName(String name) {
        this.name = name;
    }

    public void setFood(String food) {
        this.food = food;
    }
}

xml中的bean的配置

<!--bean的id不可以相同,否则在后定义的bean会覆盖之前的bean-->
<bean id="cat" class="com.ddpapa.springIoC.Animal">
        <property name="name"><value>猫</value></property>
        <property name="food"><value>老鼠</value></property>
</bean>

构造函数注入

通过类的有参构造方法注入属性值。
实例

package com.ddpapa.springIoC;

public class Animal {
    private String name;
    private String food;
    private String animalType;
    public void printAnlimal(){
        System.out.println(name + "吃" + food);
    }
    public Animal(String name, String food) {
    //有参构造方法
        this.name = name;
        this.food = food;
    }
}

xml中的配置

<!--1.参数类型匹配-->
    <bean id="cat" class="com.ddpapa.springIoC.Animal">
        <constructor-arg type="java.lang.String">
            <value>猫</value>
        </constructor-arg>
        <constructor-arg type="java.lang.String">
            <value>老鼠</value>
        </constructor-arg>
    </bean>
<!--2.索引匹配-->
    <bean id="cat" class="com.ddpapa.springIoC.Animal">
        <constructor-arg index="0">
            <value>猫</value>
        </constructor-arg>
        <constructor-arg index="1">
            <value>老鼠</value>
        </constructor-arg>
    </bean>
<!--3.类型索引联合匹配-->
    <bean id="cat" class="com.ddpapa.springIoC.Animal">
        <constructor-arg index="0" type="java.lang.String">
            <value>猫</value>
        </constructor-arg>
        <constructor-arg index="1" type="java.lang.String">
            <value>老鼠</value>
        </constructor-arg>
    </bean>

工厂方法注入

  • 非静态方法

Animal的工厂类

package com.ddpapa.springIoC;

public class AnimalFactory {
    public Animal creatAnimal(){
        //利用构造方法注入animal 的属性
        Animal cat = new Animal("猫","老鼠");
        return cat;
    }
}

xml中配置

<!--animal的工厂方法不是静态的,要先实例化工厂才能使用工厂方法;
在xml中需要先配置animalFactory的bean,再指定工厂方法-->
<bean id="animalFactory" class="com.ddpapa.springIoC.AnimalFactory"/>
<bean id="cat" factory-bean="animalFactory" factory-method="creatAnimal"/>
  • 静态方法
    animal的静态工厂方法
package com.ddpapa.springIoC;

public class AnimalFactory {
    public static Animal creatAnimal(){
        //利用构造方法注入animal 的属性
        Animal cat = new Animal("猫","老鼠");
        return cat;
    }
}

xml中的配置

<!--无需配置工厂bean指定工厂类和工厂方法-->
<bean id="cat" class="com.ddpapa.springIoC.AnimalFactory" factory-method="creatAnimal"/>

附件

  • maven工程结构

扫描二维码关注公众号,回复: 7941513 查看本文章
  • pom.xml配置spring所需要的依赖文件:
<?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.ddpapa</groupId>
    <artifactId>springIoC</artifactId>
    <version>1.0</version>
    <name>SpringIoCAndDI</name>
    <dependencies>

        <!-- spring 依赖-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>RELEASE</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>

    <properties>
        <file.encoding>UTF-8</file.encoding>
        <spring.version>4.2.2.RELEASE</spring.version>
    </properties>
</project>
  • Animal类:
package com.ddpapa.springIoC;

public class Animal {
    private String name;
    private String food;
    public void printAnlimal(){
        System.out.println(name + "吃" + food);
    }
}
  • 测试类:
package com.ddpapa.springIoC;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class IoCtest {

    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("springIoC.xml");
        Animal cat = ctx.getBean("cat",Animal.class);
        cat.printAnlimal();
    }
}
  • Spring的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"
        xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
                            http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
                            http://www.springframework.org/schema/aop
                            http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
                            http://www.springframework.org/schema/context 
                            http://www.springframework.org/schema/context/spring-context-4.0.xsd">
</beans>

猜你喜欢

转载自www.cnblogs.com/ddpapa/p/11912488.html