(5)ioc容器概述
該介面org.springframework.context.ApplicationContext
代表Spring IoC容器,負責例項化,配置和組裝bean。容器通過讀取配置後設資料獲取有關要例項化,配置和組裝的物件的指令。配置後設資料以XML,Java註釋或Java程式碼表示。它允許您表達組成應用程式的物件以及這些物件之間豐富的相互依賴性。
ApplicationContext
Spring的開箱即用的幾個介面實現。在獨立應用程式中,通常建立ClassPathXmlApplicationContext
或的例項FileSystemXmlApplicationContext
。
雖然XML是定義配置後設資料的傳統格式,但您可以通過提供少量XML配置來宣告性地支援這些其他後設資料格式,從而指示容器使用Java註釋或程式碼作為後設資料格式。
接下來就開始演示ioc容器如何使用
1.配置後設資料
演示的例子描述了Person的業務層訪問 personDao層,personDao層成訪問實體類的例子
對應person的實體類
/**
* @Project: spring
* @description: person實體類
* @author: sunkang
* @create: 2018-09-11 10:42
* @ModificationHistory who when What
**/
public class Person {
private String username;
private int age;
private String addr;
public Person(String username, int age, String addr) {
this.username = username;
this.age = age;
this.addr = addr;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
@Override
public String toString() {
return "Person{" +
"username='" + username + '\'' +
", age=" + age +
", addr='" + addr + '\'' +
'}';
}
}
接下來是person的dao層
/**
* @Project: spring
* @description: person 資料訪問層
* @author: sunkang
* @create: 2018-09-11 10:51
* @ModificationHistory who when What
**/
public class PersonDao {
public Person findPersonByUsername(String username){
return new Person(username,20,"hangzhou");
}
}
接下來是業務層
/**
* @Project: spring
* @description: person 業務處理類
* @author: sunkang
* @create: 2018-09-11 10:50
* @ModificationHistory who when What
**/
public class PersonService {
private PersonDao personDao;
private String serviceName;
public Person findPersonByUsername(String userName){
return personDao.findPersonByUsername(userName);
}
public PersonDao getPersonDao() {
return personDao;
}
public void setPersonDao(PersonDao personDao) {
this.personDao = personDao;
}
public String getServiceName() {
return serviceName;
}
public void setServiceName(String serviceName) {
this.serviceName = serviceName;
}
}
想想person的業務層如何dao層如何進行關聯呢?
接下來看看在xml的具體配置
PersonDao在spring-dao.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="personDao" class="com.spring.ContailerOverview.PersonDao"/>
</beans>
PersonService在spring-service.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="personService" class="com.spring.ContailerOverview.PersonService">
<!-- collaborators and configuration for this bean go here -->
<property name="personDao" ref="personDao"/>
<property name="serviceName" value="person的service層"/>
</bean>
</beans>
配置瞭解完了,接下來,瞭解如何進行載入配置,並完成ioc的載入,
想想如何同時載入spring-dao.xml和spring-service.xml的配置
2.例項化容器 和使用容器
在講解例項化容器之前,比如我有多個xml配置,我想放到一起組合載入該如何配置
可以使用import可以引入多個檔案載入bean定義
在spring-compose.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">
<!--對之前的連個檔案進行組合-->
<import resource="spring-dao.xml"/>
<import resource="spring-service.xml"/>
</beans>
其實除了普通的xml配置之外,spring還支援Groovy Bean定義DSL,這個該如何配置
groovy-dao.groovy描述了personDao這個類的配置方法
package ContailerOverview
import com.spring.ContailerOverview.PersonDao
beans {
personDao(PersonDao) {
}
}
groovy-service.groovy描述了personService這個類的配置方法
package ContailerOverview
import com.spring.ContailerOverview.PersonService
beans {
personService(PersonService) {
serviceName = "personService"
personDao = personDao
}
}
接下來一起來看如何使用ioc容器來載入普通xml的配置和groovy檔案的配置
載入普通xml配置有下面的幾種方式:
- 可以用
ClassPathXmlApplicationContext
載入classPath路徑完成容器載入- 可以用
FileSystemXmlApplicationContext
系統路徑載入容器- 可以用
GenericApplicationContext和XmlBeanDefinitionReade
r結合使用來載入
載入groovy檔案配置可以用使用
- 使用
GenericGroovyApplicationContext
的容器里載入- 使用
GenericApplicationContext和GroovyBeanDefinitionReader
結合使用
專案用到的是maven的來管理jar包的,所以需要如下的配置,需要增加兩個jar包的依賴
一個使用的spring-context的jar,一個是groovy需要的jar,由於spring5不在支援jdk1.8一下的版本,spring5中用到了jdk8的新語法lamba表示式,所以不在對低於jdk1.8版本的相容
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<version>2.4.12</version>
</dependency>
接下來演示ioc容器的載入和容器如何使用的
注意,該配置檔案我都在resources下的ContailerOverview目錄中,所以配置檔案載入會有這個字首,後期程式碼會公佈,具體的地址請看sprig框架系列第一遍
/**
* @Project: spring
* @description:讀取容器
*
* 一般的載入方式:
* 方式1: 可以用ClassPathXmlApplicationContext載入classPath路徑完成容器載入
* 方式2: 可以用FileSystemXmlApplicationContext 系統路徑載入容器
* 方式3:可以用GenericApplicationContext和XmlBeanDefinitionReader結合使用來載入
*
* 另外也可以載入組合檔案
* 讀取groovy的配置檔案需要groovy-all.jar的支援
* 載入groovy 可以用使用
* 1.使用GenericGroovyApplicationContext的容器里載入
* 2.使用GenericApplicationContext和GroovyBeanDefinitionReader結合使用
*
* @author: sunkang
* @create: 2018-09-11 11:00
* @ModificationHistory who when What
**/
public class ApplicationBootstrap {
public static void main(String[] args) {
/*-----------------------------------載入spring的xml配置檔案-----------------------------*/
//1.一次性讀取多個檔案
ApplicationContext context = new ClassPathXmlApplicationContext("ContailerOverview/spring-dao.xml", "ContailerOverview/spring-service.xml");
PersonService personService= context.getBean("personService",PersonService.class);
Person person = personService.findPersonByUsername("sunkang");
System.out.println(person);
//2.讀取組合檔案
// //用 ClassPathXmlApplicationContext來讀取
// ApplicationContext context1 = new ClassPathXmlApplicationContext("spring-compose.xml");
String filePath=ApplicationBootstrap.class.getClassLoader().getResource("").getPath()+ "ContailerOverview/spring-compose.xml";
System.out.println(filePath);
//用FileSystemXmlApplicationContext來讀取
ApplicationContext context1= new FileSystemXmlApplicationContext(filePath);
PersonService personService1= context1.getBean("personService",PersonService.class);
System.out.println(personService1.findPersonByUsername("wangzezhi"));
//3.靈活的變體GenericApplicationContext和XmlBeanDefinitionReader結合使用
GenericApplicationContext context2 = new GenericApplicationContext();
new XmlBeanDefinitionReader(context2).loadBeanDefinitions("ContailerOverview/spring-dao.xml", "ContailerOverview/spring-service.xml");
context2.refresh();
/*-----------------------------------載入groovy的檔案-----------------------------*/
//4.使用groovy 檔案配置
ApplicationContext context3 = new GenericGroovyApplicationContext("ContailerOverview/groovy-dao.groovy", "ContailerOverview/groovy-service.groovy");
PersonService personService3= context3.getBean("personService",PersonService.class);
System.out.println(personService3.findPersonByUsername("sunkang"));
//5.使用GenericApplicationContext和GroovyBeanDefinitionReader結合使用
GenericApplicationContext context4 = new GenericApplicationContext();
new GroovyBeanDefinitionReader(context4).loadBeanDefinitions("services.groovy", "daos.groovy");
context4.refresh();
}
}
相關文章
- IOC容器
- IoC 容器
- Laravel的Ioc容器Laravel
- 手寫IOC容器
- Spring--IOC容器Spring
- Spring框架IOC容器Spring框架
- Spring的IOC容器Spring
- OOD、DIP、IOC、DI、依賴注入容器(即 控制反轉容器,IOC Container)依賴注入AI
- Spring5原始碼解析系列一——IoC容器核心類圖Spring原始碼
- Spring5原始碼解析_IOC之容器的基本實現Spring原始碼
- 2.1 CDB容器概述
- IOC容器和依賴注入依賴注入
- 手擼一個IOC容器
- 深入理解Spring IOC容器Spring
- 對Spring IOC容器的思考Spring
- 淺析 Spring 的IOC容器Spring
- 從原始碼看Spring中IOC容器的實現(二):IOC容器的初始化原始碼Spring
- Spring IoC 容器的擴充套件Spring套件
- Spring IOC容器概念及分類Spring
- 手寫Spring---IOC容器(1)Spring
- Spring IOC容器實現機制Spring
- Spring IOC 一——Spring容器裝配BeanSpringBean
- Spring原始碼閱讀-IoC容器解析Spring原始碼
- spring原始碼解析之IOC容器(一)Spring原始碼
- 控制反轉(IOC容器)-Autofac入門
- 2、Spring使用+ioc容器配置使用1Spring
- Spring IOC容器核心流程原始碼分析Spring原始碼
- Spring01:概述及IOC理論推導Spring
- 2.1 Overview of Containers in a CDB (CDB容器概述)ViewAI
- Spring IOC容器的設計與實現Spring
- 使用 IoC 容器進行程式碼優化行程優化
- 如何向Spring IOC 容器 動態註冊beanSpringBean
- Java開發學習(九)----IOC之核心容器Java
- 深入理解Spring IOC容器及擴充套件Spring套件
- 基於Xml 的IOC 容器-準備文件物件XML物件
- Spring核心原理之IoC容器初體驗(2)Spring
- Spring IOC 容器預啟動流程原始碼探析Spring原始碼
- spring ioc原理-容器初始化的大致流程Spring