diff --git a/CHANGELOG.md b/CHANGELOG.md index 3ee138c09..2ec8658dc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ ------------------------------------------------------------------------------------------------------------- -# 5.7.6 (2021-07-30) +# 5.7.7 (2021-08-01) ### 🐣新特性 * 【core 】 增加LookupFactory和MethodHandleUtil(issue#I42TVY@Gitee) @@ -11,9 +11,12 @@ * 【core 】 PhoneUtil中新增获取固话号码中区号,以及固话号码中号码的方法(pr#387@Gitee) * 【json 】 JSONGetter增加getLocalDateTime方法(pr#387@Gitee) * 【core 】 增加JNDIUtil(issue#1727@Github) +* 【core 】 SpringUtil增加unregisterBean方法(pr#388@Gitee) ### 🐞Bug修复 * 【jwt 】 修复JWTUtil中几个方法非static的问题(issue#1735@Github) +* 【core 】 修复SpringUtil无法处理autowired问题(pr#388@Gitee) +* 【core 】 修复AbsCollValueMap中常量拼写错误(pr#1736@Github) ------------------------------------------------------------------------------------------------------------- diff --git a/hutool-extra/src/main/java/cn/hutool/extra/spring/SpringUtil.java b/hutool-extra/src/main/java/cn/hutool/extra/spring/SpringUtil.java index d6ef9248c..f652f9e3f 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/spring/SpringUtil.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/spring/SpringUtil.java @@ -1,10 +1,10 @@ package cn.hutool.extra.spring; +import cn.hutool.core.exceptions.UtilException; import cn.hutool.core.lang.TypeReference; import cn.hutool.core.util.ArrayUtil; import org.springframework.beans.BeansException; import org.springframework.beans.factory.ListableBeanFactory; -import org.springframework.beans.factory.config.AutowireCapableBeanFactory; import org.springframework.beans.factory.config.BeanFactoryPostProcessor; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.support.DefaultSingletonBeanRegistry; @@ -21,9 +21,10 @@ import java.util.Map; /** * Spring(Spring boot)工具封装,包括: * - *
- *     1、Spring IOC容器中的bean对象获取
- * 
+ *
    + *
  1. Spring IOC容器中的bean对象获取
  2. + *
  3. 注册和注销Bean
  4. + *
* * @author loolly * @since 5.1.0 @@ -72,6 +73,25 @@ public class SpringUtil implements BeanFactoryPostProcessor, ApplicationContextA return null == beanFactory ? applicationContext : beanFactory; } + /** + * 获取{@link ConfigurableListableBeanFactory} + * + * @return {@link ConfigurableListableBeanFactory} + * @since 5.7.7 + * @throws UtilException 当上下文非ConfigurableListableBeanFactory抛出异常 + */ + public static ConfigurableListableBeanFactory getConfigurableBeanFactory() throws UtilException{ + final ConfigurableListableBeanFactory factory; + if (null != beanFactory) { + factory = beanFactory; + } else if (applicationContext instanceof ConfigurableApplicationContext) { + factory = ((ConfigurableApplicationContext) applicationContext).getBeanFactory(); + } else { + throw new UtilException("No ConfigurableListableBeanFactory from context!"); + } + return factory; + } + //通过name获取 Bean. /** @@ -201,15 +221,9 @@ public class SpringUtil implements BeanFactoryPostProcessor, ApplicationContextA * @since 5.4.2 */ public static void registerBean(String beanName, T bean) { - if (null != beanFactory) { - beanFactory.autowireBean(bean); - beanFactory.registerSingleton(beanName, bean); - } else if (applicationContext instanceof ConfigurableApplicationContext) { - ConfigurableApplicationContext context = (ConfigurableApplicationContext) applicationContext; - AutowireCapableBeanFactory factory = context.getAutowireCapableBeanFactory(); - factory.autowireBean(bean); - context.getBeanFactory().registerSingleton(beanName, bean); - } + final ConfigurableListableBeanFactory factory = getConfigurableBeanFactory(); + factory.autowireBean(bean); + factory.registerSingleton(beanName, bean); } /** @@ -221,32 +235,15 @@ public class SpringUtil implements BeanFactoryPostProcessor, ApplicationContextA * @author shadow * @since 5.7.7 */ - public static void unRegisterBean(String beanName) { - if (applicationContext instanceof ConfigurableApplicationContext) { - ConfigurableApplicationContext context = (ConfigurableApplicationContext) applicationContext; - DefaultSingletonBeanRegistry registry = (DefaultSingletonBeanRegistry) context.getBeanFactory(); + public static void unregisterBean(String beanName) { + final ConfigurableListableBeanFactory factory = getConfigurableBeanFactory(); + if(factory instanceof DefaultSingletonBeanRegistry){ + DefaultSingletonBeanRegistry registry = (DefaultSingletonBeanRegistry) factory; registry.destroySingleton(beanName); + } else { + throw new UtilException("Can not unregister bean, the factory is not a DefaultSingletonBeanRegistry!"); } } - - /** - * - * 替换Bean - * 组合{@link SpringUtil#unRegisterBean(String)} 和 {@link SpringUtil#replaceBean(String, Object)} - * 将Spring持有bean先注销再注册 - * 需要注意的替换Bean的内部对象的指针指向并不会变化 - * 所有替换的bean被持有的情况下,需要有下至上逐步替换 - * - * @param beanName bean名称 - * @param bean bean - * @param 泛型 - * @author shadow - * @since 5.7.7 - */ - /*public static void replaceBean(String beanName, T bean) { - unRegisterBean(beanName); - registerBean(beanName, bean); - }*/ } diff --git a/hutool-extra/src/test/java/cn/hutool/extra/spring/SpringUtilTest.java b/hutool-extra/src/test/java/cn/hutool/extra/spring/SpringUtilTest.java index 744aaca93..a0ef2a2c6 100644 --- a/hutool-extra/src/test/java/cn/hutool/extra/spring/SpringUtilTest.java +++ b/hutool-extra/src/test/java/cn/hutool/extra/spring/SpringUtilTest.java @@ -34,13 +34,29 @@ public class SpringUtilTest { Demo2 registerBean2 = SpringUtil.getBean("registerBean"); Assert.assertEquals(123, registerBean2.getId()); Assert.assertEquals("222", registerBean2.getName()); + + + } + + /** + * 测试注销bean + */ + @Test + public void unregisterBeanTest() { + registerTestAutoWired(); + Assert.assertNotNull(SpringUtil.getBean("testAutoWired")); + SpringUtil.unregisterBean("testAutoWired1"); + try { + SpringUtil.getBean("testAutoWired"); + } catch (NoSuchBeanDefinitionException e) { + Assert.assertEquals(e.getClass(), NoSuchBeanDefinitionException.class); + } } /** * 测试自动注入 */ - @Test - public void registerBeanTest2() { + private void registerTestAutoWired() { TestAutoWired testAutoWired = new TestAutoWired(); TestBean testBean = new TestBean(); testBean.setId("123"); @@ -50,43 +66,11 @@ public class SpringUtilTest { testAutoWired = SpringUtil.getBean("testAutoWired"); Assert.assertNotNull(testAutoWired); Assert.assertNotNull(testAutoWired.getAutowiredBean()); + Assert.assertNotNull(testAutoWired.getResourceBean()); Assert.assertEquals("123", testAutoWired.getAutowiredBean().getId()); } - /** - * 测试注销bean - */ - @Test - public void unRegisterBeanTest() { - registerBeanTest2(); - Assert.assertNotNull(SpringUtil.getBean("testAutoWired")); - SpringUtil.unRegisterBean("testAutoWired1"); - try { - SpringUtil.getBean("testAutoWired"); - } catch (NoSuchBeanDefinitionException e) { - Assert.assertEquals(e.getClass(), NoSuchBeanDefinitionException.class); - } - } - - /** - * 测试替换bean - - @Test - public void replaceBeanTest() { - registerBeanTest2(); - TestAutoWired testAutoWired = new TestAutoWired(); - TestBean testBean = new TestBean(); - testBean.setId("222"); - Assert.assertEquals("123", SpringUtil.getBean("testBean", TestBean.class).getId()); - SpringUtil.replaceBean("testBean", testBean); - SpringUtil.replaceBean("testAutoWired", testAutoWired); - testAutoWired = SpringUtil.getBean("testAutoWired"); - TestBean testBean1 = testAutoWired.getAutowiredBean(); - Assert.assertEquals("222", testAutoWired.getAutowiredBean().getId()); - Assert.assertEquals("222", testBean1.getId()); - - }*/ @Test public void getBeanTest(){ final Demo2 testDemo = SpringUtil.getBean("testDemo"); @@ -130,6 +114,9 @@ public class SpringUtilTest { @Autowired // @Resource private TestBean autowiredBean; + + @Resource + private TestBean resourceBean; } @Data