Spring--IOC控制反转与DI依赖注入的三种方式

Spring--IOC控制反转与DI依赖注入的三种方式

  • 1. setter方法注入
  • 2.构造器注入
  • 3.接口注入

Spring的核心思想是IOC和AOP,IOC即控制反转,包括依赖注入和依赖查找,最主要使用的即依赖注入DI。通常情况下,我们创建对象时,是通过new关键字主动进行的;而DI则是在创建对象时,只设置配置文件,由Spring统一创建对象并调用。这也就是控制反转的由来。

接下来本文将重点介绍依赖注入的三种方式

本文使用maven创建工程,pom.xml中依赖设置如下

 <dependencies>
            
            <dependency>
                <groupId>org.springframeworkgroupId>
                <artifactId>spring-coreartifactId>
                <version>5.2.8.RELEASEversion>
            dependency>
            
            <dependency>
                <groupId>org.springframeworkgroupId>
                <artifactId>spring-beansartifactId>
                <version>5.2.8.RELEASEversion>
            dependency>
            
            <dependency>
                <groupId>org.springframeworkgroupId>
                <artifactId>spring-contextartifactId>
                <version>5.1.10.RELEASEversion>
            dependency>
            <dependency>
                <groupId>org.springframeworkgroupId>
                <artifactId>spring-context-supportartifactId>
                <version>5.1.10.RELEASEversion>
            dependency>
        dependencies>

1. setter方法注入

假设我们要实现一个人吃水果的功能,人是一个对象,水果也是一个对象,人具有姓名等属性,水果也具有品种等属性。
(1)我们在src/main/java/bean下创建水果类Fruit.java

public class Fruit {
    private String name;
    private String color;
    private String taste;
public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getColor() {
            return color;
        }

        public void setColor(String color) {
            this.color = color;
        }

        public String getTaste() {
            return taste;
        }

        public void setTaste(String taste) {
            this.taste = taste;
        }
         public void show(){

        System.out.println(name+"  "+color+"  "+taste);

    }
}

Fruit具有品种,颜色和口味三种属性,给予getter 和setter方法,并创建show()方法展示品种、颜色和口味。

(2)在src/main/java/bean下创建人类Person.java

public class Preson {
    private String name;
    private TestFruit fruit;
    public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public TestFruit getFruit() {
            return fruit;
        }

        public void setFruit(TestFruit fruit) {
            this.fruit = fruit;
        }
    public void eat(){
        System.out.println(name);
        fruit.show();

    }
}

人类具有姓名这个属性,给予getter和setter方法,在eat()函数中输出人的姓名和水果的信息。

(3)在src/main/resources下创建applicationContext.xml配置文件


<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="fruit" class="bean.Fruit">
            <property name="name" value="香蕉">property>
            <property name="color" value="黄色">property>
            <property name="taste" value="">property>
    bean>
    <bean id="person" class="bean.Preson">
       <property name="fruit" ref="fruit">property>
        <property name="name" value="小明">property>
    bean>
beans>

如果你要把一个引用传递给一个对象,那么你需要使用 标签的 ref 属性,而如果你要直接传递一个值,那么你应该使用 value 属性。

(4)在src/main/java下创建Test测试类进行测试

public class Test {
    public static void main(String[] args) {
        //读取配置文件
        ClassPathXmlApplicationContext  app=new ClassPathXmlApplicationContext("applicationContext.xml");
        Preson pr= (Preson) app.getBean("person");
        pr.eat();
    }
}

输出结果为

小明
香蕉 黄色 甜

2.构造器注入

假设我们同样要实现一个人吃水果的功能,人是一个对象,水果也是一个对象,人具有姓名等属性,水果也具有品种等属性。
(1)我们在src/main/java/bean下创建水果类Fruit.java,此时不设置getter和setter方法,而是给予全参的构造函数

public class TestFruit {
    private String name;
    private String color;
    private String taste;

    public TestFruit(String name, String color, String taste) {
        this.name = name;
        this.color = color;
        this.taste = taste;
    }

    public void show(){

        System.out.println(name+"  "+color+"  "+taste);

    }
}

给予全参的构造方法并创建show()方法展示品种、颜色和口味。

(2)在src/main/java/bean下创建人类Person.java

public class Preson {
    private String name;
    private TestFruit fruit;
    
    public Preson(String name, TestFruit fruit) {
        this.name = name;
        this.fruit = fruit;
    }
    
    public void eat(){
        System.out.println(name);
        fruit.show();
    }
}

给予人类全参的构造函数,在eat()函数中输出人的姓名和水果的信息。

(3)在src/main/resources下创建applicationContext.xml配置文件
在属性配置时不使用而使用


<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="fruit" class="bean.fruit">
            <constructor-arg name="name" value="香蕉">constructor-arg>
            <constructor-arg name="color" value="黄色">constructor-arg>
            <constructor-arg name="taste" value="">constructor-arg>
    bean>
    <bean id="person" class="bean.Preson">
        <constructor-arg name="name" value="小明">constructor-arg>
        <constructor-arg name="fruit" ref="fruit">constructor-arg>
    bean>
beans>

如果你要把一个引用传递给一个对象,那么你需要使用 标签的 ref 属性,而如果你要直接传递一个值,那么你应该使用 value 属性。

(4)在src/main/java下创建Test测试类进行测试

public class Test {
    public static void main(String[] args) {
        //读取配置文件
        ClassPathXmlApplicationContext  app=new ClassPathXmlApplicationContext("applicationContext.xml");
        Preson pr= (Preson) app.getBean("person");
        pr.eat();
    }
}

输出结果同样为

小明
香蕉 黄色 甜

3.接口注入

接口注入模式因为具备侵入性,它要求组件必须与特定的接口相关联,因此并不被看好,实际使用有限,本文不做实例研究,仅了解即可

你可能感兴趣的:(Java,spring,maven,ioc,java)