亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發(fā) > Java > 正文

Spring中BeanFactory與FactoryBean接口的區(qū)別詳解

2024-07-14 08:43:55
字體:
供稿:網(wǎng)友

前言

Spring框架中的BeanFactory接口和FactoryBean接口因為名稱相似,老是容易搞混淆,而且也是面試過程中經(jīng)常會碰到的一個問題。所以本文就專門給大家整理出來。

一、BeanFactory接口

BeanFactory接口是Spring容器的核心接口,負責(zé):實例化、定位、配置應(yīng)用程序中的對象及建立這些對象間的依賴。

Spring,BeanFactory,FactoryBean

Spring為我們提供了許多易用的BeanFactory實現(xiàn),XmlBeanFactory就是常用的一個,該實現(xiàn)將以XML方式描述組成應(yīng)用的對象及對象間的依賴關(guān)系。XmlBeanFactory類將持有此XML配置元數(shù)據(jù),并用它來構(gòu)建一個完全可配置的系統(tǒng)或應(yīng)用。

BeanFactory bf = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));Object bean = bf.getBean(IUserService.class);System.out.println(bean);

接口中定義的方法

public interface BeanFactory { String FACTORY_BEAN_PREFIX = "&"; Object getBean(String name) throws BeansException; <T> T getBean(String name, Class<T> requiredType) throws BeansException; Object getBean(String name, Object... args) throws BeansException; <T> T getBean(Class<T> requiredType) throws BeansException; <T> T getBean(Class<T> requiredType, Object... args) throws BeansException; boolean containsBean(String name); boolean isSingleton(String name) throws NoSuchBeanDefinitionException; boolean isPrototype(String name) throws NoSuchBeanDefinitionException; boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException; boolean isTypeMatch(String name, Class<?> typeToMatch) throws NoSuchBeanDefinitionException; Class<?> getType(String name) throws NoSuchBeanDefinitionException; String[] getAliases(String name);}

二、FactoryBean接口

BeanFactory接口是Spring的核心接口。功能非常復(fù)雜,這個時候如果我們想要編寫一些比較復(fù)雜點兒的邏輯就會觸及到其他一些不必要的接口,不好實現(xiàn)。這時候使用FactoryBean就比較方便了。FactoryBean以Bean結(jié)尾是個Bean對象,不是工廠。接口中定義的方法如下:

public interface FactoryBean<T> { /**  * 返回對象的實例  */ T getObject() throws Exception; /**  * 返回對象的類型  */ Class<?> getObjectType(); /**  * 是否是單例  */ boolean isSingleton();}

1.簡單實現(xiàn)

接口和實現(xiàn)類

public interface IUserService { public void doSome();}
public class UserServiceImpl implements IUserService { public UserServiceImpl(){  System.out.println("--被實例化了--"); } @Override public void doSome() {  System.out.println("UserServiceImpl 。。。 被執(zhí)行了"); }}

自定義FactoryBean

public class MyFactoryBean implements FactoryBean<IUserService>{ @Override public IUserService getObject() throws Exception {  System.out.println("--IUserService實例化之前---");  IUserService service = new UserServiceImpl();  System.out.println("--IUserService實例化后---");  return service; } @Override public Class<?> getObjectType() {  return IUserService.class; } @Override public boolean isSingleton() {  return true; }}

配置文件

<?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="myFactoryBean" class="com.dpb.factorybean.MyFactoryBean"/></beans>

測試--通過類型獲取

@Testpublic void test1() { BeanFactory bf = new XmlBeanFactory(new ClassPathResource("applicationContext.xml")); Object bean = bf.getBean(IUserService.class); System.out.println(bean);}

輸出結(jié)果

--IUserService實例化之前---
--被實例化了--
--IUserService實例化后---
com.dpb.service.UserServiceImpl@5315b42e

測試--通過id獲取

@Testpublic void test1() { BeanFactory bf = new XmlBeanFactory(new ClassPathResource("applicationContext.xml")); Object bean = bf.getBean("myFactoryBean"); System.out.println(bean);}

輸出結(jié)果

--IUserService實例化之前---
--被實例化了--
--IUserService實例化后---
com.dpb.service.UserServiceImpl@783e6358

如果想要獲取FactoryBean對象 id前加 &就可以

@Testpublic void test1() { BeanFactory bf = new XmlBeanFactory(new ClassPathResource("applicationContext.xml")); Object bean = bf.getBean("&myFactoryBean"); System.out.println(bean);}

輸出結(jié)果

com.dpb.factorybean.MyFactoryBean@3b81a1bc

2.增強實現(xiàn)

通過FactoryBean創(chuàng)建一個代理類來增強目標(biāo)類,我們來看下效果

接口和實現(xiàn)類

public interface IUserService { public void doSome();}
public class UserServiceImpl implements IUserService {  public UserServiceImpl(){  System.out.println("--被實例化了--"); } @Override public void doSome() {  System.out.println("UserServiceImpl 。。。 被執(zhí)行了"); }}

自定義FactoryBean

public class MyFactoryBean implements FactoryBean,InitializingBean,DisposableBean{  private Object proxyObject;  private Object target;  private String interfaceName; @Override public Object getObject() throws Exception {    return proxyObject; } @Override public Class<?> getObjectType() {  return proxyObject.getClass()==null?Object.class:proxyObject.getClass(); } @Override public boolean isSingleton() {  return true; } /**  * MyFactoryBean 對象銷毀的回調(diào)方法  * @throws Exception  */ @Override public void destroy() throws Exception {  System.out.println("destroy ....");   } /**  * MyFactoryBean 對象實例化的方法  */ @Override public void afterPropertiesSet() throws Exception {  System.out.println("---afterPropertiesSet---");  proxyObject = Proxy.newProxyInstance(     this.getClass().getClassLoader()     , new Class[]{Class.forName(interfaceName)}     , new InvocationHandler() {            @Override      public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {       System.out.println("----代理方法執(zhí)行開始----");       Object obj = method.invoke(target, args);       System.out.println("----代理方法執(zhí)行結(jié)束----");       return obj;      }     }); } public String getInterfaceName() {  return interfaceName; } public void setInterfaceName(String interfaceName) {  this.interfaceName = interfaceName; } public Object getTarget() {  return target; } public void setTarget(Object target) {  this.target = target; }}

配置文件

<?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"> <!-- 注冊目標(biāo)對象 --> <bean class="com.dpb.service.UserServiceImpl" id="userServiceImpl"/> <!-- 注冊FactoryBean對象 --> <bean id="myFactoryBean" class="com.dpb.factorybean.MyFactoryBean">  <property name="interfaceName" value="com.dpb.service.IUserService"/>   <property name="target" ref="userServiceImpl"/>  </bean></beans>

測試

@Testpublic void test1() { ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); IUserService bean = (IUserService) ac.getBean("myFactoryBean"); System.out.println("****************"); bean.doSome(); System.out.println();}

輸出結(jié)果:

--被實例化了--
---afterPropertiesSet---
****************
----代理方法執(zhí)行開始----
UserServiceImpl 。。。 被執(zhí)行了
----代理方法執(zhí)行結(jié)束----

小結(jié):通過輸出結(jié)果我們可以看到通過FactoryBean接口我們也可以實現(xiàn)BeanFactory中某些接口提供的功能,而且會更加的靈活一些。

3.FactoryBean的實際使用案例

Spring在整合mybatis框架的時候提供的SqlSessionFactoryBean就是FactoryBean的很好的實現(xiàn)。

<!-- 整合mybatis --><bean class="org.mybatis.spring.SqlSessionFactoryBean" id="sqlSessionFactoryBean" > <!-- 關(guān)聯(lián)數(shù)據(jù)源 --> <property name="dataSource" ref="dataSource"/> <!-- 關(guān)聯(lián)mybatis的配置文件 --> <property name="configLocation" value="classpath:mybatis-cfg.xml"/> <!-- 添加別名設(shè)置 --> <property name="typeAliasesPackage" value="com.sxt.model"/> <!-- 映射文件和接口文件不在同一個目錄下的時候,需要單獨指定映射文件的路徑 --> <property name="mapperLocations" value="classpath:mapper/*.xml"/></bean>

Spring會調(diào)用SqlSessionFactoryBean這個實現(xiàn)了FactoryBean的工廠Bean 同時加載dataSource,Mapper文件的路徑,對sqlSessionFactory進行初始化。

Spring,BeanFactory,FactoryBean

源代碼比較多就不一一貼出來。到了這兒可以自行跟蹤下源代碼。

核心方法

@Override public void afterPropertiesSet() throws Exception { // 省略 this.sqlSessionFactory = buildSqlSessionFactory(); } protected SqlSessionFactory buildSqlSessionFactory() throws IOException { Configuration configuration; XMLConfigBuilder xmlConfigBuilder = null; // 省略 return this.sqlSessionFactoryBuilder.build(configuration); }/** * {@inheritDoc} */ @Override public SqlSessionFactory getObject() throws Exception { if (this.sqlSessionFactory == null) {  afterPropertiesSet(); } return this.sqlSessionFactory; } /** * {@inheritDoc} */ @Override public Class<? extends SqlSessionFactory> getObjectType() { return this.sqlSessionFactory == null ? SqlSessionFactory.class : this.sqlSessionFactory.getClass(); } /** * {@inheritDoc} */ @Override public boolean isSingleton() { return true; }

maven坐標(biāo):

<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.2</version></dependency>

三、總結(jié)

  • BeanFactory是Spring中IOC容器最核心的接口,遵循了IOC容器中所需的基本接口。例如我們很常見的:ApplicationContext,XmlBeanFactory 等等都使用了BeanFactory這個接口。
  • FactoryBean是工廠類接口,當(dāng)你只是想簡單的去構(gòu)造Bean,不希望實現(xiàn)原有大量的方法。它是一個Bean,不過這個Bean能夠做為工廠去創(chuàng)建Bean,同時還能修飾對象的生成。
  • FactoryBean比BeanFactory在生產(chǎn)Bean的時候靈活,還能修飾對象,帶有工廠模式和裝飾模式的意思在里面,不過它的存在還是以Bean的形式存在。

好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對VeVb武林網(wǎng)的支持。


注:相關(guān)教程知識閱讀請移步到JAVA教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
印度午夜性春猛xxx交| 美女精品一区| 亚洲午夜精品在线观看| 精品一区二区三区在线播放| 欧美国产激情一区二区三区蜜月| 日韩国产精品一区二区| 久久久久女人精品毛片九一| 亚洲丝袜美腿综合| 在线观看av的网址| 99热这里只有精品8| 91av视频在线| 快播电影网址老女人久久| 伊色综合久久之综合久久| 亚洲欧美tv| 91精品二区| 久久久久久网站| 亚洲成人在线观看视频| 欧美一区三区二区在线观看| 日本一本在线视频| 白白色亚洲国产精品| 欧美午夜精品久久久久久浪潮| 久草在线资源网| 亚洲视频在线二区| 91av在线免费播放| 丁香婷婷综合激情五月色| 蜜桃欧美视频| 日韩不卡视频一区二区| 日韩av无码中文字幕| 欧美xxxx少妇| 欧美在线高清视频| 欧美四级剧情无删版影片| 天堂中文字幕在线| 免费观看羞羞视频网站| 最新在线观看av网站| 午夜精品久久久久久久久久久久久蜜桃| 欧美成人性战久久| 欧美大波大乳巨大乳| 黄色片网站在线免费观看| 欧美性生活影院| 四虎.com| 最全影音av资源中文字幕在线| 精品国产乱码一区二区三区| 亚洲乱码国产乱码精品精可以看| 久久国产中文字幕| 国产av人人夜夜澡人人爽| 青青草国产在线观看| 7777精品伊人久久久大香线蕉超级流畅| 99九九热只有国产精品| 欧美精品九九99久久| 日韩欧美在线不卡| 调教视频免费在线观看| 激情综合闲人网| 毛片不卡一区二区| 国产成在线观看免费视频| 欧美激情福利视频在线观看免费| 中文字幕在线永久在线视频| eeuss影院在线观看第一页| 久久国产福利| 亚洲白拍色综合图区| 久久最新资源网| 日韩电影一区二区三区四区| 91精品久久久久久9s密挑| 99久久99精品久久久久久| 飘雪影视在线观看免费观看| 天天想你在线观看完整版电影免费| 最新av在线| 老司机免费视频一区二区三区| 日韩在线免费观看av| 成人18免费入口| 国产一区二区视频在线免费观看| 欧美丰满熟妇bbbbbb| 国产日韩电影| 高清成人在线观看| 成人在线丰满少妇av| 538任你躁在线精品免费| 日韩一区二区三区在线视频| h在线观看免费| 99riav久久精品riav| xxxxxx国产精品视频| 欧美牲交a欧美牲交| 99re免费99re在线视频手机版| 欧美日韩大片免费观看| avove在线播放| 国产精品99一区| 日本一区二区免费电影| 国产福利av网站| 亚洲性av网站| 亚洲911精品成人18网站| 免费一区二区三区四区| 欧美熟女一区二区| 亚洲免费综合| 中日韩免费毛片| 一区二区三区欧洲区| 日韩人妻精品无码一区二区三区| 亚洲人成在线免费观看| 做爰高潮hd色即是空| 国产精品高颜值在线观看| 男人女人黄一级| 国产变态拳头交视频一区二区| 视频污在线观看| 日本久久天堂| 久久国产视频播放| 国模私拍视频一区| 亚洲精品欧美综合四区| 欧美金发大战黑人最粗videos| 日韩中文娱乐网| 欧美日韩蜜桃| 日韩综合小视频| 韩国三级与黑人| av在线天堂网| 成人性生交大片免费看视频直播| 传媒在线观看| 国产探花在线精品一区二区| 91精品91久久久中77777老牛| 最新av网站在线观看| 6699嫩草久久久精品影院| 五月天av网站| 欧美一级久久久久久久大片| 欧美精品久久久久久久久久| 国产a区久久久| 中文字幕国语官网在线视频| 在线精品国产成人综合| 亚洲毛片亚洲毛片亚洲毛片| 国产精品久久久一本精品| 欧美精品手机在线| 亚洲最新免费视频| 喷水一区二区三区| 天堂精品一区二区三区| ㊣最新国产の精品bt伙计久久| 久久精品国产亚洲blacked| 97精品欧美一区二区三区| 日本不卡一二区| 亚洲福利视频一区| 国产拍精品一二三| 蜜臀91精品国产高清在线观看| 亚洲老司机av| 久操视频在线观看免费| 一级黄色片在线免费观看| 婷婷成人影院| 亚洲手机在线| 国产日韩欧美不卡| 青青草视频成人| 国产精品777777| 黄色av网址在线观看| 久久精品国产亚洲777| 国产成人无码www免费视频播放| 无码人妻aⅴ一区二区三区玉蒲团| 午夜视频久久久| 国产又大又黄视频| 免费特级黄色片| 手机看片国产日韩| 亚洲av激情无码专区在线播放| 91电影91视频| 影音先锋久久精品| 国产十六处破外女视频| 亚洲二区在线观看| 成人午夜黄色影院| 青青在线免费观看视频| 欧美男男gaygay1069| www黄在线观看| 日韩av一级| 日韩写真欧美这视频| 国产91色在线|| 美女羞羞视频在线观看| 天堂网站www天堂资源在线| 韩国欧美亚洲国产| 欧美视频你懂的| 麻豆91精品91久久久| 欧美美女一区二区三区| caoporn国产一区二区| 成人啪啪18免费游戏链接| www.成人av| 福利在线网站| 91视频在线网站| 精品久久人人做人人爰| 日本电影一区二区在线观看| 偷拍女澡堂一区二区三区| 国产盗摄女厕一区二区三区| 亚洲欧美激情视频| 久久99久久| 一个人看免费www视频有多爽| 亚洲人成毛片在线播放女女| 成人黄色在线播放| 欧美成人激情在线| 亚洲国产成人不卡| 久久久精品免费网站| 国产18无套直看片| 男人天堂视频在线观看| 欧美日韩ab片| 欧美性淫爽ww久久久久无| 成人午夜电影网站| 国产视频亚洲色图| 久久精品国内一区二区三区| 国产免费一区二区三区视频| 亚洲色图17p| 日韩一区电影| 日韩精品极品在线观看播放免费视频| 日本10禁啪啪无遮挡免费一区二区| youjizz亚洲女人| 亚洲美女久久| 4kfree性满足欧美hd18| 亚洲精品久久久久久久蜜桃| 狠久久av成人天堂| 一区二区三区不卡在线观看| 激情网站在线观看| 日本dhxxxxxdh14日本| 一区二区三区国产精品| 日韩国产精品91| 国产精品三p一区二区| 国产日本欧美一区| 91麻豆精品国产91久久综合| 国产在线视频二区| 无码av天堂一区二区三区| 国产欧美视频一区二区| 一区二区三区四区精品| 国产福利一区二区在线精品| 国产精品av在线| 亚洲天堂av老司机| 2023国产一二三区日本精品2022| 男人的天堂99| 久久久久网址| www99avcom| freehdxxxx护士| 日产国产欧美视频一区精品| 日本激情小视频| 美女毛片一区二区三区四区最新中文字幕亚洲| 天堂网中文在线观看| 久久午夜老司机| caoporn97免费视频公开| 91精品久久久久久久91蜜桃| 羞羞视频在线免费看| 国产精品久久无码| 三级成人在线视频| 国产精品永久在线| www.欧美三级电影.com| 阿v天堂2014| 九七伦理97伦理| 中文字幕日韩精品无码内射| 欧美日韩在线免费| 国产精品欧美一区喷水| 91精品啪在线观看国产81旧版| 欧美激情二区三区| 国产精品7m凸凹视频分类| 亚洲福利合集| 美女黄色片网站| 韩国精品一区二区| 欧美精品高清| 欧美第一淫aaasss性| 最新国产精品视频| 久久免费精品视频在这里| 国产激情在线视频| 美女又爽又黄视频毛茸茸| 欧美一区二区三区久久| 黄色片网站在线免费观看| 国产精品欧美一区二区三区奶水| 免费看又色又爽又黄网站| 亚洲国产乱码最新视频| 欧美日韩国产不卡在线看| 日本高清视频免费在线观看| 日韩精品国产欧美| 精品不卡视频| av网站在线观看免费| www免费视频观看在线| 熟妇人妻系列aⅴ无码专区友真希| 日韩中文字幕免费在线观看| 国产精品免费久久久久| 国产在线观看一区| 美美哒免费高清在线观看视频一区二区| 亚洲女人av| 亚洲欧洲日产国码无码久久99| 97视频在线观看免费高清完整版在线观看| 亚洲wwwwww| 青青草视频在线免费观看| 欧美三区在线| 欧美国产先锋| 日韩在线xxx| 欧美色videos| 国产男女裸体做爰爽爽| 欧美精品 日韩| av成人网在线| 亚洲影视九九影院在线观看| www.久久ai| 国产黄大片在线观看| 99精品国产91久久久久久| 亚洲国产欧美另类| 久热免费在线视频| 色999日韩欧美国产| 国产麻豆剧传媒精品国产av| 久久97超碰色| 欧美午夜片在线免费观看| 中文字幕一区二区三区四区免费看| 春意影院免费入口| heyzo在线观看| 久久99精品久久久| 亚洲免费成人av在线| 粉嫩aⅴ一区二区三区| 中国黄色在线视频| 精品美女调教视频| 亚洲欧洲性图库| 三妻四妾完整版在线观看电视剧| 日韩视频免费在线| 午夜精品一区二区三区在线观看| 亚洲国产成人精品电影| 国产福利一区二区精品秒拍| 日韩影视在线| 国产精品入口麻豆免费观看| 高潮白浆女日韩av免费看| 五月激情综合婷婷| 亚洲一区二区三区四区在线播放| 麻豆一区二区在线| 亚洲一区中文字幕在线| 四虎成人在线| 欧美大片网站在线观看| 夜夜嗨av色综合久久久综合网| 欧美在线亚洲在线| 精品欧美乱码久久久久久1区2区| 国产精品久久久久毛片| 国产一级一区二区| 日韩免费福利电影在线观看| 免费看黄资源大全高清| 主播大秀视频在线观看一区二区| 草草在线视频| 免费欧美一级片| 欧美在线一级va免费观看| 欧美午夜影院一区| 91精品久久久久久久久不口人| 国产一区二区三区日韩| 午夜精品亚洲一区二区三区嫩草|