網站首頁 編程語言 正文
目錄
一、BeanFactory
1、簡單介紹
2、定義方法
3、主要實現類(包括抽象類)
?4、使用方式
二、FactoryBean
1、簡單介紹
?2、定義方法
3、常用類
4、使用方式
三、主要區別
一、BeanFactory
1、簡單介紹
這個其實是所有Spring Bean的容器根接口,給Spring 的容器定義一套規范,給IOC容器提供了一套完整的規范,比如我們常用到的getBean方法等。
進入到這個類,我們可以看到如下注釋,意思是:訪問Spring bean容器的根接口。
2、定義方法
- getBean(String name):?Spring容器中獲取對應Bean對象的方法,如存在,則返回該對象。
- containsBean(String name):判斷Spring容器中是否存在該對象。
- isSingleton(String name):通過beanName判斷是否為單例對象。
- isPrototype(String name):判斷bean對象是否為多例對象。
- isTypeMatch(String name, ResolvableType typeToMatch):判斷name值獲取出來的bean與typeToMath是否匹配。
- getType(String name):獲取Bean的Class類型。
- getAliases(String name):獲取name所對應的所有的別名。
3、主要實現類(包括抽象類)
- AbstractBeanFactory:抽象Bean工廠,絕大部分的實現類,都是繼承于它。
- DefaultListableBeanFactory:Spring默認的工廠類。
- XmlBeanFactory:前期使用XML配置用的比較多的時候用的Bean工廠。
- AbstractXmlApplicationContext:抽象應用容器上下文對象。
- ClassPathXmlApplicationContext:XML解析上下文對象,用戶創建Bean對象我們早期寫Spring的時候用的就是它。
?4、使用方式
BeanFactory的使用方式有很多,這里就不一一列舉了,具體請查看源碼。
舉一個簡單的例子,使用ClassPathXmlApplicationContext讀取對應的xml文件實例對應上下文對象:
ApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"applicationContext.xml"});
BeanFactory factory = (BeanFactory) context;
二、FactoryBean
1、簡單介紹
該類是SpringIOC容器是創建Bean的一種形式,這種方式創建Bean會有加成方式,融合了簡單的工廠設計模式于裝飾器模式。
* Interface to be implemented by objects used within a {@link BeanFactory} which * are themselves factories for individual objects. If a bean implements this * interface, it is used as a factory for an object to expose, not directly as a * bean instance that will be exposed itself.
有些人就要問了,我直接使用Spring默認方式創建Bean不香么,為啥還要用FactoryBean做啥,在某些情況下,對于實例Bean對象比較復雜的情況下,使用傳統方式創建bean會比較復雜,例如(使用xml配置),這樣就出現了FactoryBean接口,可以讓用戶通過實現該接口來自定義該Bean接口的實例化過程。即包裝一層,將復雜的初始化過程包裝,讓調用者無需關系具體實現細節。
?2、定義方法
- T getObject():返回實例
- Class<?> getObjectType():返回該裝飾對象的Bean的類型
- default boolean isSingleton():Bean是否為單例
3、常用類
- ProxyFactoryBean:Aop代理Bean
- GsonFactoryBean:Gson
4、使用方式
Spring XML方式:
application.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="demo" class="cn.lonecloud.spring.example.bo.Person">
<property name="age" value="10"/>
<property name="name" value="xiaoMing"/>
</bean>
<bean id="demoFromFactory" class="cn.lonecloud.spring.example.bean.PersonFactoryBean">
<property name="initStr" value="10,init from factory"/>
</bean>
</beans>
personFactoryBean
package cn.lonecloud.spring.example.bean;
import cn.lonecloud.spring.example.bo.Person;
import org.springframework.beans.factory.FactoryBean;
import java.util.Objects;
public class PersonFactoryBean implements FactoryBean<Person> {
/**
* 初始化Str
*/
private String initStr;
@Override
public Person getObject() throws Exception {
//這里我需要獲取對應參數
Objects.requireNonNull(initStr);
String[] split = initStr.split(",");
Person p=new Person();
p.setAge(Integer.parseInt(split[0]));
p.setName(split[1]);
//這里可能需要還要有其他復雜事情需要處理
return p;
}
@Override
public Class<?> getObjectType() {
return Person.class;
}
public String getInitStr() {
return initStr;
}
public void setInitStr(String initStr) {
this.initStr = initStr;
}
}
main方法
package cn.lonecloud.spring.example.factory;
import cn.lonecloud.spring.example.bo.Person;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* BeanFactory 例子
*/
public class SpringBeanFactoryMain {
public static void main(String[] args) {
//這個是BeanFactory
BeanFactory beanFactory = new ClassPathXmlApplicationContext("application.xml");
//獲取對應的對象化
Object demo = beanFactory.getBean("demo");
System.out.println(demo instanceof Person);
System.out.println(demo);
//獲取從工廠Bean中獲取對象
Person demoFromFactory = beanFactory.getBean("demoFromFactory", Person.class);
System.out.println(demoFromFactory);
//獲取對應的personFactory
Object bean = beanFactory.getBean("demoFromFactory");
System.out.println(bean instanceof PersonFactoryBean);
PersonFactoryBean factoryBean=(PersonFactoryBean) bean;
System.out.println("初始化參數為:"+factoryBean.getInitStr());
}
}
輸出內容:
true
Person{name='xiaoMing', age=10}
Person{name='init from factory', age=10}
true
初始化參數為:10,init from factory
三、主要區別
- BeanFactory:負責生產和管理Bean的一個工廠接口,提供一個Spring Ioc容器規范。
- FactoryBean:一種Bean創建的一種方式,對Bean的一種擴展。對于復雜的Bean對象初始化創建使用其可封裝對象的創建細節。
原文鏈接:https://evanwang.blog.csdn.net/article/details/122811855
- 上一篇:沒有了
- 下一篇:沒有了
相關推薦
- 2023-02-09 python如何尋找主串中所有指定子串下標_python
- 2022-11-12 Python?sklearn分類決策樹方法詳解_python
- 2022-04-20 Mac中pyenv的安裝與使用教程_python
- 2022-04-21 Docker - Error: Error response from daemon: No com
- 2022-07-01 tensorflow可視化Keras框架中Tensorboard使用示例_python
- 2022-06-12 C#實現基于任務的異步編程模式_C#教程
- 2022-06-23 C#獲取計算機硬件與操作系統的相關信息_C#教程
- 2024-03-09 【Redis】RedisTemplate和StringRedisTemplate的區別
- 欄目分類
-
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支