JavaWeb笔记——三层架构、IOC、DI

JavaWeb笔记——三层架构、IOC、DI

  • 一、三层架构:Dao->Service->Controller
    • 1.1 理论
    • 1.2 idea实例
  • 二、分层解耦
    • 2.1 概念
    • 2.2 入门的IOC和DI方法——控制反转@Component和依赖注入@Autowired
  • 三、进阶IOC——@Repository && @Service && @Controller && @ComponentScan
  • 四、进阶DI——@Primary && @Autowired+@Qualifier("bean名称") && @Resource(name="bean名称")


黑马程序员2023版本javaweb网课笔记,自用


一、三层架构:Dao->Service->Controller

1.1 理论

  1. 图示
    JavaWeb笔记——三层架构、IOC、DI_第1张图片
  2. 意义:将三个构架分开,并且dao层和service层使用接口,增加灵活性和复用性以及便于维护扩展。

1.2 idea实例

  1. 三层结构:三个软件包:dao层、service层和controller层, 实体类一般也会有单独的软件包pojo。
  2. dao层和service层为保证灵活性,需要先写接口文件,再在impl软件包下实现具体功能类
  3. service层和controller层创建低一层的数据变量来调用方法。
    JavaWeb笔记——三层架构、IOC、DI_第2张图片
  4. dao层:

dao层:加载解析数据文件,返回获取的数据。

1)接口EmpDao:

public interface EmpDao {
        //获取员工列表数据
        public List<Emp> listEmp();
}

2)实现类EmpDaoA:

public class EmpDaoA implements EmpDao {
    public EmpDaoA() {
    }

    public List<Emp> listEmp() {
        //加载并解析数据,可以是数据库内的
        //此处省略
        return empList;//返回读到的数据列表
    }
}
  1. service层:

service层:在实现类中创建私有的dao类属性变量empDao;在具体方法中调用函数获取Dao层数据

1)接口EmpService:

public interface EmpService {
    //获取员工列表数据
    public List<Emp> listEmp();
}

2)实现类:

public class EmpServiceA implements EmpService {
    private EmpDao empDao = new EmpDaoA();//创建接口变量,获取dao层的数据
    
    public EmpServiceA() {
    }

    @Override
    public List<Emp> listEmp() {
        //调用empDao获取数据
        List<Emp> empList = this.empDao.listEmp();
        //对数据就行逻辑转换处理
        //此处省略
        return empList;

    }
}

  1. Controller层:

Controller层:在实现类中创建私有的serivce类属性变量empService;在具体方法中调用函数获取Service层结果。不要忘了注释@RestController!!!

1)实现类EmpController:

@RestController
public class EmpController {
    private EmpService empService = new EmpServiceA();//创建service接口对象

    @RequestMapping("/listEmp")
    public Result list(){
        //调用service类的方法
        List<Emp> empList = this.empService.listEmp();
        //返回响应的结果
        return Result.success(empList);
    }
}

二、分层解耦

2.1 概念

  1. 内聚:软件中各个功能模块内部的功能联系。例如,读取员工列表的方法,内部只处理员工数据,不处理其他数据。

  2. 耦合:衡量软件中各个层/模块之间的依赖、关联的程度。例如,service层和controller层会创建低一层的属性变量用于方法调用。
    JavaWeb笔记——三层架构、IOC、DI_第3张图片

  3. 软件设计原则:高内聚低耦合,尽量做到不耦合。

  4. 低耦合实例分析:如下,new的类指定为EmpDaoA,再切换其他类时需要修改代码。希望有容器管理接口EmpService下的所有实现类。

 private EmpDao empDao = new EmpDaoA();//创建接口变量,获取dao层的数据

JavaWeb笔记——三层架构、IOC、DI_第4张图片

  1. 控制反转: Inversion Of Control,简称IOC。对象的创建控制权由程序自身转移到外部(容器),容器控制对象创建,这种思想称为控制反转。
  2. 依赖注入: Dependency Injection,简称DI。容器为应用程序提供运行时,所依赖的资源,称之为依赖注入。
  3. Bean对象:IOC容器中创建、管理的对象,称之为bean。

2.2 入门的IOC和DI方法——控制反转@Component和依赖注入@Autowired

  1. 控制反转——Service层 及 Dao层的实现类,交给IOC容器管理:在对应的实现类增加@Component。
    JavaWeb笔记——三层架构、IOC、DI_第5张图片
  2. 依赖注入——为Controller及Service注入运行时,依赖的对象:在对应的创建对象上,删除new实现类的部分,增加注释@Autowired。
    JavaWeb笔记——三层架构、IOC、DI_第6张图片

三、进阶IOC——@Repository && @Service && @Controller && @ComponentScan

  1. 注解:常用衍生注解,当某一bean对象不能归为三层之一时,可以使用@Component。其中,Controller层的@RestController包含@Controller可以不写。
@RestController = @Controller + @ResponseBody ;

JavaWeb笔记——三层架构、IOC、DI_第7张图片

  1. bean的名称:默认是class类名首字母小写(如下例不声明value时,名称是empServiceA),或者调用value属性命名,一般不用指定
    JavaWeb笔记——三层架构、IOC、DI_第8张图片
  2. 如果Dao层、Service层和Controller层的软件包,均在声明了@SpringBootApplication的启动类所在包及其子包下,则不需要显示声明@ComponentScan。否则需要显式声明。
    1)原因:声明bean的四大注解,要想生效,还需要被组件扫描注解@ComponentScan扫描。@ComponentScan注解虽然没有显式配置,但是实际上已经包含在了启动类声明注解 @SpringBootApplication 中,默认扫描的范围是启动类所在包及其子包。
    2)并不推荐显式声明!!!应该按照规范将三个构架的软件包防止在启动类所在包及其子包下!!!
    3)显式声明方法:
    JavaWeb笔记——三层架构、IOC、DI_第9张图片

四、进阶DI——@Primary && @Autowired+@Qualifier(“bean名称”) && @Resource(name=“bean名称”)

  1. 问题:当使用注释@Autowired自动依赖注入时,默认按照类型注入,如果同一层有多个同类型的控制反转注释,则在装配时会出现如下报错。
    JavaWeb笔记——三层架构、IOC、DI_第10张图片
  2. 原因:@Autowired注解,默认是按照类型进行,如果存在多个相同类型的bean,将会报出如上错误。
  3. 共有三个解决方案:
    1)@Primary设置优先级:针对实现类,在需要优先显式的实现类之前增加该注释;
	@Primary
	@Service

JavaWeb笔记——三层架构、IOC、DI_第11张图片
2)@Qualifier指定执行的bean对象名称,注意bean名称默认是类名首字母小写针对创建对象,和注释@Autowired一起使用

    @Autowired
    @Qualifier("empServiceA")

JavaWeb笔记——三层架构、IOC、DI_第12张图片
3)@Resource指定执行的bean对象名称:针对创建对象,单独使用,该注释来源于javax,与前两个springframework的来源不同

@Resource(name="empServiceA")

在这里插入图片描述
JavaWeb笔记——三层架构、IOC、DI_第13张图片

  1. 面试理论题: @Resource 与 @Autowired区别:
    1)@Autowired 是spring框架提供的注解,而@Resource是JDK提供的注解。
    2)@Autowired 默认是按照类型注入,而@Resource默认是按照名称注入。

你可能感兴趣的:(java笔记,笔记,架构)