Spring IOC的四种注入方式

区星
• 阅读 10855

1、IOC

1.1、IOC本质

控制反转(Inversion of Control),是一种设计思想,而依赖注入(DI)是一种实现的方法。原本对象的创建是依靠程序员来创建,通过依赖注入的方法来改造后,对象的创建是依赖IOC容器,对象的属性依赖IOC容器注入。
依赖注入:set注入
依赖:Bean对象的创建依赖容器
注入:Bean对象所有属性由容器注入

1.2、依赖注入的四种形式:

1.2.1、Set方式注入(Setter Injection)[重要]

Setter方法注入是容器通过调用无参构造器或无参static工厂 方法实例化bean之后,调用该bean的setter方法,即实现了基于setter的依赖注入。

package service;

import dao.UserDAO;

public class UserServiceImpl {
    private UserDAO userDAO;

    public void setUserDAO(UserDAO userDAO) {
        this.userDAO = userDAO;
    }

    public void getUser() {
        userDAO.getUser();
    }
}
package dao;

public class UserDAOImpl implements UserDAO {
    public void getUser() {
        System.out.println("userDAOImpl");
    }
}

XML配Bean代码

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns="http://www.springframework.org/schema/beans"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:c="http://www.springframework.org/schema/c"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="a" class="dao.UserDAOImpl"/>

    <bean id="hello" class="service.UserServiceImpl" >
        <property name="userDAO" ref="a"/>
    </bean>
 </beans>

测试代码

public class MyTest {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
        UserServiceImpl test = context.getBean("hello", UserServiceImpl.class);
        test.getUser();
    }
}

1.2.2、构造器注入(Constructor Injection)

构造器依赖注入通过容器触发一个类的构造器来实现的,该类有一系列参数,每个参数代表一个对其他类的依赖。
XML配Bean代码

<?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="userDaoImpl" class="dao.UserDAOImpl"/>
    <bean id="construct" class="ConstructDi.UserServiceImpl">
        <constructor-arg ref="userDaoImpl"/>
    </bean>
</beans>

测试代码

public class MyConstructTest {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("constructDiBean.xml");
        UserServiceImpl construct = context.getBean("construct", UserServiceImpl.class);
        construct.getUserDAO().getUser();
    }
}

1.2.3、注解方式

@Autowired默认按类型装配
@Qualifier和Autowired配合使用,指定bean的名称
@Resource默认按名称装配,当找不到与名称匹配的bean时,才会按类型装配。

例子:人有狗和猫,两种宠物通过不同的方式注入。
三个实体类分别为:人、猫、狗

package pojo;

@Component
public class People {
    @Autowired
    @Qualifier("cat")
    Cat cat;
    @Resource
    Dog dog;


    public Cat getCat() {
        return cat;
    }

    public Dog getDog() {
        return dog;
    }

    @Override
    public String toString() {
        return "People{"
                +" cat=" + cat.name +
                ", dog=" + dog.name +
                '}';
    }
}
package pojo;

@Component
public class Cat {
    public String name="catName";

    public void shout(){
        System.out.println("Cat shout!");
    }
    public String getName() {
        return name;
    }

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

import org.springframework.stereotype.Component;

@Component
public class Dog {
    String name="dogName";

    public void shout(){
        System.out.println("Dog shout!");
    }
    public String getName() {
        return name;
    }

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

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:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

    <context:component-scan base-package="pojo"/>
    <context:annotation-config/>
</beans>

测试的代码

public class MyTest {
    @Test
    public void test3(){
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
        People people = context.getBean("people", People.class);
        people.getCat().shout();
        people.getDog().shout();
        System.out.println(people.toString());
    }
}

结果:
Cat shout!
Dog shout!
People{ cat=catName, dog=dogName}

1.2.4、接口注入(Interface Injection)[已废弃]

public class ClassA {  
  private InterfaceB clzB;  
  public void doSomething() {  
    Ojbect obj = Class.forName(Config.BImplementation).newInstance();  
    clzB = (InterfaceB)obj;  
    clzB.doIt();   
  } 
本人学识有限,如果有错,欢迎指出。
点赞
收藏
评论区
推荐文章
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Easter79 Easter79
3年前
spring核心思想:IOC(控制反转)、DI(依赖注入)和AOP(面向切面编程)
Spring有三大核心思想,分别是控制反转(IOC,InversionOfController),依赖注入(DI,DependencyInjection)和面向切面编程(AOP,AspectOrientedProgramming)。控制反转(IOC,InversionOfController)控制反转不是什么技术,而是一种设计思
Easter79 Easter79
3年前
SpringIOC官方文档解读
IoC容器本章介绍了Spring的控制反转(IoC)容器。1.1。SpringIoC容器和Bean简介本章介绍了反转控制(IoC)原则的Spring框架实现。IoC也称为依赖注入(DI)。在此过程中,对象可以通过①构造函数参数(),②工厂方法的参数③或在构造或从工厂方法返回后在对象实例上设置的属性来定义其依
Stella981 Stella981
3年前
Spring Ioc之BeanFactory
   IoC(InversionofControl),即所谓的控制反转,就是应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部容器(BeanFactory)负责的。   Spring通过配置文件(或者注解、JavaConfig)描述Bean和Bean之间的依赖关系,利用反射机制实例化Bean并建立Bean之间的依赖关系。Spr
Easter79 Easter79
3年前
Spring简介,搭建Spring环境——轻量级容器框架(一)
Spring是什么?      Spring是一个集成了许多第三方框架的大杂烩,其核心技术是IOC(控制反转,也称依赖注入)和AOP(面向切面编程),所以spring既是一个IoC容器,也是一个AOP框架。知道了什么是Spring是学习的开端,下面说一下为什么使用Spring。为什么使用Spring?
Easter79 Easter79
3年前
Spring系列(五) 容器初始化过程源码
IoC/DI的概念容器是Spring的核心之一(另一个核心是AOP).有了容器,IOC才可能实现.什么使IoC?IoC就是将类自身管理的与其由依赖关系的对象的创建/关联和管理交予容器实现,容器按照配置(比如xml文件)来组织应用对象的创建和关联.什么使DI?DI是IoC的实现方式,由容器
Easter79 Easter79
3年前
Spring常用知识点总结
1\.Spring有哪些优点?  轻量级:Spring在大小和透明性方面绝对属于轻量级的,基础版本的Spring框架大约只有2MB。  控制反转(IOC):Spring使用控制反转技术实现了松耦合。依赖被注入到对象,而不是创建或寻找依赖对象。  面向切面编程(AOP): Spring支持面向切面编程,同时把应用的业务逻辑与系统的服务分离开来
Wesley13 Wesley13
3年前
JAVA日常记录
11.IOC的优点是什么IOC(InversionofControl)控制反转,将控制权(创建对象和对象之间的依赖关系的权利)交给spring容器。接口驱动设计(InterfaceDrivenDesign)的好处,可以灵活提供不同的子类实现(其实就是解耦),提高程序的灵活性、可扩展性和可维护性。IOC模式将耦合代
Easter79 Easter79
3年前
Spring源码阅读——3
SpringIoC容器1、IoC容器概述控制反转、IoC容器、依赖注入控制反转:不是什么技术,而是一种设计思想。Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。IoC容器:IoC容器控制了对象的
Easter79 Easter79
3年前
Spring的IOC逐层深入——源码解析之IoC的根本BeanFactory(五)
什么是IoC    IoC容器,最主要的就是完成对象的创建以及维护对象的依赖关系等。    所谓控制反转,包括两部分:一是控制,二是反转,就是把传统方式需要由代码来实现对象的创建、维护对象的依赖关系,反转给容器来帮忙管理和实现。所以我们必须要创建一个容器,同时需要一种描述来让容器创建对象与对象的关系。    Io
小万哥 小万哥
1年前
深入理解 Spring IoC 和 DI:掌握控制反转和依赖注入的精髓
概述在本文中,我们将介绍IoC(控制反转)和DI(依赖注入)的概念,以及如何在Spring框架中实现它们。什么是控制反转?控制反转是软件工程中的一个原则,它将对象或程序的某些部分的控制权转移给容器或框架。我们最常在面向对象编程的上下文中使用它。与传统编程相
区星
区星
Lv1
如来者,无所从来,亦无所去,故名如来。
文章
5
粉丝
0
获赞
0