Spring依賴註入和控制反轉簡解 – JAVA編程語言程序開發技術文章

-隨風潛入夜
 
 Spring 依賴註入簡單理解,寫給對Spring完全莫不著門路的朋友。
 
 首先需要想清楚MVC每層之間的調用關系,然後再來看Spring會感到比較容易理解瞭。假設我們新建一個項目:com.java.ibatis 那麼對應這個項目應該有他點dao層(interface)、dao的實現層(impl)、服務層(service)、模型層/實體層(Model/Bean)
 
假設我們在UserDao(全類名:com.java.ibatis.dao.UserDao.java)裡面定義如下接口:
 
 
int insert(UserModel user);
 
這個接口需要接收的類型是我們的實體層:UserModel 接收的參數是user,那麼我們現在要做的就是在impl層去寫DAO的實現。假設我們的impl層點全類名:com.java.ibatis.impl.UserDaoImpl.java。
 
那麼理所當然的我們需要實現insert:
 
public int insert(UserModel user) {
 
 System.out.println("User Add!");
 
 return 0;
 
}
 
 寫完瞭Dao的實現之後我們需要做的就是寫服務層:service。假設我們的service全類名是:com.java.ibatis.service.UserServie.java:
 
 
public class UserService {
 
 private UserDao userdao;
 
 public void add(UserModel user)
 
 {
 
  userdao.insert(user);
 
 }
 
 public UserDao getUserdao() {
 
  return userdao;
 
 }
 
 public void setUserdao(UserDao userdao) {
 
  this.userdao = userdao;
 
 }
 
 
}
 
private UserDao userdao 是我們的Dao層的,寫service層是為瞭讓Dao的實現層impl變得更加靈活可變。這點也許不是那麼好讓人理解,假設我們在Test.java裡面
 
  UserModel user=new UserModel();
 
  UserService service=new  UserService();
 
  service.add(user);
 
  //或調用
 
  service.getUserdao().insert(user);
 
 
 以上二者都是調用瞭UserDao的insert接口的實現!讓我們來看看Spring的ServiceTest類的流程吧!新建一個測試類,並引入JUnit4的支持(Myeclipse項目名build path–>add libaries–>JUnit)。UserServiceTest代碼如下:
 
public class UserServiceTest {
 
 @Test
 
 public void testInsert()
 
 {
 
  //推薦使用ApplicationContext而不是BeanFactory官方文檔內有說明。
 
  ApplicationContext atc=new    ClassPathXmlApplicationContext("beans.xml");//讀取我們的配置beans.xml文件
 
  UserService service=(UserService) atc.getBean("userService");//獲取我們的配置文件裡面配置Id是userService的bean。
 
  UserModel user=new UserModel();//new個實體層
 
  user.setUsername("admin");//設值
 
  user.setPassword("admin888");
 
//  service.add(user);//調用添加方法
 
  service.getUserdao().insert(user);//調用添加方法
 
 }
 
}
 
 
我們一起來看一下beans.xml:
 
 
<?xml version="1.0" encoding="UTF-8"?>
 
<beans xmlns="https://www.springframework.org/schema/beans"
 
       xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
 
       xsi:schemaLocation="https://www.springframework.org/schema/beans
 
           https://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
 
 
  <bean id="userImpl" class="com.java.ibatis.impl.UserDaoImpl">
 
  </bean>
 
  <bean id="userService" class="com.java.ibatis.service.UserService">
 
   <property name="userdao" ref="userImpl" />
 
  </bean>
 
</beans>
 
讓我來給大傢解釋下配置:
 
<bean id="userImpl" class="com.java.ibatis.impl.UserDaoImpl">
 
一個id叫userImpl的bean它對應的全路徑叫com.java.ibatis.impl.UserDaoImpl.java也就是我們的Dao的實現類!下面來看下第二個bean的配置:
 
 <bean id="userService" class="com.java.ibatis.service.UserService">
 
   <property name="userdao" ref="userImpl" />
 
 </bean>
 
一個id是userImpl的全類名是:com.java.ibatis.service.UserService.java也就是我們的Service層。property name="userdao" 屬性名為userdao。這裡需要註意:userdao是private UserDao userdao;此處千萬別寫錯來哦,親。
 
ref="userImpl" 引用userImpl也可以理解成把我們的userImpl註入到我們的service層裡面。我知道有可能有的朋友還是不理解什麼叫註入?怎麼就註入來呢?讓我們回到service層的private UserDao userdao;還是這段代碼,現在我們註入之後可以理解成這樣new出來的是一個UserDao的實現UserDaoImpl。以前我們寫service的時候控制權在於人而今控制權轉換給瞭我們的容器這應該就是傳說中的控制反轉瞭吧。
 
Run as JUnit:如果是綠色說明測試OK,紅色則需要查看下是不是哪兒寫錯瞭。正確應該打印:User impl Add!

發佈留言