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)); }
2. 使用场景
2.1 可在需要对不同类型下的数据进行解析时进行处理,如:JSON解析,xml解析等类似场景
分类:
spring
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~