一 .分层解耦( IOC & DI)入门
分层解耦实现思路(借助 IOC & DI )
- 控制反转(IOC,Inversion Of Control):原本对象创建控制权在程序自身(如
Controller
里new Service
、Service
里new Dao
),现在转交给外部容器管理。容器负责创建对象(如UserServiceImpl
、UserDaoImpl
等的实例 ),实现了对象创建的 “反转”,降低程序内部创建对象的依赖。 - 依赖注入(DI,Dependency Injection):容器在程序运行时,将对象依赖的资源(比如
UserController
依赖的UserService
实例 )注入到需要的地方。像UserController
里声明private UserService userService
,无需自己new
,由容器把对应的UserService
实现类实例注入进来,让层与层之间依赖关系更灵活、易管理。 - **Bean对象:**IOC容器中创建、管理的对象,称之为Bean。
关键流程
- 容器管理对象:提前配置好哪些类由容器创建(如
UserService
相关实现类、UserDao
相关实现类 ),容器会创建这些类的实例(即 Bean 对象 )并进行管理。 - 依赖注入使用:在需要依赖的地方(如
UserController
需要UserService
),通过注解等方式(不同框架有不同实现,如 Spring 中@Autowired
等 ),让容器把对应的 Bean 注入进来,供程序使用。这样修改实现类时,只需在容器配置或注解指定新实现,不用改动调用类代码,实现低耦合。
通过 IOC 实现对象创建控制反转,结合 DI 完成依赖资源注入,能有效对软件分层进行解耦,让各层、模块职责更清晰,符合高内聚低耦合设计原则,提升代码可维护性与扩展性 。
二. 控制反转(IOC)详解
注解 | 说明 | 位置 |
---|---|---|
@Component | 声明bean的基础注解 | 不属于以下三类时,用此注解 |
@Controller | @Component的衍生注解 | 标注在控制层类上 |
@Service | @Component的衍生注解 | 标注在业务层类上 |
@Repository | @Component的衍生注解 | 标注在数据访问层类上(由于与mybatis整合,用的少) |
[!CAUTION]
前面声明bean的四大注解,要想生效,还需要被组件扫描注解@ComponentScan扫描。
该注解虽然没有显式配置,但是实际上已经包含在了启动类声明注解 @SpringBootApplication 中(封装了@ComponentScan),默认扫描的范围是启动类所在包及其子包,但是超出这个范围就不会生效
三. 依赖注入(DI)详解
1.依赖注入的三种方式
//方式一属性注入
@Autowired