③【Spring】整合第三框架的常用机制:FactoryBean

2023-10-17 17:25:14 浏览数 (1)

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~

FactoryBean 机制

一、什么是 FactoryBean ?

FactoryBean 是 Spring 提供的一种整合第三方框架的常用机制。

当获取普通的bean时,得到的是我们在bean标签中class属性所配置的类的对象;

当获取FactoryBean类型的bean,得到的是getObject()方法的返回值,这个返回值是可由开发者自定义的。

通过这种机制,Spring 可以帮我们把复杂组件创建的详细过程和繁琐细节都屏蔽起来,只把最简洁的使用界面展示给我们。

二、实现 FactoryBean 接口


  • 创建一个FactoryBean 的实现类,重写其抽象方法。
  • 实现FactoryBean接口时需要指定泛型
  • 泛型类型就是当前工厂要生产的对象的类型
代码语言:javascript复制
package com.haojin.ioc.demo;

import org.springframework.beans.factory.FactoryBean;

/**
 * @author .29.
 * @create 2023-01-19 11:54
 */
//由FactoryBean的泛型决定bean获取到的对象
public class MyFactoryBean implements FactoryBean<service> {
    private String serviceName;

    public String getServiceName() {
        return serviceName;
    }

    public void setServiceName(String serviceName) {
        this.serviceName = serviceName;
    }

    @Override
    public service getObject() throws Exception {
        //这里模拟创建、设置一个对象的过程
        service service = new service();
        service.setServiceName(this.serviceName);
        return service;
    }

    @Override
    public Class<?> getObjectType() {
        //返回要生产的对象类型
        return service.class;
    }
}

XML配置文件中配置bean

代码语言:javascript复制
class属性:com.haojin.ioc.demo.MyFactoryBean
代码语言:javascript复制
    <bean id="myFactoryBean" class="com.haojin.ioc.demo.MyFactoryBean">
        <!--依旧可以通过setXxx()方式注入属性值-->
        <property name="serviceName" value=".29."></property>
    </bean>

测试FactoryBean效果

代码语言:javascript复制
getBean()获取的类型并非:MyFactoryBean,而是FactoryBean接口泛型类型:service
代码语言:javascript复制
public class testFactoryBean {
    @Test
    public void test(){
        //class属性设置的是:MyFactoryBean,这里bean获取到的是service
        ApplicationContext factorybean =
                new ClassPathXmlApplicationContext("factorybean.xml");
        service myFactoryBean = factorybean.getBean("myFactoryBean", service.class);

        System.out.println(myFactoryBean);
        System.out.println(myFactoryBean.getServiceName());
    }
}

0 人点赞