分层解耦&&IOC控制反转&&DI依赖注入

61 阅读2分钟

image.png

分层解耦

  • 内聚
    • 软件中各个功能模块内部的功能联系。
  • 耦合
    • 衡量软件中各个层/模块之间的依赖、关联程度。

程序中高内聚的体现:

  • EmpServiceA类中只编写了和员工相关的逻辑处理代码

image.png

程序中耦合代码的体现:

  • 把业务类变为EmpServiceB时,需要修改controller层中的代码 image.png

高内聚、低耦合的目的是使程序模块的可重用性、移植性大大增强。

image.png

IOC && DI 入门

image.png

那么如何解耦呢

注释掉 EmpServiceA 中的 @Component 新建 EmpServiceB 并且配置 @Component 就会自动配置了。

image.png

image.png

IOC详解

image.png

@Component

项目开发当中某一个类,不能归到 其它三类中,且还想把这个类交给IOC容器管理,就可以使用 @Component 注解 典型的是一些工具类。

bean 组件扫描 @ComponentScan

image.png

package com.itheima;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;


@ComponentScan({"dao","com.itheima"}) //手动设置组件扫描路径,一旦设置,则默认扫描路径失效,需要把默认的也加上
@SpringBootApplication //默认扫描当前包及其子包
public class SpringbootWebQuickstartApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootWebQuickstartApplication.class, args);
    }

}

image.png

DI详解

上一小节我们讲解了控制反转IOC的细节,接下来呢,我们学习依赖注解DI的细节。

依赖注入,是指IOC容器要为应用程序去提供运行时所依赖的资源,而资源指的就是对象。

在入门程序案例中,我们使用了@Autowired这个注解,完成了依赖注入的操作,而这个Autowired翻译过来叫:自动装配。

@Autowired注解,默认是按照类型进行自动装配的(去IOC容器中找某个类型的对象,然后完成注入操作)

入门程序举例:在EmpController运行的时候,就要到IOC容器当中去查找EmpService这个类型的对象,而我们的IOC容器中刚好有一个EmpService这个类型的对象,所以就找到了这个类型的对象完成注入操作。

那如果在IOC容器中,存在多个相同类型的bean对象,会出现什么情况呢?

image.png

  • 程序运行会报错

image.png

如何解决上述问题呢?Spring提供了以下几种解决方案:

  • @Primary
  • @Qualifier
  • @Resource

使用@Primary注解:当存在多个相同类型的Bean注入时,加上@Primary注解,来确定默认的实现。

image.png

使用@Qualifier注解:指定当前要注入的bean对象。 在@Qualifier的value属性中,指定注入的bean的名称。

  • @Qualifier注解不能单独使用,必须配合@Autowired使用

image.png

使用@Resource注解:是按照bean的名称进行注入。通过name属性指定要注入的bean的名称。

image.png

面试题 : @Autowird 与 @Resource的区别

  • @Autowired 是spring框架提供的注解,而@Resource是JDK提供的注解
  • @Autowired 默认是按照类型注入,而@Resource是按照名称注入

总结

image.png