spring 03-Spring開發框架之控制反轉
阿新 • • 發佈:2018-11-29
控制反轉原理
測試介面程式
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"); } }