实现springboot分层解耦技术
(原创) springboot实现分层解耦的方案 😄
1. 分层解耦的好处
- 解决代码复用性差,难以维护的缺点。
- 提高代码的可读性,便于维护。
- 提高代码的扩展性,便于扩展。
2. 分层解耦的实现之三层架构分层
- 控制层controller:负责与前端交互,接收前端的请求,调用业务层处理请求,将处理结果返回给前端。
- 业务逻辑层service:负责处理业务逻辑,调用持久层获取数据。
- 数据访问层(持久层)Dao:负责数据库访问操作,包括数据的增删改查操作
3. 分层解耦的实现之三层架构解耦
-
定义理解
- 内聚:
- 软件中各个功能模块内部的功能联系。
- 耦合:
- 衡量软件中各个模块之间的依赖、关联的程度。
- 控制反转:
- (Inversion Of Control & IOC) 对象的创建控制权由程序自身转移到外部(容器),这种思想叫做控制反转。
- 依赖注入:
- (Dependency Injection & DI) 容器为应用程序提供运行时,所依赖的资源,叫做依赖注入。
- Bean对象:
- IOC容器中创建、管理的对象,叫做bean。
- 内聚:
个人对IOC和DI的几点理解:
- 在三层架构中,为了降低代码各个模块的依赖关联度,将各层中对象的创建、管理、依赖注入等操作都交给IOC容器来完成,各层之间通过IOC容器提供的接口来获取所需要的对象,从而实现各层之间的解耦。
- IOC容器相当于房地产中介,买房者和卖房者之间并没有直接联系,而是通过中介来完成交易。中介的作用就是将卖方和买方联系起来,买方只需要告诉中介自己需要什么房子,中介就会将符合条件的房子推荐给买房者。
-
解耦的具体实现
- 把需要交给IOC容器处理的实现类的上方添加@Component注解,将实现类交给IOC容器管理。
- 在需要使用实现类的类上方添加@Autowired注解,将实现类注入到需要使用实现类的类中。
个人理解:
- 实现类中只需要声明对象,创建对象的工作交给IOC容器来完成。
- 同一层架构的注解下的实现类只能有一个,如果有多个实现类需要注释掉其他实现类上的注解
4. IOC控制反转详解
-
bean对象的声明
- 实际开发中使用Component衍生注解
- @Controller-标注在控制器类上
- @Service-标注在业务类上
- @Repository-标注在数据访问类上(现在用@Mapper替代了))
注意:
1. 声明bean时,可通过value属性指定bean的id,不指定时,默认id为当前类名首字母小写。
2. spring集成web开发中,声明控制器bean只能用@Controller。 - 实际开发中使用Component衍生注解
-
bean组件扫描
- 默认扫描的包为当前包及其子包。
- 方法1:可以通过@ComponentScan注解的value属性指定需要扫描的包。
- 方法2:可以通过@ComponentScan注解的basePackages属性指定需要扫描的包。
- @SpringBootApplication注解具有包扫描作用,默认扫描当前包机及其子包。
- 默认扫描的包为当前包及其子包。
5. DI依赖注入详解
-
bean注入
- @Autowired注解,默认按照类型进行注入,如果存在多个相同类型的bean,则报错。解决方法如下:
-
方法一:在控制层的@Autowired注解下加上@Qualifier("bean的id")注解,表示当前bean生效。
-
方法二:在服务层@Service注解上加上@Primary注解,表示当前bean生效。
-
方法三:在控制层上删除@Autowired注解,再加上@Resource(name= "bean的id")注解,表示当前bean生效。
-
- @Autowired注解,默认按照类型进行注入,如果存在多个相同类型的bean,则报错。解决方法如下:
总结:@Resource注解和@Autowired注解都可以实现依赖注入,它们的区别是:
- @Autowired是spring框架提供的,@Resource注解是JDK提供的。
- @Autowired默认按照类型注入,@Resource注解默认按照名称注入。