前几天在做一个任务时,需要在一个普通的java类(不受Spring管理的类)中,调用 spring data jpa的某个xxxReponsitory 接口,同时需要读取properties 文件中的属性值,试了很多方法拿到的都是null,花了半个下午的时间才搞定,现在记录下解决方法。

这个问题网上大概有两个思路:

1. 将这个不受Spring管理的类交给Spring管理,然后就可以依赖注入 spring管理的对象了;
这个思路的方法对我的遇到的问题没有作用,在这里就不多说了,因为我这个类被调用的时候是new出来的。

**New出来的对象是不受spring管理的。**

2. 获取spring 的上下文对象,从而拿到spring管理的对象。
这里分为两个步骤 :
步骤一:获取 spring ApplicationsContext对象,以下几种方法都可行:
(1) 通过加载配置文件获取ApplicationContext对象
Spring中的几种容器都支持加载xml配置文件:

ApplicationContext context = new GenericXmlApplicationContext
("applicationContext.xml");
ApplicationContext context = new FileSystemXmlApplicationContext
("applicationContext.xml");
ApplicationContext context = new ClassPathXmlApplicationContext
("applicationContext.xml");

以上三个任选一个都可以。

(2)通过Spring提供的工具类获取ApplicationContext对象

2 ApplicationContext context1 = WebApplicationContextUtils.getRequiredWebApplicationContext(ServletContext sc);
3 ApplicationContext context2 = WebApplicationContextUtils.getWebApplicationContext(ServletContext sc);

这种方式适合于采用Spring框架的B/S系统,通过ServletContext对象获取ApplicationContext对象,
上面两个工具方式的区别是,前者在获取失败时抛出异常,后者返回null。

(3)通过继承抽象类ApplicationObjectSupport来获取act对象

抽象类ApplicationObjectSupport提供getApplicationContext()方法,可以方便的获取到ApplicationContext。
Spring初始化时,会通过该抽象类的setApplicationContext(ApplicationContext context)方法将ApplicationContext 对象注入。

(4)通过继承抽象类WebApplicationObjectSuport来获取act对象

类似上面方法,调用getWebApplicationContext()获取WebApplicationContext

(5)实现接口ApplicationContextAwarc来获取act对象

实现该接口的setApplicationContext(ApplicationContext context)方法,并保存ApplicationContext 对象。
Spring初始化时,会通过该方法将ApplicationContext对象注入。

(6)通过Spring提供的ContextLoader来获取act对象

WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext();

步骤二:通过ApplicationContext对象 获取spring管理的对象

Xxxx xxxx = (Xxxx)context.getBean(“beanId”);
或者
Xxxx xxxx = (Xxxx)context.getBean(beanClass);
如果通过beanId获取bean,beanId需要是配置文件中指定好了的
如果通过beanClass获取bean,则该bean需要在spring的扫描范围内

例:
1)通过beanId 获取配置文件中的属性

  Properties props = (Properties) context.getBean("testProperties");enterpriseName = props.getProperty("default.enterprise.name");

2)通过beanClass获取UserRepository

UserRepository userRepository = context.getBean(UserRepository.class);

在不受Spring管理的类中注入spring 管理的对象相关推荐

  1. 【spring】在servlet中注入spring的bean,servlet容器和spring容器

    一.Servlet容器 Servlet的整个生命周期好象都是由Servlet容器来处理的. 如果把它硬放到Spring容器中去创建,Servlet对象是可被Spring容器建出来,但Servlet容器 ...

  2. 170630、springboot编程之普通类中调用spring管理的bean对象

    我们知道如果我们要在一个类使用spring提供的bean对象,我们需要把这个类注入到spring容器中,交给spring容器进行管理,但是在实际当中,我们往往会碰到在一个普通的Java类中,想直接使用 ...

  3. 【SpringBoot】在普通类中获取spring容器中的bean

    这段时间公司搞封闭开发,做一个联通总部的客服系统项目,是基于springboot的.在开发工程中遇到一个页面datagrid数据排序的功能,因为有多个表的数据都要用到排序功能,于是我就写了一个排序功能 ...

  4. 在普通类中获取spring容器中的bean

    在普通类中获取spring容器中的bean 1.工具类 package com.itheima.hchat.util;import org.springframework.beans.BeansExc ...

  5. spring初始化在ServletContextListener实现类中获取spring注入对象

    查了好多资料,发现还是不全,干脆自己整理吧,至少保证在我的做法正确的,以免误导读者,也是给自己做个记录吧! 由于项目须要,需在ServletContextListener监听接口实现类中调用sprin ...

  6. 在ServletContextListener实现类中获取spring注入对象

    由于项目需要,需在ServletContextListener监听接口实现类中调用spring注入的对象,以获取系统初始化参数.代码如下: [java] view plain copy import  ...

  7. java 普通类request_[Java教程]spring在普通类中获取session和request

    [Java教程]spring在普通类中获取session和request 0 2014-08-12 08:01:13 在使用spring时,经常需要在普通类中获取session,request等对像. ...

  8. spring boot整合Quartz 在Job类中注入其他对象报空指针异常java.lang.NullPointerException at com.sxt.quartz.QuartzDemo.e

    情况在Job 类中注入RedisTemplate 报空指针异常 原因:我们使用JobDetailFactoryBean 帮我们创建对象 实际上调用的是AdaptableJobFactory 下的这个方 ...

  9. Quartz业务类无法注入Spring对象问题

    tags: 解决错误, titile: Quartz业务类无法注入Spring对象问题 Quartz业务类无法注入Spring对象问题 在刚开始遇到的时候还以为是Spring配置哪里错误了,结果搞了那 ...

最新文章

  1. 用VB6写的一个简单俄罗斯方块代码
  2. 微软发布 Microsoft SoftGrid 4.1 SP1 及 4.2 累计更新补丁
  3. 书籍折页是什么效果_Word的书籍折页是什么 如何设置Word的书籍折页
  4. python3命令需要使用命令行开发者工具_关于Python3的import问题(pycharm可以运行命令行import错误)...
  5. RHEL 5.4下cyrus-sasl-2.1.22 的编译安装
  6. 太妙了!微软670页《dotnet官方手册》火了,完整PDF开放下载!
  7. metasploit渗透测试指南_Metasploit渗透测试环境搭建与使用
  8. 《软件建模与设计: UML、用例、模式和软件体系结构》一一3.2 设计验证和确认...
  9. Go语言学习笔记——Go语言数据类型
  10. java字符串的替换replace、replaceAll、replaceFirst的区别详解
  11. 一个算例 介绍 libmesh 的类
  12. 攻防世界 web高手进阶区 7分题 wtf.sh-150
  13. 计算机手工绘图,你知道做毕业设计的时候为什么一定要有手工绘图呢?
  14. ssm基于微信小程序的游泳馆管理系统 uinapp 计算机毕业设计
  15. ATECLOUD智能云测试平台-测试测量/仪器程控/工业控制/上位机开发软件
  16. 大一作业HTML期末网页作业(化妆品网站制作) html+css+js 雅诗兰黛美妆网站制作
  17. Cross-sell and Up-sell
  18. RabbitMQ与PHP应用
  19. python正整数平方根_python怎么求一个数的平方根
  20. java time_java常用类Time

热门文章

  1. Android学习系列(19)--App离线下载
  2. python制作zzulioj排名动态图
  3. SNS好友动态信息设计(二)
  4. 英语对一个程序员来说有多重要?
  5. idea中设置自动导包
  6. 极客日报第79期:腾讯回应两块八卖《鬼谷八荒》:已下架并退款;iMac Pro 售完即停产;iCloud 识别姓氏闹乌龙
  7. 非典逼出了淘宝和京东,新冠病毒能够逼出什么?
  8. 为什么刺客信条这么迷人?
  9. smb v2到底是快还是慢?如何禁用呢
  10. 宏宇社:国外lead入门教程(五)如何开始操作lead任务