在传统软件开发中,对象间的依赖关系往往通过硬编码实现:类A直接实例化类B,形成紧密的代码耦合。这种模式导致系统难以维护、扩展困难,且单元测试复杂度陡增。
Spring的IOC(控制反转) 正是为解决这一问题而生。
传统开发痛点:对象间强耦合(A类直接new B类对象)
解决方案:工厂模式+反射机制+XML解析,实现控制权反转
// 基础容器(延迟加载)
BeanFactory factory = new XmlBeanFactory(resource);
// 增强容器(立即加载)
ApplicationContext context =
new ClassPathXmlApplicationContext("applicationContext.xml");
<!-- 创建对象 -->
<bean id="userService" class="com.example.UserServiceImpl"/>
<!-- 依赖注入 -->
<bean id="dataSource" class="com.example.DruidDataSource">
<property name="url" value="jdbc:mysql://localhost:3306/db"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</bean>
核心配置语法:
<!-- 基础对象定义 -->
<bean id="userService" class="com.example.UserServiceImpl"/>
<!-- 带初始化参数的构造器 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<constructor-arg name="url" value="jdbc:mysql://localhost:3306/db"/>
</bean>
关键要素解析:
默认示例:
<!-- 服务层Bean -->
<bean id="orderService" class="com.service.OrderServiceImpl"/>
<!-- DAO层Bean -->
<bean id="userDao" class="com.dao.UserDaoImpl"/>
Spring核心注解映射表
注解 | 适用场景 | 等效XML配置 |
---|---|---|
@Component |
通用组件声明 |
|
@Service |
业务逻辑层组件 |
|
@Repository |
数据持久层组件 |
|
@Controller |
表现层控制器 |
|
注解特性说明:
@Component
的特殊化形式UserServiceImpl
→userServiceImpl
)@Service("orderService")
)实现步骤:
<context:component-scan base-package="com.example"/>
开启组件扫描
@Service("orderService") // 自定义Bean名称
public class OrderServiceImpl implements OrderService {
// 类实现
}
最佳实践:
<bean id="config" class="com.example.AppConfig">
<property name="maxThread" value="200"/>
<property name="timeout" value="5000"/>
</bean>
<bean id="collectionBean" class="com.example.CollectionDemo">
<!-- 数组注入 -->
<property name="ips">
<array>
<value>192.168.1.1</value>
<value>10.0.0.1</value>
</array>
</property>
<!-- Map注入 -->
<property name="settings">
<map>
<entry key="env" value="prod"/>
<entry key="version" value="1.2.0"/>
</map>
</property>
<!-- 对象引用集合 -->
<property name="services">
<list>
<ref bean="userService"/>
<ref bean="orderService"/>
</list>
</property>
</bean>
<bean id="userService" class="com.service.UserServiceImpl">
<property name="userDao" ref="userDao"/>
</bean>
<bean id="userDao" class="com.dao.UserDaoImpl"/>
@Service
public class PaymentService {
@Value("${payment.timeout:300}") // 带默认值的属性注入
private Integer timeout;
@Value("Alipay") // 直接赋值
private String defaultMethod;
}
@Configuration
public class AppConfig {
@Bean
public List<String> whiteList() {
return Arrays.asList("192.168.1.1", "10.0.0.1");
}
}
@Service
public class SecurityService {
@Autowired
private List<String> whiteList; // 自动注入集合
}
@Service
public class OrderService {
// 按类型自动装配(推荐方式)
@Autowired
private UserDao userDao;
// 精确指定Bean名称
@Autowired
@Qualifier("clusterUserDao")
private UserDao backupDao;
// 构造器注入(不可变依赖推荐)
private final PaymentService paymentService;
@Autowired
public OrderService(PaymentService paymentService) {
this.paymentService = paymentService;
}
}
特性 | XML配置 | 注解方式 |
---|---|---|
可读性 | 集中配置,结构层级清晰 | 配置分散在代码中,需结合代码阅读 |
维护性 | 修改配置需重新编译部署 | 配置与代码共存,修改即时生效 |
灵活性 | 支持热更新,运行时动态调整 | 需重新编译生效 |
复杂配置 | 擅长处理多对象嵌套关系 | 适合简单直接的配置 |
适用场景 | 第三方组件集成/历史遗留系统改造 | 现代Spring应用/自主开发组件管理 |
对比说明:
placeholder
动态替换,适合环境差异配置IOC不仅是框架特性,更代表了软件设计的哲学转变。掌握其精髓,开发者将能构建出真正面向变化的弹性系统,在快速迭代的数字化时代保持技术竞争力。通过深入理解对象创建和依赖注入的多种实现方式,开发者可以根据具体场景灵活选择最合适的配置策略,构建出既灵活又易于维护的Spring应用程序。