Spring框架中的容器以及兩大特性
一、Spring框架的容器
Spring容器提供了一種管理方法,致力於解決我們各個層級之間的物件的呼叫關係。
我們通常呼叫各層級物件的時候,需要不斷建立物件,一次訪問就需要建立兩個物件;如果我們使用Spring容器,將不同層級的物件放入容器中,每次使用的時候呼叫容器中的物件,就不用建立那麼多物件,達到節約記憶體空間的目的。簡單來講,Spring容器就是儲存JavaBean物件的容器。
建立BeanFactory的三種方式
BeanFactory是一個介面,需要建立繼承的子類物件。下圖是其繼承結構圖:
方式一:使用XmlBeanFactory獲取BeanFactory工廠類物件
XmlBeanFactory需要傳入一個配置檔案的路徑,這個配置檔案就是我們spring的配置檔案,預設是applicationContext.xml。這個方法已經過時,所以我們不再使用。
@Test
public void getUser() throws Exception{
BeanFactory factory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
Class<? extends BeanFactory> class1 = factory.getClass();
System.out.println(class1);
}
方式二:使用ClassPathApplicationContext獲取容器類
這個方法替代了方式一,是我們建立容器類物件主要使用的方法。
@Test
public void getUser() throws Exception{
BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");
System.out.println(factory.getClass());
}
方式三:使用FileSystemXmlApplicationContext來獲取容器物件
這種方式在建立物件的時候需要傳入配置檔案的絕對路徑,這個方法可以使用專案外部的配置檔案
@Test
public void getUser() throws Exception{
BeanFactory factory = new FileSystemXmlApplicationContext("E:\\applicationContext.xml");
System.out.println(factory.getClass());
}
二、Spring框架的第一大特性——IOC
IOC(inversion of controller)指的是控制反轉,簡單來書,就是講建立物件的過程或者建立物件的許可權交給了spring框架來幫我們處理,我們不用再通過new的方式來建立JavaBean物件,這個過程就叫做IOC。
建立JavaBean物件的三種方法
首先建立一個JavaBean物件
package com.itheima.main;
public class User {
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void eat(){
System.out.println(this.name+"正在吃飯");
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
方法一:使用預設構造建立JavaBean物件
首先在applicationContext中配置我們的物件
<bean id="user" class="com.itheima.main.User">
</bean>
然後從容器中獲取我們的JavaBean物件
@Test
public void getBean() throws Exception {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
User bean = (User) context.getBean("user");
bean.eat();
}
方法二:使用靜態工廠建立JavaBean物件
建立bean的工廠類
package com.itheima.main;
public class BeanFactory {
public static User getBean(){
return new User();
}
}
在配置檔案中進行配置
<bean id="user2" class="com.itheima.main.BeanFactory" factory-method="getBean">
</bean>
獲取JavaBean物件
@Test
public void getBean2() throws Exception {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
User bean = (User) context.getBean("user2");
bean.eat();
}
方式三:使用動態工廠建立JavaBean物件
建立工廠類的方式與上面相同
在配置檔案中進行配置
<bean id="createFactory" class="com.itheima.main.BeanFactory"></bean>
<bean id="user3" factory-bean="createFactory" factory-method="getBean"></bean>
獲取JavaBean物件
@Test
public void getBean3() throws Exception {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
User bean = (User) context.getBean("user3");
bean.eat();
}
Bean的作用域和作用範圍
Bean屬性scope可以宣告bean的作用域範圍,Bean的作用域範圍有四種:
- Prototype:多例,每次呼叫都會建立一個新的例項
- Singleton:單例,建立一個物件,每次呼叫都是用這個物件
- Request:適用於web開發中,將我們的物件儲存在request域物件中
- Session:適用於web開發中,將我們的物件儲存在session域物件中
JavaBean的生命週期
我們可以在JavaBean類中新增init-method與destroy-method兩個方法,實現bean在初始化和關閉的時候呼叫的方法,然後在配置檔案中進行配置。
JavaBean類
package com.itheima.main;
public class User {
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
// 初始化方法
public void initMethod() {
System.out.println(this.name + "出生了");
}
public void eat() {
System.out.println(this.name + "正在吃飯");
}
// 關閉方法
public void destroyMethod() {
System.out.println(this.name + "死亡了");
}
}
配置檔案
<bean id="user" class="com.itheima.main.User" init-method="initmethod" destroy-method="destroymethod">
</bean>
三、Spring框架的第二大特性——DI
DI(dependency injection)指的是依賴注入,簡單來說就是使用spring框架對我們的JavaBean物件賦值的過程。
1、使用setter方法進行賦值
使用上文中建立的JavaBean類
注意:一定要給屬性生成對應的setter方法
配置JavaBean類的屬性
<bean id="user" class="com.itheima.main.User" init-method="initmethod" destroy-method="destroymethod">
<property name="name" value="張三"></property>
<property name="age" value="20"></property>
</bean>
從容器中獲取我們的JavaBean物件
@Test
public void getBean() throws Exception {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
User bean = (User) context.getBean("user");
bean.eat();
}
2、使用構造器來申明JavaBean
在JavaBean中生成帶所有屬性的構造方法
public User() {
super();
}
public User(String name,Integer age) {
super();
this.name = name;
this.age = age;
}
在配置檔案中申明JavaBean物件
<bean id="user" class="com.itheima.main.User">
<constructor-arg name="name" value="張三"></constructor-arg>
<constructor-arg name="age" value="20"></constructor-arg>
</bean>
申明的另一種方法:
<bean id="user" class="com.itheima.main.User">
<constructor-arg index="0" type="java.lang.String" value="張三"></constructor-arg>
<constructor-arg index="1" type="java.lang.Integer" value="20"></constructor-arg>
</bean>
呼叫JavaBean的屬性
@Test
public void getBean() throws Exception {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
User bean = (User) context.getBean("user");
bean.eat();
}
3、P名稱空間和C名稱空間
P名稱空間與C名稱空間其實都是不存在的虛擬空間,主要是用於簡化我們的spring為JavaBean屬性賦值時的配置。
新增P名稱空間與C名稱空間到schema
xmlns:p="http://www.springframework.org/schema/p"
xmlns:c="http://www.springframework.org/schema/c"
使用P名稱空間和C名稱空間簡化我們的開發
我們上面為屬性賦值的時候可以通過setter方法或者構造方法進行賦值,下面可以對其進行簡化
通過setter方法進行賦值:
<bean id="user" class="com.itheima.main.User" >
<property name="name" value="張三"></property>
<property name="age" value="20"></property>
</bean>
等價於:
<bean id="user" class="com.itheima.main.User" p:name="張三" p:age="20">
</bean>
通過構造方法進行賦值
<bean id="user" class="com.itheima.main.User">
<constructor-arg name="name" value="張三"></constructor-arg>
<constructor-arg name="age" value="20"></constructor-arg>
</bean>
等價於:
<bean id="user" class="com.itheima.main.User" c:name="張三" c:age="20">
</bean>
4、SPEL表示式
Spel表示式,類似於jstl與el表示式的語言,spring可以支援我們在為屬性賦值的時候,通過spel表示式來進行更改我們的屬性值。
5、為集合屬性賦值
建立一個含有集合屬性的JavaBean類
package com.itheima.main;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
public class CollectProperty {
private List list;
private Set set;
private Map map;
private Properties properties;
public List getList() {
return list;
}
public void setList(List list) {
this.list = list;
}
public Set getSet() {
return set;
}
public void setSet(Set set) {
this.set = set;
}
public Map getMap() {
return map;
}
public void setMap(Map map) {
this.map = map;
}
public Properties getProperties() {
return properties;
}
public void setProperties(Properties properties) {
this.properties = properties;
}
}
為集合屬性注入值
<bean id="collectionProperty" class="com.itheima.main.CollectProperty">
<property name="list">
<list>
<value>abc</value>
<value>123</value>
<value>張三</value>
</list>
</property>
<property name="set">
<set>
<value>成龍</value>
<value>劉德華</value>
<value>甄子丹</value>
</set>
</property>
<property name="map">
<map>
<entry key="name" value="張三"></entry>
<entry key="age" value="20"></entry>
</map>
</property>
<property name="properties">
<props>
<prop key="name">張三</prop>
<prop key="age">20</prop>
</props>
</property>
</bean>
相關文章
- Spring框架IOC容器Spring框架
- Spring實現IOC容器的兩種實現方式Spring
- IOC和DI的概念,以及Spring框架的介紹Spring框架
- Quartz.Net系列(十四):詳解Job中兩大特性(DisallowConcurrentExecution、PersistJobDataAfterExecution)quartz
- 淺析Spring Framework框架容器啟動過程SpringFramework框架
- 事務的四大特性,以及隔離級別
- 從Spring中學到的【2】--容器類Spring
- Spring 的容器配置Spring
- Spring的IOC容器Spring
- MySQL 事務的四大特性以及隔離級別MySql
- 盤點 Spring Security 框架中的八大經典設計模式Spring框架設計模式
- spring框架中的名稱空間Spring框架
- Spring框架訪問資料庫的兩種方式的小案例Spring框架資料庫
- Laravel框架的基石就是一個功能強大的 IoC 容器Laravel框架
- Spring Cloud的核心特性SpringCloud
- spring容器Spring
- SSM框架學習之Spring的AOP學習以及資料整理SSM框架Spring
- Spring 系列(二):Spring MVC的父子容器SpringMVC
- Spring(十二):IOC容器中Bean的生命週期方法SpringBean
- 如何訪問Docker容器中的Spring Boot日誌DockerSpring Boot
- WSL2以及容器的坑
- SoloPi 相容 Appium、Macaca 兩大測試框架APPMac框架
- Spring HTTP invoker (spring框架中的一個遠端呼叫模型)SpringHTTP框架模型
- 從原始碼看Spring中IOC容器的實現(二):IOC容器的初始化原始碼Spring
- WEB應用是如何運用Spring的?#①Spring的IOC容器如何在WEB中建立?WebSpring
- Spring框架 - Spring和Spring框架組成Spring框架
- Spring Boot 2.6的新特性Spring Boot
- Spring Bean容器SpringBean
- 理解 MyBatis 是如何在 Spring 容器中初始化的MyBatisSpring
- 淺析 Spring 的IOC容器Spring
- 對Spring IOC容器的思考Spring
- Spring MVCD框架中呼叫HanLP分詞的方法SpringMVC框架HanLP分詞
- gitlab Docker容器建立命令以及從容器中備份gitlab倉庫示例GitlabDocker
- Laravel核心——服務容器的細節特性Laravel
- 解析SSH和SSM兩大框架的組成及其區別SSM框架
- 關於Spring Cloud的核心特性SpringCloud
- Spring Boot 3的新特性 - jrebelSpring Boot
- 關於vue中props特性以及父子之間傳值的總結Vue