ioc控制反转 di依赖注入
IOC(控制反转)和DI(依赖注入)
什么是IoC
IoC即控制反转,是一种设计模式,其核心在于将原本由程序代码直接操控的对象创建过程交给了专门的容器来处理。这样做的主要目的是为了减少组件之间的耦合度,使得应用程序更加模块化、易于管理和扩展[^1]。
在传统的编程模型中,调用者负责初始化它所需要的资源和服务;而在采用IoC的设计里,则是由外部环境——通常是框架或库,在适当的时候提供这些必要的协作对象给调用方使用[^2]。
什么是DI
DI代表依赖注入,这是实现IoC的一种具体方法论。通过这种方式可以更清晰地表达出各个软件单元之间存在的相互依存关系,并且简化了新功能加入时所需修改的工作量。简单来说,就是让某个类不需要自己去寻找它的依赖项而是被动接收它们[^3]。
对于开发者而言,这意味着可以在不改动原有逻辑的前提下轻松替换掉某些特定部分的功能实现,从而提高了系统的灵活性以及便于进行单元测试等活动[^4]。
实现方式
XML配置文件
早期版本中的Spring应用广泛采用了基于XML的方式来进行Bean定义:
<beans>
<!-- 定义UserServiceImpl bean -->
<bean id="userService" class="com.example.service.UserServiceImpl">
<!-- 设置属性值 -->
<property name="userRepository" ref="userRepository"/>
</bean>
<!-- 定义UserRepositoryImpl bean -->
<bean id="userRepository" class="com.example.repository.UserRepositoryImpl"/>
</beans>
上述例子展示了如何利用<bean>
标签声明服务层与数据访问层间的关联关系,其中ref
关键字用于指示目标引用另一个已注册过的Bean实例。
Java Config
随着Java语言的发展,越来越多的人倾向于使用纯编码的方式来完成同样的事情:
@Configuration
public class AppConfig {
@Bean
public UserService userService() {
return new UserServiceImpl(userRepository());
}
@Bean
public UserRepository userRepository(){
return new UserRepositoryImpl();
}
}
这段代码片段同样表达了相同的内容,但是是以更为直观的形式呈现出来的。这里借助于@Configuration
注解标记该类为配置源之一,而内部的方法则分别对应着不同类型的工厂方法,用来生产相应的单例对象供整个上下文共享使用。
注解驱动
最后一种也是目前最流行的做法便是依靠各种各样的元数据标注来自动生成所需的映射表结构:
@Service
public class UserServiceImpl implements UserService{
private final UserRepository userRepository;
@Autowired
public UserServiceImpl(UserRepository userRepository){
this.userRepository = userRepository;
}
}
@Repository
public class UserRepositoryImpl implements UserRepository{}
在这个场景下,只要确保所有参与组装操作的角色都已经被正确地标记上了合适的标签即可,剩下的工作交给Spring Boot自动完成就好。特别是当涉及到大量第三方库集成的情况下,这种方法的优势尤为明显。
相关推荐

















