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

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](https://img2023.cnblogs.com/blog/2812818/202302/2812818-20230221141922116-1707893795.png)

2. 使用场景

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

posted @   酸菜鱼没有鱼  阅读(336)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示