From 12029ebba021dc42aa854e4c5566c3798beeb5d9 Mon Sep 17 00:00:00 2001 From: chandler <1915724901@qq.com> Date: Mon, 30 Sep 2024 14:26:08 +0800 Subject: [PATCH] =?UTF-8?q?feat(0):=20[java]-[wcferry-mvn]-=E6=8E=A7?= =?UTF-8?q?=E5=88=B6=E5=B1=82=E6=8E=A5=E5=8F=A3=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/iamteer/BussinessContext.java | 17 ++ .../iamteer/controller/TestController.java | 18 +- .../java/com/iamteer/runner/WechatRunner.java | 14 +- .../java/com/iamteer/service/TestService.java | 13 ++ .../iamteer/service/impl/TestServiceImpl.java | 35 ++++ .../utils/SpringContextHolderUtil.java | 173 ++++++++++++++++++ 6 files changed, 264 insertions(+), 6 deletions(-) create mode 100644 clients/java/wcferry-mvn/src/main/java/com/iamteer/BussinessContext.java create mode 100644 clients/java/wcferry-mvn/src/main/java/com/iamteer/service/TestService.java create mode 100644 clients/java/wcferry-mvn/src/main/java/com/iamteer/service/impl/TestServiceImpl.java create mode 100644 clients/java/wcferry-mvn/src/main/java/com/iamteer/utils/SpringContextHolderUtil.java diff --git a/clients/java/wcferry-mvn/src/main/java/com/iamteer/BussinessContext.java b/clients/java/wcferry-mvn/src/main/java/com/iamteer/BussinessContext.java new file mode 100644 index 0000000..93f3673 --- /dev/null +++ b/clients/java/wcferry-mvn/src/main/java/com/iamteer/BussinessContext.java @@ -0,0 +1,17 @@ +package com.iamteer; + +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Component +@Data +@Order(100) +public class BussinessContext { + + private Client client; + +} diff --git a/clients/java/wcferry-mvn/src/main/java/com/iamteer/controller/TestController.java b/clients/java/wcferry-mvn/src/main/java/com/iamteer/controller/TestController.java index f0c65a3..66ef391 100644 --- a/clients/java/wcferry-mvn/src/main/java/com/iamteer/controller/TestController.java +++ b/clients/java/wcferry-mvn/src/main/java/com/iamteer/controller/TestController.java @@ -1,11 +1,13 @@ package com.iamteer.controller; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.iamteer.entity.TResponse; import com.iamteer.enums.ResponseCodeEnum; +import com.iamteer.service.TestService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -15,10 +17,18 @@ import io.swagger.annotations.ApiOperation; @Api(tags = "测试-接口") public class TestController { - @ApiOperation(value = "测试", notes = "index") - @PostMapping(value = "/index") - public TResponse index() { - return TResponse.ok(ResponseCodeEnum.SUCCESS, ""); + private TestService testService; + + @Autowired + public void setTestService(TestService testService) { + this.testService = testService; + } + + @ApiOperation(value = "测试", notes = "login") + @PostMapping(value = "/login") + public TResponse login() { + Boolean flag = testService.isLogin(); + return TResponse.ok(ResponseCodeEnum.SUCCESS, flag); } } diff --git a/clients/java/wcferry-mvn/src/main/java/com/iamteer/runner/WechatRunner.java b/clients/java/wcferry-mvn/src/main/java/com/iamteer/runner/WechatRunner.java index 67e6516..b806d76 100644 --- a/clients/java/wcferry-mvn/src/main/java/com/iamteer/runner/WechatRunner.java +++ b/clients/java/wcferry-mvn/src/main/java/com/iamteer/runner/WechatRunner.java @@ -4,8 +4,10 @@ import javax.annotation.Resource; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; +import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; +import com.iamteer.BussinessContext; import com.iamteer.Client; import com.iamteer.config.WcferryProperties; @@ -19,11 +21,19 @@ import lombok.extern.slf4j.Slf4j; */ @Slf4j @Component +@Order(101) public class WechatRunner implements ApplicationRunner { @Resource private WcferryProperties properties; + @Resource + private BussinessContext bussinessContext; + + public WechatRunner(BussinessContext bussinessContext) { + this.bussinessContext = bussinessContext; + } + @Override public void run(ApplicationArguments args) throws Exception { System.out.println(">>>服务启动第一个开始执行的任务<<<<"); @@ -38,8 +48,8 @@ public class WechatRunner implements ApplicationRunner { // 本地启动 RPC // Client client = new Client(); // 默认 10086 端口 // Client client = new Client(10088,true); // 也可以指定端口 - - Client client = new Client(properties.getSocketPort(), properties.getDllPath()); // 默认 10086 端口 + Client client = new Client(properties.getSocketPort(), properties.getDllPath()); + bussinessContext.setClient(client); // 默认 10086 端口 // 是否已登录 // log.info("isLogin: {}", client.isLogin()); diff --git a/clients/java/wcferry-mvn/src/main/java/com/iamteer/service/TestService.java b/clients/java/wcferry-mvn/src/main/java/com/iamteer/service/TestService.java new file mode 100644 index 0000000..3685070 --- /dev/null +++ b/clients/java/wcferry-mvn/src/main/java/com/iamteer/service/TestService.java @@ -0,0 +1,13 @@ +package com.iamteer.service; + +/** + * 业务接口-注册 + * + * @author chandler + * @date 2024-09-29 20:58 + */ +public interface TestService { + + Boolean isLogin(); + +} diff --git a/clients/java/wcferry-mvn/src/main/java/com/iamteer/service/impl/TestServiceImpl.java b/clients/java/wcferry-mvn/src/main/java/com/iamteer/service/impl/TestServiceImpl.java new file mode 100644 index 0000000..cb192ac --- /dev/null +++ b/clients/java/wcferry-mvn/src/main/java/com/iamteer/service/impl/TestServiceImpl.java @@ -0,0 +1,35 @@ +package com.iamteer.service.impl; + +import java.util.List; + +import org.springframework.stereotype.Service; + +import com.iamteer.BussinessContext; +import com.iamteer.service.TestService; +import com.iamteer.utils.SpringContextHolderUtil; + +import lombok.extern.slf4j.Slf4j; + +/** + * 业务实现层-注册 + * + * @author chandler + * @date 2024-09-29 20:58 + */ +@Slf4j +@Service +public class TestServiceImpl implements TestService { + + @Override + public Boolean isLogin() { + + BussinessContext bussinessContext = SpringContextHolderUtil.getBean(BussinessContext.class); + + boolean flag = bussinessContext.getClient().isLogin(); + log.info("flag:{}", flag); + List list = bussinessContext.getClient().getDbNames(); + log.info("list:{}", list); + return flag; + } + +} diff --git a/clients/java/wcferry-mvn/src/main/java/com/iamteer/utils/SpringContextHolderUtil.java b/clients/java/wcferry-mvn/src/main/java/com/iamteer/utils/SpringContextHolderUtil.java new file mode 100644 index 0000000..5282285 --- /dev/null +++ b/clients/java/wcferry-mvn/src/main/java/com/iamteer/utils/SpringContextHolderUtil.java @@ -0,0 +1,173 @@ +package com.iamteer.utils; + +import java.util.Map; + +import org.springframework.beans.MutablePropertyValues; +import org.springframework.beans.factory.DisposableBean; +import org.springframework.beans.factory.support.DefaultListableBeanFactory; +import org.springframework.beans.factory.support.GenericBeanDefinition; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.ApplicationEvent; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; + +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; + +/** + * Spring 工具类 + * + * @author chandler + * @date 2023-03-30 11:05:49 + */ +@Slf4j +@Service +@Lazy(false) +public class SpringContextHolderUtil implements ApplicationContextAware, DisposableBean { + + /** + * 上下文对象实例 + */ + private static ApplicationContext applicationContext = null; + + /** + * 获取applicationContext-取得存储在静态变量中的ApplicationContext. + */ + public static ApplicationContext getApplicationContext() { + checkApplicationContext(); + return applicationContext; + } + + /** + * 实现ApplicationContextAware接口, 注入Context到静态变量中. + */ + @Override + public void setApplicationContext(ApplicationContext applicationContext) { + SpringContextHolderUtil.applicationContext = applicationContext; + } + + /** + * 通过name获取Bean-从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型. + */ + @SuppressWarnings("unchecked") + public static T getBean(String name) { + checkApplicationContext(); + if (applicationContext.containsBean(name)) { + return (T)applicationContext.getBean(name); + } + return null; + } + + /** + * 通过class获取Bean-从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型. + */ + public static T getBean(Class requiredType) { + checkApplicationContext(); + return applicationContext.getBean(requiredType); + } + + /** + * 通过name,以及Clazz返回指定的Bean + */ + public static T getBean(String name, Class requiredType) { + return getApplicationContext().getBean(name, requiredType); + } + + /** + * 从静态变量ApplicationContext中取得Bean, 自动转型为所赋值对象的类型. + */ + public static T getBeanOfType(Class clazz) { + checkApplicationContext(); + return (T)applicationContext.getBeansOfType(clazz); + } + + /** + * 清除SpringContextHolder中的ApplicationContext为Null. + */ + public static void clearHolder() { + if (log.isDebugEnabled()) { + log.debug("清除SpringContextHolder中的ApplicationContext:" + applicationContext); + } + applicationContext = null; + } + + /** + * 发布事件 + * + * @param event + */ + public static void publishEvent(ApplicationEvent event) { + if (applicationContext == null) { + return; + } + applicationContext.publishEvent(event); + } + + /** + * 实现DisposableBean接口, 在Context关闭时清理静态变量. + */ + @Override + @SneakyThrows + public void destroy() { + SpringContextHolderUtil.clearHolder(); + } + + public static synchronized void registerSingletonBean(String beanName, Class clzz, Map original) { + checkApplicationContext(); + DefaultListableBeanFactory beanFactory = + (DefaultListableBeanFactory)SpringContextHolderUtil.getApplicationContext().getAutowireCapableBeanFactory(); + if (beanFactory.containsBean(beanName)) { + removeBean(beanName); + } + GenericBeanDefinition definition = new GenericBeanDefinition(); + // 类class + definition.setBeanClass(clzz); + // 属性赋值 + definition.setPropertyValues(new MutablePropertyValues(original)); + // 注册到spring上下文 + beanFactory.registerBeanDefinition(beanName, definition); + } + + public static synchronized void registerSingletonBean(String beanName, Object obj, Map original) { + checkApplicationContext(); + DefaultListableBeanFactory beanFactory = + (DefaultListableBeanFactory)SpringContextHolderUtil.getApplicationContext().getAutowireCapableBeanFactory(); + if (beanFactory.containsBean(beanName)) { + removeBean(beanName); + } + GenericBeanDefinition definition = new GenericBeanDefinition(); + // 类class + definition.setBeanClass(obj.getClass()); + // 属性赋值 + definition.setPropertyValues(new MutablePropertyValues(original)); + // 注册到spring上下文 + beanFactory.registerBeanDefinition(beanName, definition); + } + + public static synchronized void registerSingletonBean(String beanName, Object obj) { + registerSingletonBean(beanName, obj, JSONObject.parseObject(JSON.toJSONString(obj), Map.class)); + } + + /** + * 删除spring中管理的bean + * + * @param beanName + */ + public static void removeBean(String beanName) { + ApplicationContext ctx = SpringContextHolderUtil.getApplicationContext(); + DefaultListableBeanFactory acf = (DefaultListableBeanFactory)ctx.getAutowireCapableBeanFactory(); + if (acf.containsBean(beanName)) { + acf.removeBeanDefinition(beanName); + } + } + + private static void checkApplicationContext() { + if (applicationContext == null) { + throw new IllegalStateException("applicaitonContext未注入,请在applicationContext.xml中定义SpringContextUtil"); + } + } +}