
IOC 和 DI❓❓❓IOC 全称是 Inversion of Control,中文叫 "控制反转"。
简单的说,就是把对象的创建和依赖关系的维护交给框架管理,而不是自己在代码中 new 出来。
IOC 是一种设计思想,而注解 DI 是实现 IOC 的方式之一。
IOC 的好处如下所示:
优点 | 说明 |
|---|---|
解耦 | 组件之间不直接 new,依赖由框架注入 |
易测试 | 方便用 mock 对象进行单元测试 |
灵活替换 | 想换实现类,只改配置或注解,不改业务代码 |
更清晰的架构 | 各层职责分明,依赖关系可视化 |
此外,Spring 容器管理的对象,称为 Bean 对象。
@Component 和 @Autowired 是 Spring 框架中非常核心的两个注解,是实现 IOC(控制反转) 和 DI(依赖注入) 的关键工具。
@Component:一个类级注解,用于将普通的 Java 类声明为 Spring 管理的 Bean。@Autowired:一个非类级注解,用于自动注入依赖对象,而无需手动 new。如何从
Spring容器中获取对象❓❓❓ 可以从ApplicationContext中的getBean()方法获取,如下所示: public static void main(String[] args) { // 在启动类中拿到ApplicationContext对象 ApplicationContext context = SpringApplication.run(Application.class, args); // 第一种传参方式 UserComponent bean1 = context.getBean(UserComponent.class); bean1.func(); // 第二种传参方式(需要强转) UserConfig bean2 = (UserConfig)context.getBean("userConfig"); bean2.func(); } 而getBean()方法,实际上是ApplicationContext是实现了BeanFactory接口得到的,并且在其基础上添加了对国际化支持、资源访问支持、以及事件传播等方面的支持! 此外,getBean()对于Bean的名称约定如下所示:
UserController,则 Bean 名为:userController。UController,则 Bean 名为 UController。注解 | 作用 | 常见使用位置 |
|---|---|---|
@Component | 通用组件,标识该类为 Bean | 工具类、业务组件 |
@Controller | 控制层,接收前端请求 | MVC 控制器类 |
@Service | 业务逻辑层 | Service 类 |
@Repository | 数据持久层 | DAO 类,MyBatis Mapper |
@Configuration | 配置类 | 用于代替 XML 配置 |
常见的目录结构规范如下所示:
src
└── main
└── java
└── com.example.project
├── controller # 控制器层(@Controller / @RestController)
├── service # 业务逻辑层(@Service)
├── dao/mapper # 数据访问层(@Repository / @Mapper)
├── model/entity # 实体类(POJO/DTO/DO/VO)
└── config # 配置类(@Configuration)注意:五大注解均可以起别名!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。