前文已講解IoC與AOP兩大核心,本文通過「添加用戶」案例,三輪重構演示Spring如何實現解耦。
UserManagerImpl直接new UserDao4MySqlImpl(),調用類綁定具體實現,違背IoC「控制權交給第三方」原則。

public class UserManagerImpl implements UserManager {
public void addUser(User user) {
UserDao userDao = new UserDao4MySqlImpl(); // 硬編碼依賴
userDao.addUser(user);
}
}
將UserDao透過構造器注入UserManagerImpl,但Client仍需new UserDao4MySqlImpl(),耦合轉移而未消除。

public class Client {
public static void main(String[] args) {
UserDao userDao = new UserDao4MySqlImpl(); // Client仍依賴具體實現
UserManager userManager = new UserManagerImpl(userDao);
userManager.addUser(user);
}
}
引入Spring容器,依賴關係外置至XML配置,類之間零硬編碼依賴。

public class Client {
public static void main(String[] args) {
User user = new User(); user.setUsername("張三"); user.setPassword("123456");
BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");
UserManager userManager = (UserManager) factory.getBean("userManager");
userManager.addUser(user);
}
}
<beans ...>
<bean id="userDao4MySqlImpl" class="com.zs.spring.dao.UserDao4MySqlImpl" />
<bean id="userManager" class="com.zs.spring.manager.UserManagerImpl">
<property name="userDao" ref="userDao4MySqlImpl" />
</bean>
</beans>
XML相當於程式碼:
UserManager userManager = new UserManagerImpl(userDao); UserDao userDao = new UserDao4MySqlImpl();
對比三版類圖,Spring框架核心價值清晰可見: