Web开发之三层架构
实例:
分层解耦
耦合:衡量软件中各个层/各个模块的依赖关联程度。
内聚:软件中各个功能模块内部的功能联系。
软件设计原则:高内聚低耦合
控制反转:Inversion 0f Control,简称IQC。对象的创建控制权由程序自身转移到外部(容器),这种思想称为控制反转。
依赖注入:Dependency Injection,简称DI。容器为应用程序提供运行时,所依赖的资源,称之为依赖注入。
Bean对象:IOC容器中创建、管理的对象,称之为Bean
IOC & DI入门
1.将Dao 及 Service层的实现类,交给I0C容器管理
2.为Controller及 Service注入运行时所依赖的对象
IOC详解
要把某个对象交给I0C容器管理,需要在对应的类上加上如下注解之一:
注解 | 说明 | 位置 |
@Component | 声明bean的基础注解 | 不属于以下三类时,用此注解 |
@Controller | @Component的衍生注解 | 标注在控制层类上 |
@Service | @Component的衍生注解 | 标注在业务层类上 |
@Repository | @Component的衍生注解 | 标注在数据访问层类上(由于与mybatis整合,用的少) |
注意:
声明bean的时候,可以通过注解的value属性指定bean的名字,如果没有指定,默认为类名首字母小写
- 前面声明bean的四大注解,要想生效,还需要被组件扫描注解@ComponentScan扫描。
- 该注解虽然没有显式配置,但是实际上已经包含在了启动类声明注解 @SpringBootApplication 中,默认扫描的范围是启动类所在包及其子包。
DI详解
基于@Autowired进行依赖注入的常见方式有如下三种:
属性注入
优点:代码简洁、方便快速开发。
缺点:隐藏了类之间的依赖关系、可能会破坏类的封装性
构造器注入
优点:能清晰地看到类的依赖关系、提高了代码的安全性。
缺点:代码繁琐、如果构造参数过多,可能会导致构造函数肿
注意:如果只有一个构造函数,@Autowired注解可以省略
setter注入
优点:保持了类的封装性,依赖关系更清晰。
缺点:需要额外编写setter方法,增加了代码量。
@Autowired注解,默认是按照类型进行注入的。
如果存在多个相同类型的bean,将会报出如下错误:
方案一:@Primary
方案二:@Qualifier
方案三:@Resource