首页 > 其他分享 >Spring的FactoryBean接口探秘

Spring的FactoryBean接口探秘

时间:2023-02-14 17:25:07浏览次数:40  
标签:返回 PuDaoService Spring 接口 getObject FactoryBean 探秘 CommonExternalServiceFactoryB

今天接触到一个新项目,杰夫接口对外暴露一个接口:

<!-- 发布服务 alias可以改成自己的 -->
<jsf:provider id="puDaoDataService" interface="com.jd.jrdp.exts.server.PuDaoDataService" alias="${jsf.alias}"
ref="MapServiceProxy" server="jsf" timeout="20000">
</jsf:provider>
public interface PuDaoDataService extends CommonMapExternalService

但是PuDaoService只是一个单纯的接口,没有发现一个实现它的类(类似于mybatis只有接口没有实现类),并且实现类的参数里配置了一个“MapServiceProxy”,通过查找配置文件,这个id对应配置如下:

<!-- 动态代理服务类 -->
<bean id="MapServiceProxy" class="com.jd.jrdp.exts.common.support.CommonExternalServiceFactoryBean">
<!-- 拦截器,注:可以没有 -->
<property name="interceptors">
        <list>
<!--<ref bean="logInterceptor"/>-->
</list>
    </property>
<!-- 被调用的处理类,需和目标接口有完全相同的方法 -->
<property name="target" ref="DefaultExternalServiceRouter"/>
<!-- 被代理的目标接口 -->
<property name="targetInterface" value="com.jd.jrdp.exts.server.PuDaoDataService"/>
</bean>

这个类“CommonExternalServiceFactoryBean”并没有实现PuDaoDataService后者他的父接口,那是怎么注入到IOC里面去呢,后来发现CommonExternalServiceFactoryBean实现了FactoryBean接口

public class CommonExternalServiceFactoryBean implements FactoryBean<BaseCommonService>, InitializingBean, DisposableBean

里面自定义了getObject方法和getObjectType()方法,原来

假设我们定义了一个FactoryBean,名为myFactoryBean,当我们调用getBean(“myFactoryBean”)方法时返回的并不是这个FactoryBean,而是这个FactoryBean所创建的Bean,如果我们想获取到这个FactoryB*ean需要在名字前面拼接"&“,行如这种形式:getBean(”&myFactoryBean")

也就是说CommonExternalServiceFactoryBean实现了FactoryBean接口  ,所以当Spring容器查找“MapServiceProxy”这个对象的时候,不会返回CommonExternalServiceFactoryBean类型的实例对象,而是会通过调用getObject()方法返回对象,CommonExternalServiceFactoryBean的getObject方法如下:

public BaseCommonService getObject() throws Exception {
    logger.info("获取代理对象!");
    return (BaseCommonService)this.proxyObj;
}

而BaseCommonService是接口PuDaoService的父接口的父接口,如此便返回一个和PuDaoService父接口的父接口类型的对象,但是还有疑问,从代码角度来讲返回的不是PuDaoService接口的实现类,为什么可以当做PuDaoService接口的实现类?(实际的情况确实是返回PuDaoService父接口,即CommonMapExternalService类型的对象,BaseCommonServic是个空接口)

 

附一个讲的不错的Factorybean的帖子:

https://blog.csdn.net/qq_36963950/article/details/108299757

标签:返回,PuDaoService,Spring,接口,getObject,FactoryBean,探秘,CommonExternalServiceFactoryB
From: https://www.cnblogs.com/gaokunlong/p/17120227.html

相关文章

  • springcloud微服务搭建demo
    软件版本IDEA2022.3.1<兼容maven3.8.1及之前的所用版本>JDK1.8_64Maven3.8.2本demo只使用了服务发现与注册、Feign调用及负载均衡。不涉及熔断与......
  • 基于Spring MVC的前后端分离开发
    一.后台服务器端开发:先搭建一个springMVC项目1.新建一个web项目2.引入相关jar包,编写配置文件(1).引入spring包spring-framework-5.0.8.RELEASE,这个包里有相关Bean、co......
  • SpringBoot注解大全
    一、项目配置注解@SpringBootApplication:申明让springboot自动给程序进行必要的配置,这个配置等同于:@Configuration ,@EnableAutoConfiguration 和@ComponentScan 三个......
  • 【老王读SpringMVC-3】根据 url 是如何找到 controller method 的?
    前面分析了request与handlermethod映射关系的注册,现在再来分析一下SpringMVC是如何根据request来获取对应的handlermethod的?可能有人会说,既然已经将request......
  • 【Spring-boot-route(十五)整合RocketMQ+(十六)使用logback生产日志文件】
    spring-boot-route(十五)整合RocketMQRocketMQ简介RocketMQ是阿里巴巴开源的消息中间件。目前已经贡献给Apache软件基金会,成为Apache的顶级项目。rocketMQ基本概念1.Producer......
  • springcloud sidecar 实现C语言调用语言模块
    以前对springcloud的印象停留在大项目功能模块的独立、负载均衡、熔断等功能。这次项目接触了另一个用法,多语言异构。以前Java调C都是用的JNA或者JNI,这次C调Java用了spring......
  • JAVA和Spring的SPI机制讲解
    目录1SPI机制讲解1.1引言1.2JavaSPI实现1.2.1示例说明1.2.2相关测试1.2.3源码分析1.3SpringSPI1.3.1Spring示例1.3.2相关测试类1.3.3源码分析1SPI机制讲解......
  • 云小课|使用SpringBoot快速构建FunctionGraph HTTP函数
    阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说)、深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云。更多精彩内容请单击......
  • 【学习笔记】Spring注解开发
    Spring注解开发使用注解开发首先要导入context约束,然后开启注解支持<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/bea......
  • springboot基础1
    springboot@RestController//为了返回字符串@RequestMapping用来处理请求地址映射@RestController//为了返回字符串publicclassHelloController{//接口:http......