IOC容器的概念:
IOC容器就是具有依賴注入功能的容器,IOC容器負者實例化、定位、配置應用程序中的對象及監理這些對象間的依賴,應用程序無需直接在對象中new對象,而是由IOC容器進行組裝。在Spring中BeanFactory是IOC容器的實際代表。
Spring IoC容器如何知道哪些是它管理的對象呢?這就需要配置文件,Spring IoC容器通過讀取配置文件中的配置元數據,通過元數據對應用中的各個對象進行實例化及裝配。一般使用基於xml配置文件進行配置元數據,而且Spring與配置文件完全解耦的,可以使用其他任何可能的方式進行配置元數據,比如註解、基於java文件的、基於屬性文件的配置都可以。
Bean的概念:
IoC容器管理的那些組成你應用程序的對象我們就叫它Bean, Bean就是由Spring容器初始化、裝配及管理的對象,除此之外,bean就與應用程序中的其他對象沒有什麼區別了。那IoC怎樣確定如何實例化Bean、管理Bean之間的依賴關係以及管理Bean呢?這就需要配置元數據,配置元數據指定如何實例化Bean、如何組裝Bean等。
寫代碼了,開心吧(使用的是IDEA)SpringIOC項目,下圖是創建一個Spring項目以及項目目錄情況:
User.java
package org.liang.entity;
/**
* Created by rcc on 2018/1/19.
* 實體類
*/
public class User {
private String name;
private String gender;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", gender='" + gender + '\'' +
", age=" + age +
'}';
}
}
UserServiceImpl.java
package org.liang.service;
import org.liang.entity.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* Created by rcc on 2018/1/19.
*/
public class UserServiceImpl {
public User getUser(){
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
User user = context.getBean(User.class);
user.setName("liang");
user.setGender("man");
user.setAge(18);
return user;
}
}
spring-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="user" class="org.liang.entity.User" />
<bean id="userService" class="org.liang.service.UserServiceImpl" >
</bean>
</beans>
TestUser.java
package org.liang.test;
import org.liang.service.UserServiceImpl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* Created by rcc on 2018/1/19.
* 測試類
*/
public class TestUser {
public static void main(String [] args){
//原先需要進行創建對象時需要new對象的,如下
UserServiceImpl userService = new UserServiceImpl();
System.out.print(userService.getUser()); //User{name='liang', gender='man', age=18}
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
UserServiceImpl userServiceBean = (UserServiceImpl) context.getBean("userService");
System.out.println(userServiceBean.getUser());
}
}
.詳解IOC:
Spring Ioc容器的代表就是org.springframework.beans包中的BeanFactory接口,BeanFactory接口提供了IoC容器最基本功能;而org.springframework.context包下的ApplicationContext接口擴展了BeanFactory,還提供了與Spring AOP集成、國際化處理、事件傳播及提供不同層次的context實現 (如針對web應用的WebApplicationContext)。簡單說, BeanFactory提供了IoC容器最基本功能,而 ApplicationContext 則增加了更多支持企業級功能支持。ApplicationContext完全繼承BeanFactory,因而BeanFactory所具有的語義也適用於ApplicationContext。
**ApplicationContext接口獲取Bean方法簡介:**
• **Object getBean(String name) 根據名稱返回一個Bean,客戶端需要自己進行類型轉換;**
• T getBean(String name, Class<T> requiredType) 根據名稱和指定的類型返回一個Bean,客戶端無需自己進行類型轉換,如果類型轉換失敗,容器拋出異常;
• **T getBean(Class<T> requiredType) 根據指定的類型返回一個Bean,客戶端無需自己進行類型轉換,如果沒有或有多於一個Bean存在容器將拋出異常;**
• Map<String, T> getBeansOfType(Class<T> type) 根據指定的類型返回一個鍵值爲名字和值爲Bean對象的 Map,如果沒有Bean對象存在則返回空的Map
那麼,IOC容器到底是如何工作的呢?
一、準備配置文件(spring-config.xml):在配置文件中聲明Bean的定義,也就是Bean配置元數據。
二、由IOC容器進行解析元數據:IOC容器的Bean Reader讀取並解析配置文件、更具定義生成Bean Definition配置元數據對象,IOC容器根據Bean Definition進行實例化、
配置和組裝Bean。
三、實例化IOC容器:由客戶端實例化容器、獲取需要的Bean。