所謂控制反轉,就是把原先我們代碼里面需要實現(xiàn)的對象創(chuàng)建、依賴的代碼,反轉給容器來幫忙實現(xiàn)。那么必然的我們需要創(chuàng)建一個容器,同時需要一種描述來讓容器知道需要創(chuàng)建的對象與對象的關系。這個描述最具體表現(xiàn)就是我們可配置的文件。
IoC基礎
控制反轉IoC(Inversion of Control),是一種設計思想,DI(依賴注入)是實現(xiàn)IoC的一種方法,也有人認為DI只是IoC的另一種說法。沒有IoC的程序中我們使用面向對象編程對象的創(chuàng)建與對象間的依賴關系完全硬編碼在程序中,對象的創(chuàng)建由程序自己控制,控制反轉后將對象的創(chuàng)建轉移給第三方,個人認為所謂控制反轉就是:獲得依賴對象的方式反轉了。
IoC是Spring框架的核心內容,使用多種方式完美的實現(xiàn)了IoC,可以使用XML配置,也可以使用注解,新版本的Spring也可以零配置實現(xiàn)IoC。Spring容器在初始化時先讀取配置文件,根據(jù)配置文件或元數(shù)據(jù)創(chuàng)建與組織對象存入容器中,程序使用時再從Ioc容器中取出需要的對象。
采用XML方式配置Bean的時候,Bean的定義信息是和實現(xiàn)分離的,而采用注解的方式可以把兩者合為一體,Bean的定義信息直接以注解的形式定義在實現(xiàn)類中,從而達到了零配置的目的。
使用XML配置的方式實現(xiàn)IOC
假設項目中需要完成對圖書的數(shù)據(jù)訪問服務,我們定義好了IBookDAO接口與BookDAO實現(xiàn)類
創(chuàng)建maven項目:
IBookDAO接口如下:
package com.zhangguo.Spring051.ioc01;
/**
* 圖書數(shù)據(jù)訪問接口
*/
public interface IBookDAO {
/**
* 添加圖書
*/
public String addBook(String bookname);
}
BookDAO實現(xiàn)類如下:
package com.zhangguo.Spring051.ioc01;
/**
* 圖書數(shù)據(jù)訪問實現(xiàn)類
*/
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><>
<>
<>
業(yè)務類BookService如下:
package com.zhangguo.Spring051.ioc01;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* 圖書業(yè)務類
*/
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<>
評論
查看更多