1. 程式人生 > >spring 03-Spring開發框架之控制反轉

spring 03-Spring開發框架之控制反轉

控制反轉原理

測試介面程式

package cn.liang.service;
public interface IMessageService {
  public String getInfo() ;
}
package cn.liang.service.impl;
import cn.liang.service.IMessageService;
public class MessageServiceImpl implements IMessageService {
  @Override
  public String getInfo() {
      return "helloliang";
  }
}

原始物件呼叫

  • 在java開發中需要通過使用關鍵字new來進行物件產生,耦合度加深。
  • new是造成程式碼耦合度關鍵的元凶
package cn.liang.test;
import cn.liang.service.IMessageService;
import cn.liang.service.impl.MessageServiceImpl;
public class TestMessage2 {
  public static void main(String[] args) {
      IMessageService msg = new MessageServiceImpl();
      System.out.println(msg.getInfo());
  }
}
  • 可以通過引入一個專門負責具體操作的代理公司開發,這樣可以避免關鍵字new
package cn.liang.service;
import static org.hamcrest.CoreMatchers.nullValue;
public class ServiceFactory {
  public static IMessageService getInstance(String className) {
      IMessageService msg = null;
      try {
          msg = (IMessageService) Class.forName(className).newInstance();
      } catch (Exception e) {
          e.printStackTrace();
      }
      return msg;
  }
}
package cn.liang.test;
import cn.liang.service.IMessageService;
import cn.liang.service.ServiceFactory;
public class TestMessage3 {
  public static void main(String[] args) {
      IMessageService msg = ServiceFactory.getInstance("cn.liang.service.impl.MessageServiceImpl");
      System.out.println(msg.getInfo());
  }
}

使用Spring開發框架進行代理

修改applicationContext.xml配置檔案:

<bean id="msg" class="cn.liang.service.impl.MessageServiceImpl"/>

編寫測試程式程式碼類

  • 現階段是通過java程式啟動了Spring容器,後面可以利用WEB容器來啟動Spring容器
  • 最後整個階段不會看見任何的關鍵字new的出現
package cn.liang.test;
import org.apache.log4j.Logger;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import cn.liang.service.IMessageService;
import junit.framework.TestCase;
public class TestMessageService {
  private static ApplicationContext ctx = null ;
  static {    // 靜態程式碼塊優先於所有的程式碼執行,目的是為了靜態屬性初始化
      ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
  }
  @Test
  public void testGetInfo() {
      IMessageService msgService = ctx.getBean("msg", IMessageService.class);
      Logger.getLogger(TestMessageService.class).info(msgService.getInfo());
      TestCase.assertEquals(msgService.getInfo(), "helloliang");
  }
}