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