Spring Application Context 注入问题

2023-05-16

熟悉spring bean生命周期的都知道,在其生命周期中有个很重要的接口:Aware。如果要注入application,可以用如下方式

@Component
public class SpringContextHolder implements ApplicationContextAware {

    public static ApplicationContext applicationContext;

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

    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }
}

然而,它真的可以么?

比如我们的程序包是如下的结构

在AholderDemo中,我是这么获取的

@Component
public class AHolderDemo {

    @PostConstruct
    public void init(){
        System.out.println("========================>");
        System.out.println(SpringContextHolder.getApplicationContext().getBeansOfType(HoldService.class));
    }

}

编译是没问题的,然而,运行的结果是NPE。囧,就不在这里贴图了。

为什么会这样呢?

我们调整一下包结构

将myCommon设置为了common,运行结果很nice。

所以,是包(名)的问题。因为使用的是静态方法,在初始化AHolderDemo的时候,Spring容器中可能还没有SpringContextHolder实例。所以,也就没有进行属性注入。

那么怎么解决呢?

1、把SpringContextHolder 所属的包尽量靠前,比如叫AAAAA,中介好像都喜欢这么干。。。恶心,很恶心。

2、在SpringContextHolder上添加@Order,完全没用。要是@Order能被扫描到了,@Component会扫描不到么,我在尝试了N次之后放弃了。很傻。所以此条请忽略。

3、

@Autowired
ApplicationContext context;

 具体为什么能注入,呵呵。Spring自身用到的,肯定在容器中也能找到啊。

4、

    @Autowired
    SpringContextHolder context;

它既然扫描不到,我就强制让它能扫描到。就是有点,唉,这到底是静态非静态呢?

5、

   public static void main(String[] args) {
        ConfigurableApplicationContext run = SpringApplication.run(StrategyDemo.class, args);
        System.out.println(run.getBeansOfType(HoldService.class));
    }

这样也有问题,因为main方法中第一条语句执行时,就会进行bean的实例化,所以在@PostConstruct修饰的方法中获取applicationContext,还是不行的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Application Context 注入问题 的相关文章

  • 原型 Bean 未按预期自动装配

    测试控制器 java RestController public class TestController Autowired private TestClass testClass RequestMapping value test me
  • 是否有适合 Java 1.4 和 SE (Swing) 应用程序的优秀 DI 框架?

    我正在寻找一个适用于在 JDK 1 4 下运行的 Java SE Swing 应用程序的依赖注入框架 有没有我可以使用的推荐 DI 框架 Guice 和其他基于注释的框架已经退出 我不想搞乱像 Retroweaver 这样的东西 另外 Sp
  • Spring MVC 和复选框

    我正在使用 Spring MVC 3 0 并且不能完全看到这个问题的所有部分 我的控制器将生成一个域对象列表 假设有一个简单的 User 对象 具有firstName lastName age 和role 属性 我想在表中输出该用户列表 每
  • 访问 webapp 外部的文件(Tomcat V6 和 Spring)

    我提供上传图像的选项 并且图像正在上传到 opt uploads contactImages 在 Windows 中为 C opt uploads contactImages 我想在我的 JSP 中显示图像 为此 我尝试通过在主机标签下添加
  • 自定义存储库的 Spring Data Solr 优先级

    我需要在 Spring Data Solr 自定义存储库中实现以下内容 X 或 Y 和 Z 我当前的代码如下 Criteria criteria new Criteria x is X VALUE criteria criteria or
  • 更改 Spring Web 应用程序的默认会话超时

    我必须测试一个由 spring 和 jsp 编写的 Web 应用程序 应用程序的默认会话超时为 30 分钟 我想减少会话超时 为此 我改变了web xml文件输入tomcatInstallationLocation conf 但这不起作用
  • 如何在 Spring Integration 流程中访问 Flux?

    我尝试访问 Spring Integration 中的 Flux 对象 而不将流声明拆分为两个函数 我想知道如何执行以下操作 Bean public IntegrationFlow mainFlow return IntegrationFl
  • Spring Data Jpa OneToMany 同时保存子实体和父实体?

    这是我的父实体 注意 为了简洁起见 删除了 getter setter lombok 注释 Entity public class Board Id GeneratedValue strategy GenerationType IDENTI
  • Spring Security 角色层次结构不适用于 Thymeleaf sec:authorize

    我正在使用 Spring Security 3 2 5 RELEASE 和 ThymeLeaf 2 1 4 RELEASE 我已经在安全上下文中定义了角色层次结构 在我的视图层中我正在使用sec authorize属性来定义菜单项 我希望看
  • Spring MVC http 500错误apache

    上面是我的程序的目录层次结构 我是 Spring 新手 正在学习 MVC 概念 我编写了一个程序 它将输入 名称 输入文本框并打印 Hello name 以下是我的目录结构和我创建的各种文件 web xml
  • 如何在 Spring Mvc 项目中设置上下文根

    我在 Tomcat 服务器中使用 Spring MVC 项目 每次运行应用程序时 服务器上下文根都会更改 如何设置固定上下文根 我的项目名称是 DemoApplication 首先部署此上下文根 路径是 http localhost 808
  • 使用 Swagger 的 Spring REST API 文档 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个可以帮助我生成 RESTful API 文档的工具 我的服务器是用Java编写的并使用S
  • Spring Kafka - 如何使用 @KafkaListener 重试

    来自推特的问题 只是想找到一个使用 spring kafka 2 1 7 的简单示例 该示例与 KafkaListener 和 AckMode MANUAL IMMEDIATE 一起使用 以重试上次失败的消息 https twitter c
  • 将 RequestBody json 转换为对象 - Spring Boot

    我是 java 开发的初学者 但之前有 PHP 和 Python 等编程语言的经验 对于如何进行 Spring Boot 的开发几乎没有什么困惑 我正在开发一个rest API 它有以下请求 key value key1 value1 pl
  • Spring Boot中服务接口类的用途

    我的问题是关于接口类的使用 我对 Spring 还很陌生 所以如果这过于简单 请耐心等待 首先 当您可以在 BoxService 中声明 find all 时 这里拥有 IBoxService 接口有什么意义 其次 在控制器中如何使用IBo
  • Spring boot:单元测试和配置文件

    我正在对休息控制器进行单元测试 这只是更大应用程序的一小部分 我的应用程序无法识别我的测试上下文 并且出现以下异常 java lang IllegalStateException 无法加载ApplicationContext 这是我的测试课
  • Spring webflux bean 验证不起作用

    我正在尝试在 Webflux 中使用 bean 验证 这是我到目前为止所拥有的 PostMapping contact fun create RequestBody Valid contact Mono
  • JPA EntityManagerHolder 无法使用 Spring 5.1 和 Hibernate 5.3 转换为 Hibernate SessionHolder

    在我们使用 Spring Boot 2 1 3 Spring Data Rest 3 1 5 Spring Data JPA 2 1 5 和 Hibernate 5 3 7 的项目中 我们正在使用 Spring Framework 5 1
  • Spring @PostConstruct 依赖于 @Profile

    我想在一个配置类中拥有多个 PostConstruct 带注释的方法 这些方法应该根据 Profile 进行调用 你可以想象这样的代码 Configuration public class SilentaConfiguration priv
  • Spring Kafka - 为任何主题的分区消耗最后 N 条消息

    我正在尝试读取请求的卡夫卡消息数 对于非事务性消息 我们将从 endoffset N 对于 M 个分区 开始轮询并收集当前偏移量小于每个分区的结束偏移量的消息 对于幂等 事务消息 我们必须考虑事务标记 重复消息 这意味着偏移量将不连续 在这

随机推荐