当前位置:首页 > 科技  > 软件

Spring强大的FactoryBean还能这样用,涨知识

来源: 责编: 时间:2024-07-10 17:57:14 823观看
导读环境:Spring6.1.71. 简介FactoryBean 接口是 Spring IoC 容器实例化逻辑的一个可插入点。如果你有复杂的初始化代码,而这些代码最好用 Java 而不是冗长的 XML 来表达,那么你可以通过自定义自己的 FactoryBean,在该类中编

环境:Spring6.1.7t2Q28资讯网——每日最新资讯28at.com

1. 简介

FactoryBean 接口是 Spring IoC 容器实例化逻辑的一个可插入点。如果你有复杂的初始化代码,而这些代码最好用 Java 而不是冗长的 XML 来表达,那么你可以通过自定义自己的 FactoryBean,在该类中编写复杂的初始化,然后将自定义 FactoryBean 添加到容器中。t2Q28资讯网——每日最新资讯28at.com

FactoryBean<T> 接口提供了三种方法:t2Q28资讯网——每日最新资讯28at.com

  • T getObject(): 返回该工厂创建的对象的实例。该实例可能是共享的,这取决于该工厂返回的是单体还是原型
  • boolean isSingleton(): 如果此 FactoryBean 返回单例,则返回 true;否则返回 false。此方法的默认实现返回 true。
  • Class<?> getObjectType(): 返回 getObject() 方法返回的对象类型,如果事先不知道类型,则返回空值。

FactoryBean接口在Spring框架非多的地方被使用。Spring本身就包含了50多个FactoryBean接口的实现。t2Q28资讯网——每日最新资讯28at.com

2. 实战案例

准备基本类;t2Q28资讯网——每日最新资讯28at.com

class PersonService {  public void save() {     // TODO     System.out.println("save person...") ;  }}

接下来会基于上面的PersonService类进行FactoryBean各种案例的使用;t2Q28资讯网——每日最新资讯28at.com

2.1 简单示例

自定义FactoryBean<PersonService>实现;t2Q28资讯网——每日最新资讯28at.com

@Componentpublic class PersonServiceFactoryBean implements FactoryBean<PersonService> {  // 具体的实例  public PersonService getObject() throws Exception {    PersonService ps = new PersonService() ;    return ps ;  }  // 具体的类型  public Class<?> getObjectType() {    return PersonService.class ;  }  // true,返回单例容器中只会有一个PersonService  public boolean isSingleton() {    return true ;  }}

具体使用;t2Q28资讯网——每日最新资讯28at.com

// 你可以直接在其它的Bean中注入@Resource    private PersonService personService ;// 你可以通过BeanFactory手动获取private ApplicationContext contet ;PersonService ps = context.getBean(PersonService.class) ;

使用时和普通的Bean的使用方式一致。t2Q28资讯网——每日最新资讯28at.com

2.2 多例&不指定类型

多例;t2Q28资讯网——每日最新资讯28at.com

如果你需要每次使用时返回的都是不同的实例对象,那么你可以将isSingleton返回为false。t2Q28资讯网——每日最新资讯28at.com

// 将上面的isSingleton返回为falsepublic boolean isSingleton() {  return false ;}

接下来使用时,不管是在其它组件中进行注入还是通过getBean获取,都能确保在每个组件中使用的都不是同一个实例。t2Q28资讯网——每日最新资讯28at.com

@Componentpublic class PersonController {  @Resource  private PersonService personService ;}@Componentpublic class CommonService {  @Resource  private PersonService personService ;}

上面两个类中注入的PersonService将不是同一个实例,如果你通过getBean获取每次也都不是同一个实例。t2Q28资讯网——每日最新资讯28at.com

不指定类型;t2Q28资讯网——每日最新资讯28at.com

如果你将FactoryBean#getObjectType方法返回为null。那么你将无法正确的注入PersonService对象,同时程序将抛出异常t2Q28资讯网——每日最新资讯28at.com

图片图片t2Q28资讯网——每日最新资讯28at.com

2.3 创建代理

你可以通过FactoryBean创建代理对象借助ProxyFactory。将getObject修改如下:t2Q28资讯网——每日最新资讯28at.com

public PersonService getObject() throws Exception {  ProxyFactory factory = new ProxyFactory() ;  factory.setTarget(new PersonService()) ;  factory.addAdvice(new MethodInterceptor() {    @Override    public Object invoke(MethodInvocation invocation) throws Throwable {      System.out.println("before...") ;      return invocation.proceed() ;    }  }) ;  return (PersonService) factory.getProxy() ;}

通过FactoryBean能够非常方便的以编程的方式创建代理对象。t2Q28资讯网——每日最新资讯28at.com

2.4 获取原始FactoryBean

如果你需要获取FactoryBean本身,而非getObjectType类型,那么你可以通过如下方式:t2Q28资讯网——每日最新资讯28at.com

// 方式1:直接通过类型获取private ApplicationContext context ;context.getBean(PersonServiceFactoryBean.class) ;// 方式2:通过beanName获取,但是需要添加'&'前缀context.getBean("&psFactoryBean") ;

上面2种方式都能正确的获取原始的FactoryBean对象。t2Q28资讯网——每日最新资讯28at.com

2.5 利用SPI获取对象

Spring为我们提供了ServiceFactoryBean类,通过该类我们能非常方便的获取SPI对象并注册为容器Bean。t2Q28资讯网——每日最新资讯28at.com

@Configurationpublic class AppConfig {  @Bean  public ServiceFactoryBean serviceFactoryBean() {    ServiceFactoryBean fb = new ServiceFactoryBean() ;    // 指定SPI接口类型    fb.setServiceType(DAO.class) ;    return fb ;  }}

接下来你就可以在META-INF/services下建立DAO全限定名的文件t2Q28资讯网——每日最新资讯28at.com

com.pack.bean.create.PersonDAOcom.pack.bean.create.StudentDAO

当在容器中注入DAO时,你将得到这里的第一个PersonDAO实例。t2Q28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-100187-0.htmlSpring强大的FactoryBean还能这样用,涨知识

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: DDD 是什么?—— 你以前只会用 Service + 贫血模型!

下一篇: Go与神经网络:线性回归

标签:
  • 热门焦点
  • 6月安卓手机好评榜:魅族20 Pro蝉联冠军

    性能榜和性价比榜之后,我们来看最后的安卓手机好评榜,数据来源安兔兔评测,收集时间2023年6月1日至6月30日,仅限国内市场。第一名:魅族20 Pro好评率:95%5月份的时候魅族20 Pro就是
  • 一文看懂为苹果Vision Pro开发应用程序

    译者 | 布加迪审校 | 重楼苹果的Vision Pro是一款混合现实(MR)头戴设备。Vision Pro结合了虚拟现实(VR)和增强现实(AR)的沉浸感。其高分辨率显示屏、先进的传感器和强大的处理能力
  • 服务存储设计模式:Cache-Aside模式

    Cache-Aside模式一种常用的缓存方式,通常是把数据从主存储加载到KV缓存中,加速后续的访问。在存在重复度的场景,Cache-Aside可以提升服务性能,降低底层存储的压力,缺点是缓存和底
  • 电视息屏休眠仍有网络上传 爱奇艺被质疑“薅消费者羊毛”

    记者丨宁晓敏 见习生丨汗青出品丨鳌头财经(theSankei) 前不久,爱奇艺发布了一份亮眼的一季报,不仅营收和会员营收创造历史最佳表现,其运营利润也连续6个月实现增长。自去年年初
  • 梁柱接棒两年,腾讯音乐闯出新路子

    文丨田静 出品丨牛刀财经(niudaocaijing)7月5日,企鹅FM发布官方公告称由于业务调整,将于9月6日正式停止运营,这意味着腾讯音乐长音频业务走向消亡。腾讯在长音频领域还在摸索。为
  • 东方甄选单飞:有些鸟注定是关不住的

    文/彭宽鸿编辑/罗卿东方甄选创始人俞敏洪带队的&ldquo;7天甘肃行&rdquo;直播活动已在近日顺利收官。成立后一年多时间里,东方甄选要脱离抖音自立门户的传闻不绝于耳,&ldquo;7
  • 认真聊聊东方甄选:如何告别低垂的果实

    来源:山核桃作者:财经无忌爆火一年后,俞敏洪和他的东方甄选依旧是颇受外界关心的&ldquo;网红&rdquo;。7月5日至9日,为期5天的东方甄选&ldquo;甘肃行&rdquo;首次在自有App内直播,
  • 3699元!iQOO Neo8 Pro顶配版今日首销:1TB UFS 4.0同价位唯一

    5月23日,iQOO推出了全新的iQOO Neo8系列,包含iQOO Neo8和iQOO Neo8 Pro两个版本,其中标准版搭载高通骁龙8+,而Pro版更是首发搭载了联发科天玑9200+旗舰
  • iQOO Neo8 Pro抢先上架:首发天玑9200+ 安卓性能之王

    经过了一段时间的密集爆料,昨日iQOO官方如期对外宣布:将于5月23日推出全新的iQOO Neo8系列新品,官方称这是一款拥有旗舰级性能调校的作品。随着发布时
Top