SpringMVC IOC
IOC介紹
(1)什麼是Spirng IOC?
控制反轉(Inversion of Control,縮寫為IoC)
》把原來new物件的這種方式轉換成了,spring通過反射建立物件的方式
》spring建立完的物件放到一個容器中,誰需要就給誰注入進去- (獲取物件並賦值給引用)
(2)SpringIOC環境搭建
1.建立Project
2.建立module maven
3.環境依賴
!--spring依賴 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.9.RELEASE</version>
</dependency>
(3)SpringIOC程式碼編寫
1.定義Person類
2.手動完成建立與賦值
3.由spring建立與賦值
建立容器物件
讀取配置檔案
new ClassPathXmlApplicationContext(“applicationContext.xml”);
從容器中查詢getBean()
編寫Test測試類
src\main\resources\applicationContext.xml
public class Test01 {
private ClassPathXmlApplicationContext context;
@Before
public void init(){
context=new ClassPathXmlApplicationContext("applicationContext.xml");
}
@Test
public void test(){
//1:建立ioc 容器物件 暫時看成map
//2:給定配置檔案的名稱 applicationContext.xml
//3:呼叫容器的getBean方法獲取id對應的對
Person person= context.getBean("person1",Person.class);//無需轉型
Person person1 = (Person) context.getBean("person1");//需轉型
//設定方法
person.setAge(1);
log.debug(person1+"");
}
編寫配置檔案
src\main\resources\applicationContext.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"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 要讓 spring容器給我建立一個person物件
配置類名,用於反向建立物件
同時給一個編號方便查詢-->
<bean id="person1" class="com.xjj.Bean.Person" scope="prototype" >
<!--'name'成員變數 'value'成員變數的值
每一個property方法會呼叫一個set方法-->
<property name="age" value="1"></property>
<property name="name" value="xjj"></property>
</bean>
<bean id="person2" class="com.xjj.Bean.Person">
<constructor-arg name="name" value="xjj"/>
<constructor-arg name="age" value="2"/>
</bean>
<bean id="person3" class="com.xjj.Demo.PersonFactory" factory-method="getBean">
</bean>
<bean class="com.xjj.Demo.PersonFactory2" id="factory2"/>
<bean factory-bean="factory2" factory-method="getBean" id="person4"/>
<!--生命週期-->
<bean id="person6" class="com.xjj.Bean.Person"
init-method="init"
destroy-method="destory">
</bean>
<bean id="person7" class="com.xjj.Bean.Person" >
<property name="name" value="jack"></property>
<property name="arr" >
<array>
<value>rose</value>
<value>nike</value>
</array>
</property>
</bean>
<bean id="person8" class="com.xjj.Bean.Person" >
<property name="name" value="jack"></property>
<property name="list" >
<list>
<value>rose</value>
<value>nike</value>
</list>
</property>
</bean>
<bean id="person9" class="com.xjj.Bean.Person" >
<property name="name" value="jack"></property>
<property name="set" >
<set>
<value>rose</value>
<value>nike</value>
</set>
</property>
<property name="map" >
<map>
<entry key="1001" value="rose111"></entry>
<entry key="1002" value="rose1311"></entry>
</map>
</property>
<property name="properties" >
<props>
<prop key="10011">222</prop>
<prop key="2222">333</prop>
</props>
</property>
</bean>
<bean id="personService" class="com.xjj.Service.PersonService">
<property name="personDao" ref="personDao"></property>
</bean>
<bean id="personDao" class="com.xjj.Dao.PersonDao">
<!--
使用註解方式進行建立物件
1.開啟註解掃描
含義:開啟註解掃描,指定了 base-package 掃描指定的包,掃描包與子包中所有的類
檢視類上是否有指定的註解, 如果類上有指定的註解,那麼就建立給類物件,
放到spring容器中
-->
</bean>
<context:component-scan base-package="com.xjj"/>
</beans>
SpringIOC的方法區別
(1)區別
context.getBean("id值", 型別.class);//無需轉型
context.getBean("id值");//需轉型
(2)bean標籤的屬性
id:bean標籤的識別ID,理論上可以隨便寫
class:你要上Spring給你建立哪個類的物件,需要寫上該類的全路徑名
兩種賦值方法
第一種
Person person= context.getBean("person1",Person.class);//無需轉型
配置檔案
src\main\resources\applicationContext.xml
name:成員變數的名字
value:成員變數的值
一個property標籤最後會調一個對應的set方法
<bean id="person2" class="com.wzx.domain.Person" >
<property name="id" value="10"/>
<property name="name" value="rose"/>
<property name="age" value="20"/>
</bean>
第二種,構造方法建立物件
Person person2=new Person("xjj",2);
System.out.println(person2);
配置檔案
src\main\resources\applicationContext.xml
配置構造方法的引數的
constructor-arg 如果有四個,就表示調的一個四個引數的構造方法。
value可以賦上基本型別資料與String,但是其他物件,要使用ref
表示在當前容器中查詢一個已存在的物件
<bean id="person2" class="com.xjj.Bean.Person">
<constructor-arg name="name" value="xjj"/>
<constructor-arg name="age" value="2"/>
</bean>
SpringIOC靜態工廠
(1)乜嘢是靜態工廠?
XxxFactory.get();
(2)通過靜態方法呼叫物件
package com.xjj.Demo;
import com.xjj.Bean.Person;
public class PersonFactory {
public static Person getBean(){
return new Person();//靜態方法返回的物件
}
}
(3)factory-method
指定獲取物件的靜態工廠的方法
<bean id="person3" class="com.xjj.Demo.PersonFactory" factory-method="getBean">
例項工廠建立物件
(1)什麼是例項工廠
XxxFactory
(2)通過工廠物件呼叫成員方法獲得bean物件
XxxFactory factory = new XxxFactory(); //例項化工廠物件
factory .yyy() //獲得物件
(3)factory-bean 建立工廠物件
(4)factory-method 呼叫方法獲得bean物件
配置檔案
<bean factory-bean="factory2" factory-method="getBean" id="person4"/>
建立例項工廠類
package com.xjj.Demo;
import com.xjj.Bean.Person;
public class PersonFactory2 {
public Person getBean() {
//方法上沒有static,必須先new PersonFactory2()才能呼叫
return new Person();
}
}
測試類
// PersonFactory2 factory2 =new PersonFactory2();
//Person person=factory2.getBean();
Person person3 = (Person) context.getBean("person4");//使用這個就不需要new物件了
System.out.println(person3);
Spring單例和多例
單例:記憶體中只有一個物件,每次獲取物件的記憶體地址都一樣
多裡:記憶體中每一個物件都是新的物件,每次獲取物件的記憶體地址都不一樣
每次獲取物件的時候,spring是新建立一個物件還是始終給我們返回同一個物件.?
答案是:Spring預設情況下建立物件物件都是單例
scope="singleton" 單例(預設值)
scope="prototype" 多例
scope="request" 建立的物件放到request域中
scope="session" 建立物件放到session物件
多例項:
<bean id="person1" class="com.xjj.Bean.Person" scope="prototype" >
單例項:
<bean id="person1" class="com.xjj.Bean.Person" scope="singleton" >
SpringMVC生命週期
(1)生命週期
建立方法init
銷燬方法destory
普通方法service
(2)屬性
init-method 當該物件初始化的時候該方法會自動執行
destroy-method 當該物件即將銷燬的時候會自動呼叫該方法
context().close
關閉容器
測試類
@Test
public void test06(){
/*Person person1=new Person();
person1.init();
person1.work();
person1.work();
person1.destory();*/
Person person= (Person) context.getBean("person6");
person.work();
//自己銷燬容器才執行destory()方法
context.close();
}
public void init(){
System.out.println("HELLO");
}
public void work(){
System.out.println("hello word");
}
public void destory(){
System.out.println("wuhu");
}
配置檔案
<!--生命週期-->
<bean id="person6" class="com.xjj.Bean.Person"
init-method="init"
destroy-method="destory">
Spring注入依賴DI-set方法
(1)何為注入依賴?
DI (dependency injection) 依賴注入 含義:就是給物件的屬性設定值
Set對物件屬性設定值
構造方法給物件初始化的時候設定值.
(2)property標籤
set方式設定屬性(掌握)
讓spring調set方法,前提條件類中必須有set方法
name : 代表的是set方法去掉set,首字母小寫setName Name name
value: 基本型別或字串型別的值,具體給屬性設定用的
ref (引用) : 引用物件的id,作為一個物件型別注入
Spring依賴注入-給複雜型別注入
(1)什麼是複雜型別?
簡單的是基本型別與字串
Aarry 陣列 List 集合 Map集合 Set集合 Properties集合
(2)如何給這些屬性設定值
使用對應的子標籤
array,list,map,set,props
private String[] arr;
private List<String> list;
private Set<String> set;
private Map<String,String> map;
private Properties properties;
配置檔案
<bean id="person7" class="com.xjj.Bean.Person" >
<property name="name" value="jack"></property>
<property name="arr" >
<array>
<value>rose</value>
<value>nike</value>
</array>
</property>
</bean>
<bean id="person8" class="com.xjj.Bean.Person" >
<property name="name" value="jack"></property>
<property name="list" >
<list>
<value>rose</value>
<value>nike</value>
</list>
</property>
</bean>
<bean id="person9" class="com.xjj.Bean.Person" >
<property name="name" value="jack"></property>
<property name="set" >
<set>
<value>rose</value>
<value>nike</value>
</set>
</property>
<property name="map" >
<map>
<entry key="1001" value="rose111"></entry>
<entry key="1002" value="rose1311"></entry>
</map>
</property>
<property name="properties" >
<props>
<prop key="10011">222</prop>
<prop key="2222">333</prop>
</props>
</property>
</bean>
相關文章
- SpringMVC 乾貨系列:從零搭建 SpringMVC+mybatis(三):Spring 兩大核心之 IOC/DI 學習 | 掘金技術徵文SpringMVCMyBatis
- IOC
- golang IoCGolang
- Laravel IoCLaravel
- IOC理解
- IOC容器
- 深入理解DIP、IoC、DI以及IoC容器
- 【SpringMVC】SpringMVC搭建框架SpringMVC框架
- Spring - IOCSpring
- 反射+IOC容器反射
- spring iocSpring
- SpringMvc - SpringMvc的執行流程SpringMVC
- 搞透 IOC,Spring IOC 看這篇就夠了!Spring
- [SpringMVC]SpringMVC
- SpringMVCSpringMVC
- DIP、IoC、DI、JSJS
- Laravel的Ioc容器Laravel
- Spring AOP IOCSpring
- JAVA IOC 與 DIJava
- Spring-IOCSpring
- IOC 啟動流程
- SpringMVC原始碼分析1:SpringMVC概述SpringMVC原始碼
- SpringMVC-01 什麼是SpringMVCSpringMVC
- SpringMVC---IDEA 搭建SpringMVC工程SpringMVCIdea
- SpringMVC-08-SpringMVC層編寫SpringMVC
- springMVC學習筆記(一)-----springMVC原理SpringMVC筆記
- SpringMVC 流程SpringMVC
- SpringMVC——HelloWorldSpringMVC
- SpringMVC系列知識:(二)什麼是springMVC,為什麼要使用springMVCSpringMVC
- 前端也要懂的IOC前端
- IOC與DI總結
- Spring框架IOC容器Spring框架
- Spring--IOC容器Spring
- spring ioc和aopSpring
- Spring(IOC&DI)Spring
- Spring使用之IOCSpring
- 前端中的 IoC 理念前端
- 深入理解 IoC、DI