SpringBoot SpringUtil

SpringBoot SpringUtils 工具类


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

@Component
public class SpringUtils implements ApplicationContextAware {
    /**
     * 上下文对象实例
     */
    private static ApplicationContext applicationContext;
    @Autowired
    public void setApplicationContext(ApplicationContext applicationContext) {
        this.applicationContext = applicationContext;
    }

    /**
     * 获取applicationContext
     * @return
     */
    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    /**
     * 通过name获取 Bean.
     * @param name 参数传入要获取的实例的类名 首字母小写,这是默认的
     * @return
     */
    public static Object getBean(String name){
        return getApplicationContext().getBean(name);
    }

    /**
     * 通过class获取Bean.
     * @param clazz
     * @param <T>
     * @return
     */
    public static <T> T getBean(Class<T> clazz){
        return getApplicationContext().getBean(clazz);
    }

    /**
     * 通过name,以及Clazz返回指定的Bean
     * @param name
     * @param clazz
     * @param <T>
     * @return
     */
    public static <T> T getBean(String name,Class<T> clazz){
        return getApplicationContext().getBean(name, clazz);
    }
}
### 关于 `SpringUtil` 的错误信息及解决方案 在处理 Spring 框架中的工具类问题时,特别是像 `SpringUtil` 这样可能自定义或第三方提供的工具类,遇到错误通常涉及依赖注入失败、上下文未正确加载等问题。下面是一些常见的错误及其对应的解决方案。 #### 1. 上下文获取异常 当尝试通过静态方法访问应用程序上下文(ApplicationContext),而此时上下文尚未初始化完成,则会抛出 `NullPointerException` 或其他类似的异常。为了避免这种情况发生,在创建 `SpringUtil` 类时应确保其能够安全地延迟加载 ApplicationContext 实例[^1]: ```java public class SpringUtil { private static ApplicationContext applicationContext; public static void setApplicationContext(ApplicationContext context) throws BeansException { if (applicationContext == null) { applicationContext = context; } } @SuppressWarnings("unchecked") public static <T> T getBean(String name) { return (T) applicationContext.getBean(name); } } ``` 此实现允许开发者在 Web 应用启动期间设置实际的应用程序上下文实例,并提供了一个通用的方法来按名称检索 Bean 对象。 #### 2. 非Web环境下的使用不当 对于非Web项目来说,默认情况下不会自动调用 `setApplicationContext()` 方法去注册 ApplicationListener 来监听 ContextRefreshedEvent 事件并赋值给静态变量。因此需要手动配置以支持此类场景下的正常工作。 可以在主函数中加入如下代码片段作为临时措施: ```java @SpringBootApplication public class MyApplication implements CommandLineRunner { @Autowired private ConfigurableApplicationContext configurableApplicationContext; public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } @Override public void run(String... arg0) throws Exception { SpringUtil.setApplicationContext(configurableApplicationContext); } } ``` #### 3. 版本兼容性问题 随着不同版本之间的迭代更新,某些 API 可能会发生变化甚至被废弃掉。所以在引入新的库文件之前一定要仔细阅读官方文档说明以及迁移指南,确认所使用的功能是否仍然有效并且保持向后兼容性。 例如,从 Spring Framework 5 开始,部分旧版接口已被移除;如果继续沿用可能会导致编译报错或是运行期不稳定的情况出现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值