1. IoC 容器的概念java
IoC 容器指 具備依賴注入功能的容器,IoC 容器負責實例化、定位、配置應用程序中的對象及創建這些對象間的依賴。應用程序無需直接在代碼中 new 相關對象,而是由 IoC 容器進行組裝。在Spring 中 BeanFactory 是 IoC 容器的實際表明者。
spring
Spring IoC 容器經過讀取配置文件中配置元數據,經過元數據對用中的各個對象進行實例化及裝配。通常使用基於 xml 配置文件進行配置元數據,並且 spring 與 配置文件 徹底解耦,可使用其餘方式進行配置元數據,好比 註解、基於 Java 文件的、基於屬性文件的配置。。
ide
2. Bean 的概念
this
由 IoC 容器管理的那些 對象稱之爲 Bean,Bean 就是由 Spring 容器初始化、裝配及管理的對象,除此以外,bean 與應用程序中其餘對象沒有什麼區別了。
spa
3. 下面咱們搭建一個項目來演示一下Spring IoC 的基本使用code
(環境 JDK 1.7.0_79,Eclipse 以及 spring 4.2.2 release,注意:該版本spring 只支持 JDK 1.6+xml
(下載地址:http://repo.spring.io/release/org/springframework/spring/))對象
使用 Eclipse 新建 Java project,命名爲 Spring_IOC,同時import spring的 jar 包。接口
User.javaip
public class User { private int userId; private String username;// 用戶姓名 private String sex;// 性別 private Date birthday;// 出生日期 private String address;// 地址 private String detail;// 詳細信息 private Float score;// 成績 //getter() and setter()... }
UserService.java
public interface UserService { public void addUser(User user); }
UserServiceImpl.java
public class UserServiceImpl implements UserService { private UserDAO userDAO; public UserDAO getUserDAO() { return userDAO; } public void setUserDAO(UserDAO userDAO) { this.userDAO = userDAO; } @Override public void addUser(User user) { this.userDAO.saveUser(user); } }
UserDAO.java
public interface UserDAO { public void saveUser(User user); }
UserDAOImpl.java
public class UserDAOImpl implements UserDAO { @Override public void saveUser(User user) { System.out.println("save user to Database"); } }
UserServiceTest.java (Junit test case)
public class UserServiceTest { @Before public void setUp() throws Exception { } @Test public void testAddUser() throws Exception { ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml"); UserServiceImpl service = (UserServiceImpl) ctx.getBean("userService"); User user = new User(); user.setUsername("Olive"); service.addUser(user); } }
Beans.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="userDAO" class="com.dao.impl.UserDAOImpl" /> <bean id="userService" class="com.service.impl.UserServiceImpl"> <property name="userDAO" ref="userDAO" /> </bean> </beans>
4. 注入方式
OK,Demo搭建起來了,下面講一下 IoC 容器的幾種注入方式:接口注入、構造方法、setter方法注入(前二者用的比較少)。
(1)構造方法注入:
首先,在依賴對象(UserServiceImpl)中構建顯式的構造方法,構造方法包含 被依賴對象(UserDAOImpl)。在配置文件(beans.xml)中配置好 userDAOImpl 和 UserDAOImpl,以下:
在 UserServiceImpl 中添加構造方法:
//constructor public UserServiceImpl(UserDAO userDAO) { super(); this.userDAO = userDAO; }
修改配置文件:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="userDAO" class="com.dao.impl.UserDAOImpl" /> <bean id="userService" class="com.service.impl.UserServiceImpl"> <!-- <property name="userDAO" ref="userDAO" /> --> <!-- constructor --> <constructor-arg> <ref bean="userDAO"/> </constructor-arg> </bean> </beans>
(2)setter 方法注入:
要求在依賴對象(UserServiceImpl)中提供被依賴對象(UserDAOImpl)的setter() 方法,then 在配置文件 <bean><property /></bean> property中配置被依賴對象。
public class UserServiceImpl implements UserService { private UserDAO userDAO; public UserDAO getUserDAO() { return userDAO; } public void setUserDAO(UserDAO userDAO) { this.userDAO = userDAO; } //constructor // public UserServiceImpl(UserDAO userDAO) { // super(); // this.userDAO = userDAO; // } @Override public void addUser(User user) { this.userDAO.saveUser(user); } }
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="userDAO" class="com.dao.impl.UserDAOImpl" /> <bean id="userService" class="com.service.impl.UserServiceImpl"> <property name="userDAO" ref="userDAO" /> <!-- constructor --> <!-- <constructor-arg> <ref bean="userDAO"/> </constructor-arg> --> </bean> </beans>
(3)接口注入:因爲筆者本身也不太清楚,先暫時空着,待之後弄清楚後補充