关于applicationContext 或者 bean为null

1.今天遇到一个大坑,就是项目中有些bean可以被注入,而有些是null ,报空指针

@Component
public class SpringContextUtils implements ApplicationContextAware {
	public static ApplicationContext applicationContext; 

	@Override
	public void setApplicationContext(ApplicationContext applicationContext)
			throws BeansException {
		SpringContextUtils.applicationContext = applicationContext;
	}
	}

打断点发现项目启动时都没有进入本类;说明该bean没有加载

mvc中会有@ComponentScan 注解用来扫描包上的注解加入beanFactory;
但是现在使用的是springBoot
原因就是在

在这里插入图片描述

查看@SpringBootApplication的源码会看到
在这里插入图片描述
该注解中已经包含了扫描包,而且是扫描该方面同级及一下的包,我在搭建项目时把工具类放在了和它父包的同级,所以报错

### 关于Spring中使用ApplicationContext获取Bean时出现空指针异常的解决方案 在Spring框架中,`ApplicationContext` 是用于管理和提供容器中的Bean的核心接口之一。然而,在某些场景下,如果未正确初始化 `ApplicationContext` 或者尝试过早访问 Bean,则可能会引发 `NullPointerException`。 以下是针对该问题的具体分析以及可能的解决方案: #### 1. **确保ApplicationContext被正确定义并赋值** 当在静态上下文中使用 `ApplicationContext` 获取 Bean 时,必须保证 `ApplicationContext` 已经被正确实例化并且可用。如果在 Spring 容器尚未完全启动之前就调用了 `getBean()` 方法,那么很可能会抛出空指针异常[^2]。 可以通过实现 `org.springframework.context.ApplicationContextAware` 接口来设置 `ApplicationContext` 实例。例如: ```java import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; public class SpringContextUtil implements ApplicationContextAware { private static ApplicationContext context; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { context = applicationContext; // 将applicationContext赋给静态变量context } public static Object getBean(String beanName){ return context.getBean(beanName); } } ``` 上述代码片段展示了如何通过 `setApplicationContext` 方法将 Spring 应用程序上下文注入到工具类中,并存储在一个静态字段中以便后续使用[^1]。 #### 2. **避免在构造函数或@PostConstruct方法中直接调用getBean()** 由于 Spring 的生命周期机制,Bean 的创建顺序可能存在不确定性。因此,在服务类的构造函数或者带有 `@PostConstruct` 注解的方法里试图通过 `ApplicationContext` 来获取其他 Bean 很容易触发 NullPointerException。 建议改用依赖注入的方式代替手动查找 Bean。比如可以利用构造器注入或 setter 方法注入所需的组件而不是自己去检索它们。 #### 3. **延迟加载策略的应用** 对于那些仅需偶尔使用的辅助型对象(如工具类),可考虑采用懒加载模式减少不必要的资源消耗同时也规避潜在的风险。即只有当真正需要用到某个特定的服务时才动态地从 IoC 容器里面提取出来。 下面是一个简单的例子展示如何安全地执行此操作而不会遇到 NPE 错误: ```java @Service public class MyService { private final transient Lazy<AnotherService> anotherServiceLazy; public MyService(ObjectProvider<AnotherService> provider){ this.anotherServiceLazy=provider::getObject;//这里传入的是Supplier形式的对象供应源而非实际实体本身 } public void someMethod(){ AnotherService serviceInstance=this.anotherServiceLazy.get();//首次调用才会真正生成目标实例 ... } } ``` 此处借助了 `ObjectProvider<T>` 类型参数作为桥梁连接两者之间的关系从而实现了按需分配的目的[^4]。 #### 总结 综上所述,要有效防止因错误配置而导致的 NullPointer Exception 发生,应该遵循如下几点准则: - 正确设定 Application Context; - 避免提前请求尚不存在的目标 Bean; - 运用合适的编程技巧像延迟初始化等手段提升系统的健壮性和灵活性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值