所謂控制反轉,就是把原先我們代碼里面需要實現的對象創建、依賴的代碼,反轉給容器來幫忙實現。那么必然的我們需要創建一個容器,同時需要一種描述來讓容器知道需要創建的對象與對象的關系。這個描述最具體表現就是我們可配置的文件。
IoC基礎
控制反轉IoC(Inversion of Control),是一種設計思想,DI(依賴注入)是實現IoC的一種方法,也有人認為DI只是IoC的另一種說法。沒有IoC的程序中我們使用面向對象編程對象的創建與對象間的依賴關系完全硬編碼在程序中,對象的創建由程序自己控制,控制反轉后將對象的創建轉移給第三方,個人認為所謂控制反轉就是:獲得依賴對象的方式反轉了。
IoC是Spring框架的核心內容,使用多種方式完美的實現了IoC,可以使用XML配置,也可以使用注解,新版本的Spring也可以零配置實現IoC。Spring容器在初始化時先讀取配置文件,根據配置文件或元數據創建與組織對象存入容器中,程序使用時再從Ioc容器中取出需要的對象。
采用XML方式配置Bean的時候,Bean的定義信息是和實現分離的,而采用注解的方式可以把兩者合為一體,Bean的定義信息直接以注解的形式定義在實現類中,從而達到了零配置的目的。
使用XML配置的方式實現IOC
假設項目中需要完成對圖書的數據訪問服務,我們定義好了IBookDAO接口與BookDAO實現類
創建maven項目:
IBookDAO接口如下:
package com.zhangguo.Spring051.ioc01;
/**
* 圖書數據訪問接口
*/
public interface IBookDAO {
/**
* 添加圖書
*/
public String addBook(String bookname);
}
BookDAO實現類如下:
package com.zhangguo.Spring051.ioc01;
/**
* 圖書數據訪問實現類
*/
public class BookDAO implements IBookDAO {
public String addBook(String bookname) {
return “添加圖書”+bookname+“成功!”;
}
}
Maven項目的pom.xml如下:
xsi:schemaLocation=“http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd”>
4.0.0< P modelVersion><>
com.zhangguo< P groupId><>
Spring051< P artifactId><>
0.0.1-SNAPSHOT< P version><>
jar< P packaging><>
Spring051< P name><>
HTTP: P url>< maven.apache.org<>
< P>
UTF-8< P project.build.sourceEncoding><>
4.3.0.RELEASE< P spring.version><>
<>
< P>
< P>
junit< P groupId><>
junit< P artifactId><>
test< P scope><>
4.10< P version><>
<>
< P>
org.springframework< P groupId><>
spring-context< P artifactId><>
${spring.version}< P version><>
<>
< P>
org.aspectj< P groupId><>
aspectjweaver< P artifactId><>
1.8.9< P version><>
<>
< P>
cglib< P groupId><>
cglib< P artifactId><>
3.2.4< P version><>
<>
<>
業務類BookService如下:
package com.zhangguo.Spring051.ioc01;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* 圖書業務類
*/
public class BookService {
IBookDAO bookDAO;
public BookService() {
//容器
ApplicationContext ctx=new ClassPathXmlApplicationContext(“IOCBeans01.xml”);
//從容器中獲得id為bookdao的bean
bookDAO=(IBookDAO)ctx.getBean(“bookdao”);
}
public void storeBook(String bookname){
System.out.println(“圖書上貨”);
String result=bookDAO.addBook(bookname);
System.out.println(result);
}
}
容器的配置文件IOCBeans01.xml如下:
<?xml version=“1.0” encoding=“UTF-8”?>
xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
xmlns:p=“http://www.springframework.org/schema/p”
xsi:schemaLocation=“http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd”>
測試類Test如下:
package com.zhangguo.Spring051.ioc01;
public class Test {
@org.junit.Test
public void testStoreBook()
{
BookService bookservice=new BookService();
bookservice.storeBook(“”);< MVC權威指南>
}
}
運行結果:
3.2.4<>cglib<>cglib<>1.8.9<>aspectjweaver<>org.aspectj<>${spring.version}<>spring-context<>org.springframework<>4.10<>test<>junit<>junit<>4.3.0.RELEASE<>UTF-8<>Spring051<>jar<>0.0.1-SNAPSHOT<>Spring051<>com.zhangguo<>4.0.0<>
評論
查看更多