首页 > 其他分享 >Spring中 ServiceLocatorFactoryBean来获取需要的bean,实现业务解耦

Spring中 ServiceLocatorFactoryBean来获取需要的bean,实现业务解耦

时间:2023-02-21 14:37:17浏览次数:34  
标签:return String Spring param bean ServiceLocatorFactoryBean public

1. ServiceLocatorFactoryBean的使用

ServiceLocatorFactoryBean类似于ApplicationContent,都可以进行获取bean的id进行获取bean实例

具体代码实例:
1.1 定义一个接口,可以具体的业务接口,也可以是一个标识

点击查看代码
/**
 * 测试处理器接口 接口一
 * @Author sxt
 * @Date 2023/2/21 10:00
 **/
public interface TestHandle<T> {

    /**
     * 具体的处理函数
     * @param param
     * @return
     */
    default String process(T param){
        System.out.println("没有具体的实现");
        return "";
    }

}


/**
 * 另一个接口标识 接口二
 * @Author sxt
 * @Date 2023/2/21 11:01
 **/
public interface ProcessHandle<T> {

    /**
     * 处理方式
     * @param param
     * @return
     */
    default String process(T param){
        return "";
    }
}

1.2 接口的实现类

点击查看代码
/**
 * Aa服务处理器, 接受String类型处理
 * @Author sxt
 * @Date 2023/2/21 10:15
 **/
//@Service("Aa") 这里用此方式注入bean, 使用配置文件进行bean注入
public class AaHandle implements TestHandle<String> {

    @Override
    public String process(String param) {
        System.out.println("Aa服务处理器 = " + param);
        return "我是Aa服务";
    }
}

/**
 * Bb服务处理器, 接受Integer类型处理
 * @Author sxt
 * @Date 2023/2/21 10:16
 **/
//@Service("Bb")
public class BbHandle implements TestHandle<Integer> {

    @Override
    public String process(Integer param) {
        System.out.println("Bb服务处理器: " + param);
        return "我是Bb服务";
    }
}

/**
 * @Author sxt
 * @Date 2023/2/21 11:02
 **/
//@Service("PA")
public class ProcessA implements ProcessHandle<String> {

    @Override
    public String process(String param) {
        System.out.println("ProcessA 服务处理 = " + param);
        return "ProcessA 处理完成";
    }
}

1.3 定义一个接口标识,不需要具体实现(重要)

点击查看代码

/**
 * bean工厂接口,不需要具体的实现,只需要在 服务定位工厂 中声明使用此类类型做标识即可
 * 测试serviceLocatorFactoryBean 的使用
 * @Author sxt
 * @Date 2023/2/21 9:57
 **/
public interface ProcessFactory {

    /**
     * 根据bean的名称获取实例对象
     * @param beanName IOC容器中的bean实例, 这里可以改用对应的枚举使用,方便统一处理
     * @return
     */
    <T> TestHandle<T> getHandle(String beanName);

    /**
     * 根据bean的名称获取实例对象
     * @param beanName IOC容器中的bean实例
     * @return
     */
    <T> ProcessHandle<T> getProcessHandle(String beanName);

}

1.4 配置并注入ServiceLocatorFactoryBean实例(重要)

点击查看代码
/**
 * bean配置类
 * @Author sxt
 * @Date 2023/2/21 10:04
 **/
@Configuration
public class BeanConfig {

    /**
     * 注册服务定位工厂
     * @return
     */
    @Bean
    public ServiceLocatorFactoryBean getLocatorFactory(){
        ServiceLocatorFactoryBean factoryBean = new ServiceLocatorFactoryBean();
        //设置服务定位的接口类型,即代理ProcessFactory
        factoryBean.setServiceLocatorInterface(ProcessFactory.class);
        return factoryBean;
    }
    @Bean("Aa")
    public AaHandle aaHandle(){
        return new AaHandle();
    }

    @Bean("Bb")
    public BbHandle bbHandle(){
        return new BbHandle();
    }

    @Bean("PA")
    public ProcessA processA(){
        return new ProcessA();
    }


}

1.5 测试

点击查看代码
    @Autowired
    ProcessFactory processFactory;

    @Test
    public void testGetBean(){
        TestHandle<String> aa = processFactory.getHandle("Aa");
        TestHandle<Integer> bb = processFactory.getHandle("Bb");
        ProcessHandle<String> pa = processFactory.getProcessHandle("PA");
        String param = "数据处理.....";
        System.out.println("aa = " + aa.process(param));
        System.out.println("bb = " + bb.process(123456));
        System.out.println("Pa = " + pa.process(param));


    }
测试结果 ![image](/i/l/?n=23&i=blog/2812818/202302/2812818-20230221141922116-1707893795.png)

2. 使用场景

2.1 可在需要对不同类型下的数据进行解析时进行处理,如:JSON解析,xml解析等类似场景

标签:return,String,Spring,param,bean,ServiceLocatorFactoryBean,public
From: https://www.cnblogs.com/qiushuiyu-108/p/17140900.html

相关文章