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

首頁 > 開發 > Java > 正文

Spring中BeanFactory與FactoryBean接口的區別詳解

2024-07-14 08:43:55
字體:
來源:轉載
供稿:網友

前言

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

一、BeanFactory接口

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

Spring,BeanFactory,FactoryBean

Spring為我們提供了許多易用的BeanFactory實現,XmlBeanFactory就是常用的一個,該實現將以XML方式描述組成應用的對象及對象間的依賴關系。XmlBeanFactory類將持有此XML配置元數據,并用它來構建一個完全可配置的系統或應用。

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的核心接口。功能非常復雜,這個時候如果我們想要編寫一些比較復雜點兒的邏輯就會觸及到其他一些不必要的接口,不好實現。這時候使用FactoryBean就比較方便了。FactoryBean以Bean結尾是個Bean對象,不是工廠。接口中定義的方法如下:

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

1.簡單實現

接口和實現類

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

自定義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);}

輸出結果

--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);}

輸出結果

--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);}

輸出結果

com.dpb.factorybean.MyFactoryBean@3b81a1bc

2.增強實現

通過FactoryBean創建一個代理類來增強目標類,我們來看下效果

接口和實現類

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

自定義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 對象銷毀的回調方法  * @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("----代理方法執行開始----");       Object obj = method.invoke(target, args);       System.out.println("----代理方法執行結束----");       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"> <!-- 注冊目標對象 --> <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();}

輸出結果:

--被實例化了--
---afterPropertiesSet---
****************
----代理方法執行開始----
UserServiceImpl 。。。 被執行了
----代理方法執行結束----

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

3.FactoryBean的實際使用案例

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

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

Spring會調用SqlSessionFactoryBean這個實現了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坐標:

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

三、總結

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

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美贵妇videos办公室| 日韩成人av网址| 国产在线观看91精品一区| 亚洲free性xxxx护士hd| 一区二区成人精品| 国产精品日日摸夜夜添夜夜av| 久久人人97超碰精品888| 精品久久久久久亚洲精品| 亚洲自拍小视频免费观看| 黑人精品xxx一区一二区| 亚洲aa在线观看| 亚洲系列中文字幕| 日本亚洲欧美三级| 国产91在线播放九色快色| 国产黑人绿帽在线第一区| 中文字幕亚洲自拍| 精品美女久久久久久免费| 国产裸体写真av一区二区| 欧美老少做受xxxx高潮| 亚洲中国色老太| 亚洲女人被黑人巨大进入| 高清欧美性猛交xxxx| 色综合久久久久久中文网| 美女视频黄免费的亚洲男人天堂| 日韩av电影手机在线观看| 日韩午夜在线视频| www.日韩视频| 韩剧1988在线观看免费完整版| 日韩一区在线视频| 2019精品视频| 国产成人精品电影久久久| 欧美精品在线观看| 一级做a爰片久久毛片美女图片| 国产精品国内视频| 91国产在线精品| 久久影视免费观看| 97香蕉超级碰碰久久免费的优势| 亚洲午夜未满十八勿入免费观看全集| 欧美激情亚洲精品| 日韩中文在线不卡| 国产剧情久久久久久| 日本成人在线视频网址| 国产日产久久高清欧美一区| 成人在线国产精品| 国产精品极品在线| 91精品国产综合久久男男| 日韩av在线免费播放| 欧美性猛交xxxx黑人| 久久精品国产清自在天天线| 亚洲精品一区二区三区婷婷月| 亚洲已满18点击进入在线看片| 97人人模人人爽人人喊中文字| 91豆花精品一区| 国产精品露脸自拍| 国产伦精品一区二区三区精品视频| 欧美日韩在线看| 欧美高清理论片| 精品一区二区三区电影| 欧美丝袜一区二区| 国产精品视频自在线| 成人激情综合网| 久久成人精品一区二区三区| 美女999久久久精品视频| 91视频国产一区| 国产精品入口免费视| 国产成人精品午夜| 中文字幕久久久| 久久精品电影网站| 久久国产精品网站| 国产亚洲精品久久久久久| 大荫蒂欧美视频另类xxxx| 日韩一区二区三区xxxx| 45www国产精品网站| 麻豆一区二区在线观看| 伊人男人综合视频网| 97国产精品久久| 国产成人综合一区二区三区| 久久国内精品一国内精品| 成人在线视频福利| 亚洲精品一区二三区不卡| 国色天香2019中文字幕在线观看| 日韩精品免费一线在线观看| 久久99久久99精品中文字幕| 亚洲激情视频在线| 自拍偷拍亚洲区| 亚洲另类欧美自拍| 亚洲a在线播放| 欧美又大粗又爽又黄大片视频| 97视频在线观看免费| 91高清在线免费观看| 欧美大尺度激情区在线播放| 日韩精品在线视频| 欧美精品少妇videofree| 久久99久久久久久久噜噜| 久久夜色精品亚洲噜噜国产mv| 欧美视频在线视频| 亚洲成人在线视频播放| 久久久成人精品| 成人国产在线激情| 日韩亚洲第一页| 日本一区二区三区在线播放| 91福利视频在线观看| 国产小视频91| 欧美成aaa人片在线观看蜜臀| 国产日韩综合一区二区性色av| 成人啪啪免费看| 日韩在线播放视频| 亚洲自拍偷拍区| 欧美激情欧美激情在线五月| 精品亚洲一区二区三区在线观看| 欧美精品情趣视频| 久久久久久国产精品| 456国产精品| 亚洲第一精品夜夜躁人人爽| 亚洲伊人久久综合| 亚洲欧美日韩一区二区在线| 国产丝袜一区二区三区免费视频| 久热爱精品视频线路一| 黑人精品xxx一区一二区| 精品久久久一区二区| 曰本色欧美视频在线| 成人免费视频在线观看超级碰| 日本亚洲欧洲色α| 中文字幕av一区二区三区谷原希美| 中文字幕精品av| 国产精品视频久| 精品欧美激情精品一区| 久久久女人电视剧免费播放下载| 欧美日韩国产一区在线| 国产精品久久久久久久9999| 久久久视频精品| 国产精品∨欧美精品v日韩精品| 国产精品久久久久久久av大片| 欧美中文字幕在线视频| 欧美最顶级丰满的aⅴ艳星| 在线精品视频视频中文字幕| 九九热精品视频| 欧美极品欧美精品欧美视频| 日韩高清不卡av| 成人欧美一区二区三区在线| 成人国产精品久久久| 91精品视频专区| 97精品国产91久久久久久| 日韩国产中文字幕| 国内精品模特av私拍在线观看| 国产亚洲精品va在线观看| 4438全国亚洲精品在线观看视频| 欧美性猛xxx| 狠狠色狠狠色综合日日小说| 欧美高清videos高潮hd| 日韩中文在线中文网在线观看| 97视频国产在线| 欧美一级淫片丝袜脚交| 欧美精品在线观看| 欧洲美女免费图片一区| 欧美日韩国产中文字幕| 久久韩国免费视频| 亚洲欧美精品伊人久久| 精品国产一区二区三区久久久狼| 国产综合福利在线| 伊人久久免费视频| 欧美日韩不卡合集视频| 亚洲激情小视频| 国产精品亚洲综合天堂夜夜|