IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> spring 认证--2--Spring DI--依赖注入/IOC-DI解耦 -> 正文阅读

[Java知识库]spring 认证--2--Spring DI--依赖注入/IOC-DI解耦

一 依赖注入

1 什么是依赖注入

?

2 @Bean注入

? Spring IOC容器提供了依赖注入功能,可以将一个组件依赖的对象,在使用之前注入到合适位置.比如,如下关系模拟了光头强砍树时依赖电锯.

? Spring IOC 解决依赖注入,在配置类Config中为Bean组件初始化方法增加参数,Spring IOC 容器会在初始化时,自动根据类型注入Bean组件对象,解决"依赖注入"问题:

2.1 测试@Bean组件注入的作用:

第一步:新创建spring2工程,pom文件添加依赖

 <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.2.RELEASE</version>
        </dependency>
        <!--JUnit-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13</version>
            <scope>test</scope>
        </dependency>
        <!---->
        <dependency>
            <groupId>javax.annotation</groupId>
            <artifactId>javax.annotation-api</artifactId>
            <version>1.3.2</version>
        </dependency>
    </dependencies>

第二步: 分别在demo包下创建工具类和工人类,

package cn.tedu.demo;

import java.io.Serializable;

public class Saw implements Serializable {
    private String name = "寒冰锯";

    @Override
    public String toString() {
        return name;
    }
}
package cn.tedu.demo;

import java.io.Serializable;

public class Worker implements Serializable {
    private String name = "光头强";

    public Saw saw;

    public void work(){
        System.out.println(name+"使用"+saw+"砍树");
    }
}

第三步:编辑配置类,使用@Bean依赖注入,是两者产生联系

package cn.tedu.context;

import cn.tedu.demo.Saw;
import cn.tedu.demo.Worker;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class Config {

    @Bean
    public Saw saw(){
        return new Saw();
    }
    /*Spring 会自动根据变量类型匹配Bean组件的类型
    * 若匹配成功,就将Bean组件注入到方法参数中*/
    @Bean
    public Worker worker(Saw s){//参数类型要匹配正确
        Worker worker = new Worker();
        worker.saw=s;
        return worker;
    }
}

第四步:test包下创建测试类,控制台查看结果

package cn.tedu.test;

import cn.tedu.context.Config;
import cn.tedu.demo.Worker;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class TestCase {
    AnnotationConfigApplicationContext ctx;
    @Before//初始化
    public void init(){
        ctx =new AnnotationConfigApplicationContext(Config.class);
    }

    @After//销毁方法
    public void destroy(){
        ctx.close();
    }

    @Test
    public void testWorker(){
        Worker worker = ctx.getBean("worker", Worker.class);
        worker.work();//光头强使用寒冰锯砍树
    }
}

2.2 Spring IOC组件注入时组件自动匹配通过类型和Bean Id匹配

?

?

3 @Autowired 自动装配(布线)

Spring 提供的组件扫描功能,在扫描时也可以完成依赖注入,这样可以减少编码提高编程效率

如何使用@Autowired?注入到对象属性上和注入到set方法上,看情况使用!!!

以下练习注入到对象属性上:

?第一步:创建新工程spring03,复制spring2的src包,分别编辑工具类和工人类,配置类添加包扫描组件

?

?第二步:测试类不变,进行测试,结果还是一样,所以,添加组件扫描和依赖注入,能够减少代码并提高编程效率

4? ?set方法注入(Bean属性注入)

?

?

@Autowired注入到set方法上:具有一定的逻辑

第一步:其他都不变,编辑worker类

?第二步:进行测试set方法注入的效果:

二? IOC/DI 解耦

1 利用IOC/DI依赖注入接口解耦

?

?

?第一步:创建新项目spring4,编辑pom.xml文件添加版本依赖

 <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.2.RELEASE</version>
        </dependency>
        <!--JUnit-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13</version>
            <scope>test</scope>
        </dependency>
        <!---->
        <dependency>
            <groupId>javax.annotation</groupId>
            <artifactId>javax.annotation-api</artifactId>
            <version>1.3.2</version>
        </dependency>
    </dependencies>

?第二步:cn.tedu.demo包下创建Tool工具接口

package cn.tedu.demo;
/*抽象的工具类型*/
public interface Tool {
}

第三步:创建工人类,电锯类和斧子类

package cn.tedu.demo;

import org.springframework.stereotype.Component;

@Component//组件扫描,交给spring创建对象
public class Axe implements Tool{
    private String name = "开天斧";

    @Override
    public String toString() {
        return name;
    }
}
package cn.tedu.demo;
//没有加组件扫描,就不会被spring创建对象
public class Saw implements Tool{
    private String name="寒冰锯";

    @Override
    public String toString() {
        return name;
    }
}
package cn.tedu.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class Worker implements Serializable{
    private String name= "光头强";

    @Autowired//接口的依赖注入
    private Tool tool;

    public void work(){
        System.out.println(tool);
        System.out.println(tool == null);
        System.out.println(name+"使用"+tool+"砍树");
    }
}

第四步:创建配置类,用于扫描包

package cn.tedu.context;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan("cn.tedu.demo")//配置类扫描包,spring为其包下的类创建对象
public class Config {
}

第五步:创建测试类:

package cn.tedu.test;

import cn.tedu.context.Config;
import cn.tedu.demo.Worker;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class TestCase {

    AnnotationConfigApplicationContext ctx;
    @Before//初始化
    public void init(){
        ctx = new AnnotationConfigApplicationContext(Config.class);
    }

    @After//销毁
    public void destroy(){
        ctx.close();
    }

    @Test //测试接口解耦
    public void testWorker(){
        Worker worker = ctx.getBean("worker", Worker.class);
        worker.work();

    }
}

控制台:

?第六步:如果想使用电锯类,就要把@Component添加到电锯类上,去掉斧子类的@Component组件扫描

?第七步:测试

?2 @Autowried 注入规则

?

当电锯类和斧子类都加了@Component组件扫描时:

方案1:? 需要自定义组件ID

?第一步:如果使用斧子类,就自定义组件ID,使其能被识别

?测试结果:

?第二步:如果使用电锯类,自定义组件ID,注意,斧子类上的自定义组件ID就要删除

?测试结果:

?方案2:利用注解@Qualifier("Bean ID") 指定注入bean组件的id

假如想使用电锯,就要在依赖注入接口再添加@Qualifier("saw"),指定使用电锯对象

?同样,想使用斧子,就要在依赖注入接口再添加@Qualifier("axe"),指定使用斧子对象

总结

这两种方案能解决冲突,但实际开发当中用处并不多,而是尽量采用类型注入,默认值注入等更方便的方法,保证一个组件一个类型

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-09-08 10:32:21  更:2021-09-08 10:36:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/31 7:51:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码