??前言
Spring 是?個(gè)包含了眾多?具?法的 IoC 容器,它具備以下兩個(gè)最基本的功能:
-
將對(duì)象存儲(chǔ)到容器(Spring)中;
-
從容器中將對(duì)象取出來(lái)。
在 Java 語(yǔ)?中對(duì)象也叫做 Bean,所以下文中提到的對(duì)象我們以 Bean 著稱
??創(chuàng)建 Spring 項(xiàng)?
接下來(lái)使? Maven ?式來(lái)創(chuàng)建?個(gè) Spring 項(xiàng)?,創(chuàng)建 Spring 項(xiàng)?和 Servlet 類(lèi)似,總共分為以下 3步:
-
創(chuàng)建?個(gè)普通 Maven 項(xiàng)?。
-
添加 Spring 框架?持(spring-context、spring-beans)。
-
添加啟動(dòng)類(lèi)。
??創(chuàng)建?個(gè) Maven 項(xiàng)?
??添加 Spring 框架?持
我們需要添加的框架有
- spring-context:spring 上下?
- spring-beans:管理對(duì)象的模塊。
添加支持代碼如下:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
</dependencies>
如果此處添加后,出現(xiàn)問(wèn)題,說(shuō)明 Maven jar 包下載失敗
相關(guān)解決問(wèn)題請(qǐng)看博主關(guān)于《【JavaEE進(jìn)階】 Maven jar 包下載失敗問(wèn)題的解決方法》的講解
??添加啟動(dòng)類(lèi)
最后在創(chuàng)建好的項(xiàng)? java ?件夾下創(chuàng)建?個(gè)啟動(dòng)類(lèi),包含 main ?法即可
??存儲(chǔ) Bean 對(duì)象
存儲(chǔ) Bean 分為以下 2 步:
- 存儲(chǔ) Bean 之前,先得有 Bean 才?,因此先要?jiǎng)?chuàng)建?個(gè) Bean。
- 將創(chuàng)建的 Bean 注冊(cè)到 Spring 容器中。
具體實(shí)現(xiàn)如下。
??創(chuàng)建Bean
所謂的 Bean 就是 Java 語(yǔ)?中的?個(gè)普通對(duì)象,實(shí)現(xiàn)代碼如下:
??將 Bean 注冊(cè)到容器
在創(chuàng)建好的項(xiàng)?中添加 Spring 配置?件 spring-config.xml,將此?件放到resources 的根?錄下,如下圖所示
Spring 配置?件 spring-config.xml 的固定格式為以下內(nèi)容:
<?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">
</beans>
接下來(lái),再將 User 對(duì)象注冊(cè)到 Spring 中就可以,具體操作是在 中添加如下配置
??獲取并使? Bean 對(duì)象
獲取并使? Bean 對(duì)象,分為以下 3 步:
-
得到 Spring 上下?對(duì)象,因?yàn)閷?duì)象都交給 Spring 管理了,所以獲取對(duì)象要從 Spring 中獲取,那么就得先得到 Spring 的上下?。
-
通過(guò) Spring 上下?,獲取某?個(gè)指定的 Bean 對(duì)象。
-
使? Bean 對(duì)象
如果取多個(gè) Bean 的話重復(fù)以上第 2、3 步驟。
??創(chuàng)建 Spring 上下?
Spring 上下?對(duì)象可使? ApplicationContext,實(shí)現(xiàn)代碼如下:
// 1.得到 Spring 的上下?對(duì)象,創(chuàng)建的時(shí)候需要配置 Spring 配置信息
ApplicationContext context = new ClassPathXmlApplicationContext("spring-con-fig.xml");
??獲取指定的 Bean 對(duì)象
這里我們用 getBean() 這個(gè)方法來(lái)進(jìn)行獲取
使用方法我們這里分為三個(gè)使用方法:
??使用id獲取
由于返回的是一個(gè)Object類(lèi)
所以我們這里需要進(jìn)行強(qiáng)轉(zhuǎn)一下
使用如下:
// 1.得到 Spring 上下?對(duì)象
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
// 2.加載某個(gè) bean
User user = (User) context.getBean("user");
??根據(jù)類(lèi)型獲取 Bean
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
User user = context.getBean(User.class);
注意:
- 這種方式由于只是根據(jù)類(lèi)型獲取的,當(dāng)有?個(gè)類(lèi)型被重復(fù)注冊(cè)到 spring-config.xml 中時(shí),只能使?根據(jù)名稱獲取了,如果有兩個(gè)對(duì)象,則就會(huì)報(bào)錯(cuò)
??id+ 類(lèi)型獲取 Bean
這種方法與第一種沒(méi)有什么太大的區(qū)別,不過(guò)這里的 getBean() 方法返回值是泛型,所以這里不涉及強(qiáng)轉(zhuǎn)
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
User user = context.getBean("user",User.class);
??使? Bean
直接使用該對(duì)象所有的方法和屬性即可
?? BeanFactory 與 ApplicationContext 的區(qū)別
除了 ApplicationContext 之外,我們還可以使? BeanFactory 來(lái)作為 Spring 的上下?,如下代碼所示:
BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("springconfig.xml"));
后續(xù)的Bean的獲取和使用與ApplicationContext是一樣
ApplicationContext 屬于 BeanFactory 的?類(lèi),它們的區(qū)別如下
??繼承關(guān)系和功能??
Spring 容器有兩個(gè)頂級(jí)的接?:BeanFactory 和ApplicationContext。
其中 BeanFactory 提供了基礎(chǔ)的訪問(wèn)容器的能?,? ApplicationContext 屬于 BeanFactory 的?類(lèi)
它除了繼承了 BeanFactory 的所有功能之外,它還擁有獨(dú)特的特性,還添加了對(duì)國(guó)際化?持、資源訪問(wèn)?持、以及事件傳播等??的?持
??性能??
ApplicationContext 是?次性加載并初始化所有的 Bean 對(duì)象,?BeanFactory 是需要那個(gè)才去加載那個(gè),因此更加輕量
舉例驗(yàn)證如下:
創(chuàng)建兩個(gè)對(duì)象如下:
User類(lèi)
public class User {
public User() {
System.out.println("我是User的構(gòu)造方法!?。?);
}
public String greet() {
return "Hello User";
}
}
User2類(lèi)
public class User2 {
public User2() {
System.out.println("我是User2的構(gòu)造方法?。?!");
}
public String greet() {
return "Hello User2";
}
}
配置文件如下:
ApplicationContext 獲取上下文代碼如下:
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestMain {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
System.out.println("ApplicationContext加載getBean()前!!!");
User user = context.getBean("user",User.class);
System.out.println(user.greet());
User2 user2 = context.getBean("user2",User2.class);
System.out.println(user2.greet());
}
}
BeanFactory 獲取上下文代碼如下
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
public class TestMain {
public static void main(String[] args) {
BeanFactory context = new XmlBeanFactory(new ClassPathResource("spring-config.xml"));
System.out.println("BeanFactory加載getBean()前!!!");
User user = context.getBean("user",User.class);
System.out.println(user.greet());
User2 user2 = context.getBean("user2",User2.class);
System.out.println(user2.greet());
}
}
我們利用兩份相同的代碼來(lái)看看執(zhí)行的效果,從而理解ApplicationContext 與 BeanFactory 的區(qū)別,執(zhí)行結(jié)果與區(qū)別如下:
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-752525.html
?總結(jié)
關(guān)于《【JavaEE進(jìn)階】 Spring 的創(chuàng)建和使?》就講解到這兒,感謝大家的支持,歡迎各位留言交流以及批評(píng)指正,如果文章對(duì)您有幫助或者覺(jué)得作者寫(xiě)的還不錯(cuò)可以點(diǎn)一下關(guān)注,點(diǎn)贊,收藏支持一下!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-752525.html
到了這里,關(guān)于【JavaEE進(jìn)階】 Spring 的創(chuàng)建和使?的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!