Spring6當(dāng)中獲取Bean的四種方式小結(jié)
每博一文案
比如:《殺死一只是更鳥(niǎo)》中提到的 對(duì)應(yīng)我們:我們努力升本,考研,每天都在努力學(xué)習(xí),但是某天突然想到萬(wàn)一沒(méi)有考上的話,那現(xiàn)在的努力又有什么意義呢? 答案:在《殺死一只是更鳥(niǎo)》里有這樣一段話: 勇敢是,當(dāng)你還未開(kāi)始,你就知道自己會(huì)輸,可你依然要去做,而且無(wú)論如何都要把它堅(jiān)持到底,你很少能贏,但有時(shí)也會(huì)。努力的這個(gè)過(guò)程本身就是有意義,能夠獲得理想的結(jié)果當(dāng)然很好,但如果失敗了也沒(méi)關(guān)系。因?yàn)槟愕挠赂?,從未辜?fù)你的青春,而黎明的光亮,總有一刻,會(huì)照亮穿梭于黑暗之中的自己。 況且,你還不一定會(huì)輸呢。
Spring 為Bean 的獲取提供了多種方式,通常包括4種方式。(也就是說(shuō)在Spring中為Bean對(duì)象的創(chuàng)建準(zhǔn)備了多種方案,目的是:更加靈活)
- 第一種:通過(guò)構(gòu)造方法實(shí)例化,獲取 Bean對(duì)象
- 第二種:通過(guò)簡(jiǎn)單工廠模式實(shí)例化,獲取Bean對(duì)象
- 第三種:通過(guò)factory-bean 屬性,獲取Bean對(duì)象
- 第四種:通過(guò)對(duì)FactoryBean 接口的實(shí)例化,獲取Bean對(duì)象
1. Spring6 當(dāng)中 獲取 Bean 的四種方式
1.1 第一種方式:通過(guò)構(gòu)造方法獲取 Bean
簡(jiǎn)單的說(shuō):就是通過(guò)在spring的配置文件中,進(jìn)行一個(gè)配置,從而調(diào)取其中 Bean 的構(gòu)成方法,獲取到 對(duì)應(yīng)的Bean對(duì)象。
準(zhǔn)備工作:通過(guò) maven 導(dǎo)入 Spring6的框包
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.rainbowsea</groupId>
<artifactId>spring6-005-bean-instantiation-blog</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>6.0.11</version>
</dependency>
<!-- junit4 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
這里我們創(chuàng)建一個(gè)User 的類(lèi),方便我們進(jìn)行一個(gè),測(cè)試。為了測(cè)試效果,更加明顯,這里這個(gè)User類(lèi)就定義成一個(gè)空的類(lèi)吧

配置相關(guān)的 spring.xml 配置文件信息內(nèi)容,告知 Spirng 框架,幫我們進(jìn)行一個(gè)管理。

<?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">
<!-- 第一種: 通過(guò)構(gòu)造方法獲取 Bean -->
<bean id="user" class="com.rainbowsea.Bean.User"></bean>
</beans>
運(yùn)行測(cè)試,看是否能夠,獲取到我們想要的這個(gè) User 類(lèi)對(duì)象。

import com.rainbowsea.Bean.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
@org.junit.Test
public void test() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring6.xml");
User user = applicationContext.getBean("user", User.class);
System.out.println(user);
}
}
從上述結(jié)果,我們通過(guò)構(gòu)造方法,獲取到了 Bean 對(duì)象。
1.2 第二種方式:通過(guò)簡(jiǎn)單工廠模式獲取 Bean
第一步: 定義一個(gè)Bean,還是使用 User 對(duì)象

外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳 第二步: 編寫(xiě)簡(jiǎn)單工廠模式當(dāng)中的工廠類(lèi)。
注意: 這里的 User 對(duì)象,本質(zhì)上,還是我們程序員自己給 new 出來(lái)的,并不是 Spring 幫我們弄的。

/**
* 特點(diǎn):它是簡(jiǎn)單工廠模式(靜態(tài)工廠模式),是靜態(tài)的一個(gè)方法
*
*/
public class UserFactory {
public static User get() {
// 本質(zhì)上,還是我們自己程序員自己 new 出來(lái)的
return new User();
}
}
第三步:在Spring配置文件中指定創(chuàng)建該Bean的方法(使用factory-method屬性指定)
通過(guò)簡(jiǎn)單工廠模式,你需要在Spring當(dāng)中配置文件種告訴 Spring框架,調(diào)用哪個(gè)類(lèi)當(dāng)中的哪個(gè)方法可以獲取到這個(gè)你要的 Bean; factory-method 指明方法()對(duì)應(yīng)方法的小寫(xiě)。
factory-method=屬性我們這里指定的是 UserFactory 工廠類(lèi)當(dāng)中靜態(tài)方法,也就是告訴Spring 框架,調(diào)用方法可以獲取到你要的Bean 對(duì)象。

<?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">
<!-- 第二種: 通過(guò)簡(jiǎn)單工廠模式,你需要在Spring當(dāng)中配置文件種告訴 Spring框架,調(diào)用哪個(gè)類(lèi)當(dāng)中的哪個(gè)方法可以獲取到這個(gè)
你要的 Bean; factory-method 指明方法()對(duì)應(yīng)方法的小寫(xiě) -->
<!-- factory-method= 屬性指定的時(shí)工廠類(lèi)當(dāng)中靜態(tài)方法,也就是告訴Spring 框架,調(diào)用方法可以獲取到你要的
Bean-->
<bean id="userFactory" class="com.rainbowsea.Bean.UserFactory" factory-method="get"></bean>
</beans>
第四步: 編寫(xiě)測(cè)試程序


通過(guò): 這樣一個(gè)配置,就讓我們告知了 Spring 框架,你調(diào)用那個(gè)類(lèi)當(dāng)中的哪里方法,就可以獲取到我們想要的Bean 對(duì)象。
1.3 第三種方式:通過(guò) factory-bean 屬性獲取 Bean
使用 factory-bean 屬性獲取 Bean,本質(zhì)上是,使用23種設(shè)計(jì)模式當(dāng)中的工廠方法模式(注意,這里沒(méi)有錯(cuò),不了解的,可能會(huì)認(rèn)為是,我寫(xiě)錯(cuò)了,并沒(méi)有寫(xiě)錯(cuò)這里)。
**第一步:**定義一個(gè) Bean 對(duì)象。這里我們還是使用 User 這里類(lèi),進(jìn)行試驗(yàn)。

第二步: 既然是工廠方法模式,自然是少不了,工廠了。需要注意 :這里是工廠方法模式,與靜態(tài)工廠模式不同,這個(gè)生產(chǎn) Bena 對(duì)象的方法,不是靜態(tài)方法,而是實(shí)例化方法 。這也導(dǎo)致了,我們?cè)诮酉聛?lái)后續(xù)的 spring.xml 配置文件上與第二種 方式有所差異的。注意其中的差異,所使用的標(biāo)簽,不要弄錯(cuò)了。

package com.rainbowsea.Bean;
/**
* 特點(diǎn):它是簡(jiǎn)單工廠模式(靜態(tài)工廠模式),是靜態(tài)的一個(gè)方法
*
*/
public class UserFactory {
// 工廠方法模式中的具體工廠角色中的方法是:實(shí)例方法
public User get() {
// 相同點(diǎn)是和靜態(tài)工廠方法模式是一樣的:都是我們自己程序員 new 的。
// 然后交給 Spring框架管理
return new User();
}
}
**第三步:**在Spring配置文件中指定factory-bean以及factory-method
上面我們說(shuō)到,工廠方法模式與靜態(tài)方法模式,不同點(diǎn),上是工廠方法模式生產(chǎn)Bean 對(duì)象的方法,并不是一個(gè) static() 方法 ,所以,使用的標(biāo)簽屬性就有所不同了。
這里我們需要用到以下,兩個(gè)標(biāo)簽屬性,才能讓spirng 準(zhǔn)確的調(diào)用哪個(gè)類(lèi)當(dāng)中的哪個(gè)對(duì)象的方法,獲取,返回給我們自己想要的 Bean 對(duì)象,這里是User 這個(gè) bean對(duì)象。
- factory-bean 指明哪個(gè)對(duì)象
- factory-method當(dāng)中的哪個(gè)方法;可以獲取到你想要的 bean
簡(jiǎn)單的說(shuō):告訴Spring 通過(guò)哪個(gè)對(duì)象,當(dāng)中的哪個(gè)方法,可以獲取到我想要的 Bean 對(duì)象 。

<?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">
<!-- 第三種:通過(guò)Spring提供的實(shí)例化方式,通過(guò)工廠方法模式,通過(guò)
factory-bean 指明哪個(gè)對(duì)象+factory-method當(dāng)中的哪個(gè)方法;可以獲取到你想要的 bean-->
<!-- 簡(jiǎn)單的說(shuō):就是告訴Spring框架,調(diào)用哪個(gè)對(duì)象中的哪個(gè)方法,就可以獲取到你想要的 Bean了-->
<bean id="userFactory" class="com.rainbowsea.Bean.UserFactory"> </bean>
<!-- 以下的配置很關(guān)鍵: factory-bean:告訴Spring框架調(diào)用哪個(gè)對(duì)象; factory-method 告訴Spring框架
調(diào)用哪個(gè)方法,可以獲取到你要的Bean-->
<bean id="userBean" factory-bean="userFactory" factory-method="get"></bean>
</beans>
第四步: 測(cè)試運(yùn)行結(jié)果。

import com.rainbowsea.Bean.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
@org.junit.Test
public void test() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring6.xml");
User user = applicationContext.getBean("userBean", User.class);
System.out.println(user);
}
}
1.4 第四種方式:通過(guò) FactoryBean 接口 獲取 Bean
以上的第三種方式中,factory-bean的屬性值是我們自定義的,factory-method的屬性值也是我們自己定義的。
在Spring中,當(dāng)你編寫(xiě)的類(lèi)直接實(shí)現(xiàn)FactoryBean接口之后,factory-bean不需要指定了,factory-method也不需要指定了。
factory-bean會(huì)自動(dòng)指向?qū)崿F(xiàn)FactoryBean接口的類(lèi),factory-method會(huì)自動(dòng)指向getObject()方法。

package org.springframework.beans.factory;
import org.springframework.lang.Nullable;
public interface FactoryBean<T> {
String OBJECT_TYPE_ATTRIBUTE = "factoryBeanObjectType";
@Nullable
T getObject() throws Exception;
@Nullable
Class<?> getObjectType();
default boolean isSingleton() {
return true;
}
}
第四種方式:簡(jiǎn)單的說(shuō):就是對(duì)第三種方式的一種簡(jiǎn)化,通過(guò)讓對(duì)應(yīng)的工廠類(lèi)是實(shí)現(xiàn)該接口implements FactoryBean ,Spring就知道該調(diào)用哪個(gè)對(duì)象,中的哪個(gè)方法,獲取到你要的 Bean 對(duì)象了 。從到到達(dá)了某種程度上的簡(jiǎn)化。
第一步: 定義一個(gè)Bean
這里我們還是使用 User 這里類(lèi),進(jìn)行試驗(yàn)。

第二步: 編寫(xiě)一個(gè)(工廠模式當(dāng)中的)工廠類(lèi)實(shí)現(xiàn) FactoryBean接口
下面,我們來(lái)了解一下,F(xiàn)actoryBean接口下的這個(gè)三個(gè)方法的作用是干啥的
// 返回我們所需要的 Bean 對(duì)象 T getObject() throws Exception;
例如:注意一點(diǎn):這里還是需要我們自己 new() 出對(duì)應(yīng)所需要的 Bean 對(duì)象,而不是 Spirng 弄出來(lái)的
@Override
public User getObject() throws Exception {
return new User(); // 還是需要我們程序員自己 new() 出來(lái)
}
/**
* 這個(gè)方法在接口中有默認(rèn)實(shí)現(xiàn)
* 默認(rèn)返回 true,表示單例的
* 如果想多例的化,直接講這個(gè)修改為: return false 即可。
* @return
*/
default boolean isSingleton() {
return true;
}
例如:
@Override
public boolean isSingleton() {
return true; // 單例
}
這里我們定義了一個(gè) UserFactory 產(chǎn)生 User 的對(duì)象的工廠類(lèi),同時(shí)實(shí)現(xiàn)implements FactoryBean 該接口。

package com.rainbowsea.Bean;
import org.springframework.beans.factory.FactoryBean;
/**
* 特點(diǎn):它是簡(jiǎn)單工廠模式(靜態(tài)工廠模式),是靜態(tài)的一個(gè)方法
*
*/
public class UserFactory implements FactoryBean<User> {
@Override
public User getObject() throws Exception {
// 本質(zhì)上還是我們程序員自己 new ()出來(lái)的,并不是 Spring 弄出來(lái)
return new User();
}
// 這個(gè)方法可以不用管它。
@Override
public Class<?> getObjectType() {
return null;
}
@Override
public boolean isSingleton() {
return true; // 單例
// false 多例
}
}
**第三步:**在Spring配置文件中配置FactoryBean
由于我們這個(gè)public class UserFactory implements FactoryBean 生產(chǎn) User 的工廠實(shí)現(xiàn)了 FactoryBean 接口,Spring 已經(jīng)是知道,我們需要調(diào)用的是哪個(gè)對(duì)象當(dāng)中的哪個(gè)方法,從而獲取對(duì)應(yīng)的 user Bean對(duì)象了。所以對(duì)應(yīng)其中的
spinrg.xml只需要簡(jiǎn)單的配置一下,即可。
如下:

將方式的核心就在于:通過(guò)一個(gè)特殊的Bean(工廠Bean當(dāng)中的方法)<該工廠實(shí)現(xiàn)了 FactoryBean 接口 >,來(lái)返回一個(gè)普通的Bean 對(duì)象。
<?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">
<!-- Spring框架中:獲取Bean的第四種方式:通過(guò) FactoryBean 接口來(lái)實(shí)現(xiàn)指明 -->
<!-- 這種方式實(shí)際上就是第三種方式的簡(jiǎn)化-->
<!-- 由于你編寫(xiě)的類(lèi)實(shí)現(xiàn)了FactoryBean接口,那么這個(gè)類(lèi)就是一個(gè)特殊的類(lèi),不需要你再手動(dòng)指定: factory-bean;
factory-method 哪個(gè)對(duì)象,哪個(gè)方法了,你實(shí)現(xiàn)了 FactoryBean 接口,Spring框架就已經(jīng)知道了,不需要再特殊指明了-->
<!-- 剩下指明是哪個(gè)特殊的類(lèi)就可以了-->
<!-- 通過(guò)一個(gè)特殊的Bean,工廠Bean,來(lái)返回一個(gè)普通的Bean person對(duì)象-->
<bean id="userFactory" class="com.rainbowsea.Bean.UserFactory"></bean>
</beans>

第四步: 運(yùn)行程序測(cè)試。

package com.rainbowsea.test;
import com.rainbowsea.Bean.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
@org.junit.Test
public void test() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring6.xml");
User user = applicationContext.getBean("userFactory", User.class);
System.out.println(user);
}
}
FactoryBean在Spring中是一個(gè)接口。被稱(chēng)為“工廠Bean”。“工廠Bean(通過(guò)工廠上的方法返回一個(gè) 對(duì)應(yīng)的 Bean 對(duì)象)”是一種特殊的Bean。所有的“工廠Bean”都是用來(lái)協(xié)助Spring框架來(lái)創(chuàng)建其他Bean對(duì)象的。
1.5 BeanFactroy 和 FactroyBean 的區(qū)別
BeanFactory
Spring IoC容器的頂級(jí)對(duì)象,BeanFactory被翻譯為“Bean工廠”,在Spring的IoC容器中,“Bean工廠”負(fù)責(zé)創(chuàng)建Bean對(duì)象。 BeanFactory是工廠。

FactoryBean
FactoryBean:它是一個(gè)Bean,是一個(gè)能夠輔助Spring實(shí)例化其它Bean對(duì)象的一個(gè)Bean。
第一類(lèi):普通Bean第二類(lèi):工廠Bean(記?。汗SBean也是一種Bean,只不過(guò)這種Bean,比較特殊工廠Bean(通過(guò)工廠上的方法返回一個(gè) 對(duì)應(yīng)的 Bean 對(duì)象),從而到達(dá)輔助Spring實(shí)例化其它Bean對(duì)象的效果。)
在Spring中,Bean可以分為兩類(lèi):
2. 將Date 作為復(fù)雜類(lèi)型進(jìn)行注入(可以自定義 Date 時(shí)間類(lèi)型的格式)
在Spring 當(dāng)中 為什么要將 Date 作為復(fù)雜類(lèi)型進(jìn)行注入呢?
原因是,在Spring 如果將 Date 作為簡(jiǎn)單類(lèi)型進(jìn)行注入的話,需要特定的時(shí)間格式,才能注入成功。
準(zhǔn)備工作:定義一個(gè) Bean 類(lèi),同時(shí)其中含有一個(gè) Date 類(lèi)型的屬性值。
package com.rainbowsea.Bean.myDate;
import java.util.Date;
public class Vip {
private Date birth;
public Vip(Date birth) {
this.birth = birth;
}
public Vip() {
}
public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
@Override
public String toString() {
return "Vip{" +
"birth=" + birth +
'}';
}
}
演示如下:

警告: Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘vipBean’ defined in class path resource [spring2.xml]: Failed to convert property value of type ‘java.lang.String’ to required type ‘java.util.Date’ for property ‘birth’; Cannot convert value of type ‘java.lang.String’ to required type ‘java.util.Date’ for property ‘birth’: no matching editors or conversion strategy found
對(duì)應(yīng)Spring當(dāng)中的 Date 作為簡(jiǎn)單類(lèi)型的注入,需要用如下它美國(guó)的格式時(shí)間格式,才能被識(shí)別為 Date 類(lèi)型。特殊格式如下:
Mon Apr 29 20:03:58 CST 2024

雖然轉(zhuǎn)化成功了,但是這個(gè)格式,對(duì)于我們國(guó)人來(lái)說(shuō),不太友好,而且也不好記憶。
所以為了將Date 類(lèi)型轉(zhuǎn)化為我們國(guó)人友好的類(lèi)型的格式,我們就需要將 Date 定義為 復(fù)雜類(lèi)型
進(jìn)行 ref 注入。但是怎樣將 Date 作為復(fù)雜類(lèi)型注入的同時(shí)又可以轉(zhuǎn)換為我們需要的格式呢。——這就需要用到上面我們所學(xué)習(xí)的通過(guò) FactoryBean接口 獲取 Bean 對(duì)象了。其實(shí)呢,上面第二種方式,第三種方式,第四種方式都是可以實(shí)現(xiàn)的。但是第四種方式比較簡(jiǎn)化,我們這里就用第四種方式來(lái)解決。這個(gè)問(wèn)題。
第一步: 定義一個(gè)含有 Date 類(lèi)型的類(lèi),就還是使用上面哪個(gè) Vip 類(lèi)吧

第二步: 創(chuàng)建一個(gè)用于生產(chǎn)我們所需要的格式的 Date的工廠 同時(shí)該工廠又實(shí)現(xiàn)了 implements FactoryBean 接口。告訴Spring框架,調(diào)用其中的哪個(gè)對(duì)象當(dāng)中的哪個(gè)方法,獲取到我們所需要的 Date 對(duì)象。

package com.rainbowsea.Bean.myDate;
import org.springframework.beans.factory.FactoryBean;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* Date 工廠模式
* DateFactoryBean 這個(gè)工廠Bean 協(xié)助我們Spring 創(chuàng)建這個(gè)普通的Bean;Date
*/
public class DateFactor implements FactoryBean<Date> {
// 這個(gè) String字符串類(lèi)型,作為我們Date類(lèi)型,進(jìn)行一個(gè)轉(zhuǎn)換
private String strDate;
public DateFactor() {
}
public DateFactor(String strDate) {
this.strDate = strDate;
}
public String getStrDate() {
return strDate;
}
public void setStrDate(String strDate) {
this.strDate = strDate;
}
@Override
public Date getObject() throws Exception {
// 通過(guò) SimpleDateFormat 來(lái)自定義我們的 Date 的日期時(shí)間類(lèi)型的格式
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
// 通過(guò)在 spring.xml 對(duì)DateFactor類(lèi)當(dāng)中的 String strDate 屬性進(jìn)行賦值
Date date = simpleDateFormat.parse(this.strDate); // 將字符串類(lèi)型轉(zhuǎn)換為 Date 日期時(shí)間類(lèi)型
return date; // 轉(zhuǎn)換后返回 Date 類(lèi)型,進(jìn)行一個(gè)賦值操作
}
@Override
public Class<?> getObjectType() {
return null;
}
@Override
public boolean isSingleton() {
return true; // 單例 false 多例
}
}
上述代碼的核心代碼片段講解:
// 這個(gè) String字符串類(lèi)型,作為我們Date類(lèi)型,進(jìn)行一個(gè)轉(zhuǎn)換
private String strDate;
public Date getObject() throws Exception {
// 通過(guò) SimpleDateFormat 來(lái)自定義我們的 Date 的日期時(shí)間類(lèi)型的格式
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
// 通過(guò)在 spring.xml 對(duì)DateFactor類(lèi)當(dāng)中的 String strDate 屬性進(jìn)行賦值
Date date = simpleDateFormat.parse(this.strDate); // 將字符串類(lèi)型轉(zhuǎn)換為 Date 日期時(shí)間類(lèi)型
return date; // 轉(zhuǎn)換后返回 Date 類(lèi)型,進(jìn)行一個(gè)賦值操作
}

通過(guò)定義一個(gè)Date 類(lèi)型的工廠類(lèi) 生產(chǎn)出,我們需要的格式的 Date 類(lèi)型。
第三步: 為我們這個(gè) 工廠類(lèi)(生產(chǎn)我們所需的Date日期類(lèi)型格式),配置到 Spring 當(dāng)中去,并讓 Spirng 框架返回一個(gè)我們需要的 Date類(lèi)型的 Bean 對(duì)象,同時(shí)作為復(fù)雜類(lèi)型,賦值到 Vip 這個(gè)類(lèi)當(dāng)中的 birth 屬性的值。


<?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">
<!-- 指明通過(guò)DateFactor 獲取到一個(gè)我們所需要的格式的 Date 類(lèi)型-->
<bean id="myDateBean" class="com.rainbowsea.Bean.myDate.DateFactor">
<property name="strDate" value="1980-01-01"></property>
</bean>
<!-- 獲取到之后,作為復(fù)雜類(lèi)型,賦值給 Vip 當(dāng)中的 Date birth 屬性值-->
<bean id="vipBean" class="com.rainbowsea.Bean.myDate.Vip">
<property name="birth" ref="myDateBean"></property>
</bean>
</beans>
第四步: 運(yùn)行程序測(cè)試

核心要素就是:通過(guò)一個(gè)(這里時(shí)生產(chǎn)我們所需格式的 Date 類(lèi)型的)工廠類(lèi)實(shí)現(xiàn) FactoryBean接口,被稱(chēng)為“工廠Bean”。“工廠Bean(通過(guò)工廠上的方法返回一個(gè)對(duì)應(yīng)的 Bean(這里時(shí) Date ) 對(duì)象)”是一種特殊的Bean。獲取到對(duì)應(yīng) Date 后,再作為 復(fù)雜類(lèi)型作為其他類(lèi)上的屬性的值存在。
3. 總結(jié)
第一種通過(guò)構(gòu)造方法獲取 Bean:簡(jiǎn)單的說(shuō):就是通過(guò)在spring的配置文件中,進(jìn)行一個(gè)配置,從而調(diào)取其中 Bean 的構(gòu)成方法,獲取到 對(duì)應(yīng)的Bean對(duì)象。
第二種方式:通過(guò)簡(jiǎn)單工廠模式獲取 Bean;注意時(shí)工廠類(lèi)中生產(chǎn)對(duì)應(yīng)的Bean對(duì)象是靜態(tài)方法()。同時(shí)其中的 Bean 本質(zhì)上還是程序員自己 new()出來(lái)的。
通過(guò)簡(jiǎn)單工廠模式,你需要在Spring當(dāng)中配置文件種告訴 Spring框架,調(diào)用哪個(gè)類(lèi)當(dāng)中的哪個(gè)方法可以獲取到這個(gè)你要的 Bean; factory-method 指明方法()對(duì)應(yīng)方法的小寫(xiě)。
factory-method=屬性我們這里指定的是 UserFactory 工廠類(lèi)當(dāng)中靜態(tài)方法,也就是告訴Spring 框架,調(diào)用方法可以獲取到你要的Bean 對(duì)象。第三種方式:通過(guò) factory-bean 屬性獲取 Bean;使用 factory-bean 屬性獲取 Bean,本質(zhì)上是,使用23種設(shè)計(jì)模式當(dāng)中的工廠方法模式。(注意 其中的工廠類(lèi)當(dāng)中的生產(chǎn)對(duì)應(yīng) Bean的方法是實(shí)例方法(不是靜態(tài)方法),其中的 Bean 本質(zhì)上還是程序員自己 new()出來(lái)的 )
這里我們需要用到以下,兩個(gè)標(biāo)簽屬性,才能讓spirng 準(zhǔn)確的調(diào)用哪個(gè)類(lèi)當(dāng)中的哪個(gè)對(duì)象的方法,獲取,返回給我們自己想要的 Bean 對(duì)象,這里是User 這個(gè) bean對(duì)象。 factory-bean 指明哪個(gè)對(duì)象factory-method當(dāng)中的哪個(gè)方法;可以獲取到你想要的 bean第四種方式:通過(guò) FactoryBean 接口 獲取 Bean;簡(jiǎn)單的說(shuō):就是對(duì)第三種方式的一種簡(jiǎn)化,通過(guò)讓對(duì)應(yīng)的工廠類(lèi)是實(shí)現(xiàn)該接口implements FactoryBean ,Spring就知道該調(diào)用哪個(gè)對(duì)象,中的哪個(gè)方法,獲取到你要的 Bean 對(duì)象了 。從到到達(dá)了某種程度上的簡(jiǎn)化。
該方式的核心就在于:通過(guò)一個(gè)特殊的Bean(工廠Bean當(dāng)中的方法)<該工廠實(shí)現(xiàn)了 FactoryBean 接口 >,來(lái)返回一個(gè)普通的Bean 對(duì)象。BeanFactroy 和 FactroyBean 的區(qū)別
將Date 作為復(fù)雜類(lèi)型進(jìn)行注入(可以自定義 Date 時(shí)間類(lèi)型的格式);
對(duì)應(yīng)Spring當(dāng)中的 Date 作為簡(jiǎn)單類(lèi)型的注入,需要用如下它美國(guó)的格式時(shí)間格式,才能被識(shí)別為 Date 類(lèi)型。
核心要素就是:通過(guò)一個(gè)(這里時(shí)生產(chǎn)我們所需格式的 Date 類(lèi)型的)工廠類(lèi)實(shí)現(xiàn) FactoryBean接口,被稱(chēng)為“工廠Bean”。“工廠Bean(通過(guò)工廠上的方法返回一個(gè)對(duì)應(yīng)的 Bean(這里時(shí) Date ) 對(duì)象)”是一種特殊的Bean。獲取到對(duì)應(yīng) Date 后,再作為 復(fù)雜類(lèi)型作為其他類(lèi)上的屬性的值存在。
4. 最后:
以上就是Spring6當(dāng)中獲取Bean的四種方式小結(jié)的詳細(xì)內(nèi)容,更多關(guān)于Spring6獲取Bean的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java Swing組件實(shí)現(xiàn)進(jìn)度監(jiān)視功能示例
這篇文章主要介紹了Java Swing組件實(shí)現(xiàn)進(jìn)度監(jiān)視功能,結(jié)合完整實(shí)例形式詳細(xì)分析了Java基于Swing組件實(shí)現(xiàn)進(jìn)度條顯示功能的具體操作技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下2018-02-02
java實(shí)現(xiàn)讀取jar包中配置文件的幾種方式
本文主要介紹了java實(shí)現(xiàn)讀取jar包中配置文件的幾種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06
在Window系統(tǒng)下安裝Netbeans9的方法
今天小編就為大家分享一篇關(guān)于在Window系統(tǒng)下安裝Netbeans9的方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12
SpringCloud Nacos作為配置中心超詳細(xì)講解
這篇文章主要介紹了Springcloud中的Nacos作為配置中心,本文以用戶微服務(wù)為例,進(jìn)行統(tǒng)一的配置,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-12-12
Java?SE循環(huán)一些基本練習(xí)題總結(jié)
循環(huán)語(yǔ)句可以在滿足循環(huán)條件的情況下,反復(fù)執(zhí)行某一段代碼,這段被重復(fù)執(zhí)行的代碼被稱(chēng)為循環(huán)體語(yǔ)句,下面這篇文章主要給大家總結(jié)介紹了關(guān)于Java?SE循環(huán)一些基本練習(xí)題,需要的朋友可以參考下2024-03-03
SimpleDateFormat線程安全問(wèn)題排查詳解
這篇文章主要為大家介紹了SimpleDateFormat線程安全問(wèn)題排查詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11

