傳統開發中,類內部 new 依賴對象,耦合度高且難管理。Spring IOC 容器接管對象創建與生命週期,將依賴「注入」到需要的類中,實現控制反轉 (IoC)。
public class UserServiceImpl implements UserService {
private UserDao userDao;
// 必須提供 setter
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void insertUser(User user) {
userDao.insert(user);
}
}
<bean id="userDao" class="UserDao" />
<bean id="userService" class="UserServiceImpl">
<property name="userDao" ref="userDao" />
</bean>
public class User {
private String name;
private Integer age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
// getter/setter 省略
}
<bean id="user" class="User">
<constructor-arg index="0" value="zhangsan" />
<constructor-arg index="1" value="20" />
</bean>
引用類型依賴同理:
<bean id="userService" class="UserServiceImpl">
<constructor-arg index="0" ref="userDao" />
</bean>
<context:component-scan base-package="com.example" /> <context:annotation-config />
@Component // 或 @Repository
public class UserDao { ... }
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao; // 無需 setter
public void insertUser(User user) {
userDao.insert(user);
}
}
註解注入代碼最簡潔,構造器注入保證不可變性與強依賴,Setter 注入適合可選依賴。現代 Spring 專案推薦構造器注入為主,註解輔助的混合模式。