• Web开发三层架构


    ##Controller Service Dao(mapper)

    在这里插入图片描述

    软件设计:高内聚 低耦合

    Controller 调用Service, Service调用 DAO 模块之间耦合
    在这里插入图片描述

    如果要从EmpServiceA切换到EmpServiceB,Controller代码也要修改

    new EmpServiceB
    在这里插入图片描述

    分层接耦

    容器中放EmpServiceA, Controller需要对象去容器中找
    如果要将实现类由EmpServiceA 切换为EmpServiceB,可以基于B对象在容器中创建一个对象,即使Service中实现类发生变化,Controller代码也不需要改动

    在这里插入图片描述

    1.对象怎么交给容器管理

    ①类交给IOC容器管理,在类上加注解 @Component
    在这里插入图片描述

    2.容器怎么为程序提供依赖的资源

    ②Controller需要 empservice对象,给empService加上@Autowired注解

    在这里插入图片描述

    在这里插入图片描述
    此时如果要切换实现类:EmpServiceA 切换到EmpServiceB,将A上面的 //@Component注释掉就可以

    保留EmpServiceB上的@Component

    Java中的Bean

    Controller Service Repository 将对象交给IOC容器管理,默认封装了Component注解

    不能用上面三个注解标识,就交给Component,典型的使用场景是工具类

    在这里插入图片描述

    • 申明Bean时候,可以通过注解中的value属性指定Bean的名字,没有指定Value属性,Bean名字默认类名首字母小写
    • 在这里插入图片描述

    Bean的组件扫描

    申明一个Bean,不一定会生效,设计到组件扫描的问题
    在这里插入图片描述

    在这里插入图片描述

    启动类自动加上了组件扫描注解,默认扫描范围是启动类所在包及其子包,如果有些Bean不在这个目录下,启动会失败,b比如dao代码

    在这里插入图片描述

    在这里插入图片描述

    解决方法:自己加上ComponentScan(不推荐)
    推荐:将所写的代码全部放到启动类及其子包下面
    在这里插入图片描述

    依赖注入

    • ① AutoWired

    有两个EmpService的Bean,EmpServiceA,EmpServiceB:使用哪个?
    程序启动时就报错:

    在这里插入图片描述

    解决方法:

    (1)@Primary 设置优先级,想要哪个Bean生效,就在哪个Bean上加@Primary
    在这里插入图片描述

    (2)@Autowired配合@Qualifier(“empServiceA”), 加上bean的名字,默认类名首字母小写

    Autowired默认按照类型注入

    在这里插入图片描述

    @Resource默认按照名称注入

    jdk提供的
    在这里插入图片描述

  • 相关阅读:
    解决了一个困扰了我2天的问题
    前端面试题集锦(5)
    Android 12.0 SystemUI下拉状态栏定制化之隐藏下拉通知栏布局功能实现(二)
    Google Earth Engine(GEE)——墨累全球潮汐湿地变化 v1 (1999-2019) 数据集
    电脑重装系统Win10关闭网速限制的方法
    yolov8目标检测-onnx模型推理
    EDAS 是什么
    交换机和路由器技术-32-命名ACL
    Guava Cache的使用方式
    SkyWalking实现服务链路追踪
  • 原文地址:https://blog.csdn.net/weixin_43692030/article/details/138868431