Spring 分层解耦 学习笔记

qaq 面向注解编程真难学

三层架构

  • Controller:控制层。接收请求,响应数据
  • Service:业务逻辑层。处理具体的业务逻辑
  • Dao:数据访问层(Data Access Object)(持久层),负责数据访问操作

分层解耦

  • 控制反转(IOC)(Inversion Of Control):对象的创建控制权由程序自身转移到外部(容器)
  • 依赖注入(DI)(Dependency Injection):容器为应用程序提供运行时所依赖的资源
  • Bean对象:IOC容器中创建、管理的对象
@Component//将当前类交给IOC容器管理,成为IOC容器中的bean
public class EmpServiceA implements EmpService {
    @Autowired//运行时,IOC容器会提供这个类型的bean对象,并赋值 - 依赖注入
    private EmpDao empDao;
    
    ...
}

Bean的声明

  • @Component:不属于下面三类的时候用
  • @Controller:标注在控制器类上
  • @Service:标在业务类上
  • @Repository:标在数据访问类上

注意:

  • 声明bean的时候,可以通过value属性指定bean的名字,没指定的话默认为类名首字母小写
  • springboot集成web开发的时候,声明控制类bean只能用@Controller

组件扫描

  • 声明的注解,需要被组件扫描注解@ComponentScan扫描才会生效

  • @ComponentScan注解没有显示配置,实际上已经包含在启动类声明注解@SpringBootApplication,默认扫描范围是启动类所在包及其子包

  • 可以自行声明注解@ComponentScan来管理扫描路径(不推荐)

    • 在启动类前加@ComponentScan({"dao","com.hxy"})
    • 因为会把默认的取代,所以需要加上原来的包

Bean注入

  • @Autowired默认按照类型注入,若存在多个相同类型的bean,会报错

  • 解决

    • @Primary 加在想要生效的类前

      @Primary
      @Service
      public class EmpServiceA implements EmpService {
          //...
      }
    • @Qualifier 加在@Autowired前,类名首字母小写

      @Autowired
      @Qualifier("empServiceA")
      private EmpService empService;
    • @Resource 加载要注入的位置,替换@Autowired ,按照名称注入

      @Resource(name = "empServiceB")
      private EmpService empService;
img_show