首先我说一下我遇到的问题,再项目初始化时候,spring容器初始化前要执行的操作中使用到了bean去做一些增删改查操作,这样做是不能自己使用springbean的数据源去操作的,所以需要动态获取springbean,又不想重新封装jdbc数据源去操作,,可以直接获取到spring配置文件中的数据源进行操作

第一种方法是

在初始化时保存ApplicationContext对象
代码:
ApplicationContext ac = new FileSystemXmlApplicationContext("applicationContext.xml");
ac.getBean("beanId");
说明:这种方式适用于采用Spring框架的独立应用程序,需要程序通过配置文件手工初始化Spring的情况。

//但是我不明白怎么去配置初始化spring,我写的时候 new FileSystemXmlApplicationContext("applicationContext.xml");返回的不是ApplicationContext,所以pass掉了,,还需要再学习一下

鬼使神差的又可以了,,, ApplicationContext ac = new FileSystemXmlApplicationContext("app-persistence.xml");可以拿到了哦各位

方法二:通过Spring提供的工具类获取ApplicationContext对象
代码:
import org.springframework.web.context.support.WebApplicationContextUtils;
ApplicationContext ac1 = WebApplicationContextUtils.getRequiredWebApplicationContext(ServletContext sc);
ApplicationContext ac2 = WebApplicationContextUtils.getWebApplicationContext(ServletContext sc);
ac1.getBean("beanId");
ac2.getBean("beanId");
说明:
这种方式适合于采用Spring框架的B/S系统,通过ServletContext对象获取ApplicationContext对象,然后在通过它获取需要的类实例。

上面两个工具方式的区别是,前者在获取失败时抛出异常,后者返回null。

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

方法四:继承自抽象类WebApplicationObjectSupport
说明:类似上面方法,调用getWebApplicationContext()获取WebApplicationContext

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

最后说一下我所使用的是第五种方式,该方法实现ApplicationContextAware接口,然后直接通过上下文就可以获取配置文件中的bean,

注意:该方法不以来servlet,不需要注入的方式,在服务器启动时,Spring容器初始化时,不能通过以下方法获取Spring 容器。

  WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext();

  wac.getBean("");

直接上代码

@Service
public class BlhRequestExecutorextends AbstractRequestExecutor implements ApplicationContextAware
{private Logger logger = LoggerFactory.getLogger(BlhRequestExecutor.class);private static ApplicationContext context = null; public BlhRequestExecutor() {}public IZrarResponse service(HttpServletRequest request, HttpServletResponse response) throws BaseException {IZrarRequest zrarRequest = new ZrarRequest(request);IBaseZrarDao dao  = (IBaseZrarDao) context.getBean("dao");//记录日志实体System.out.println("----------------------------------记录日志开始---------------");String id = IdGenerator.getGuid();String commite =null;String endTime =null;String usedTime =null;long end;long start; //获取系统时间String startTime = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss").format(new Date());start = System.currentTimeMillis();//获取登陆用户账户String userId = LoginCtrlSession.getYhid();System.out.println(userId);String userName = LoginCtrlSession.getYhmc();String visitUrl = String.valueOf(request.getRequestURL().toString());System.out.println("----------------------------------记录日志中---------------");try {String[] reqInfo = UrlParser.parseReqGoal(request);Object visitClass = EasywebContext.Factory.getInstance().getBeanWithBlhAnnotation(reqInfo[0]);if (visitClass == null) { throw new BaseException(1002);}if (this.logger.isDebugEnabled()) {this.logger.debug("|>> Start " + Thread.currentThread().getId() + " " + reqInfo[0] + "_" + reqInfo[1]);}Method visitMethod = visitClass.getClass().getMethod(reqInfo[1], new Class[] { IZrarRequest.class });IZrarResponse rs = (IZrarResponse)visitMethod.invoke(visitClass, new Object[] { zrarRequest });String error = rs.getError();if (StringUtil.isNotNull(error)) {throw new BusinessException(rs.getErrorCode(), error);}end = System.currentTimeMillis();endTime = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss").format(new Date());usedTime =String.valueOf((end-start)/1000).toString();System.out.println("------aop执行时间-----------"+(end-start));commite = "执行成功";System.out.println("----------------------------------记录日志结束---------------");dao.execute("insert into aoploginfo set id='"+id+"', startTime='"+startTime+"',endTime='"+endTime+"',usedTime='"+usedTime+"', visitUrl='"+visitUrl+"',userId='"+userId+"',userName='"+userName+"',commite='"+commite+"'");return rs;} catch (SecurityException e) {commite = "执行异常";throw new BaseException("SecurityException", e);} catch (IllegalArgumentException e) {commite = "执行异常";throw new BaseException("IllegalArgumentException", e);} catch (NoSuchMethodException e) {commite = "执行异常";throw new BaseException(1002);} catch (IllegalAccessException e) {commite = "执行异常";throw new BaseException(1003, e);} catch (InvocationTargetException e) {commite = "执行异常";Throwable targetException = e.getTargetException();if (BaseException.class.isAssignableFrom(targetException.getClass())) {throw ((BaseException)targetException);}throw new BaseException(targetException);} catch (BaseException e) {commite = "执行异常";throw e;} finally{if("执行异常".equals(commite)){end = System.currentTimeMillis();endTime = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss").format(new Date());usedTime =String.valueOf((end-start)/1000).toString();dao.execute("insert into aoploginfo set id='"+id+"', startTime='"+startTime+"',endTime='"+endTime+"',usedTime='"+usedTime+"', visitUrl='"+visitUrl+"',userId='"+userId+"',userName='"+userName+"',commite='"+commite+"'");}}}@Override
public void setApplicationContext(ApplicationContext applicationContext)throws BeansException {context = applicationContext; }
public static Object getBean(String name){ return context.getBean(name);
}
}

  

转载于:https://www.cnblogs.com/wwccyy66/p/barray.html

获取springbean的几种方式相关推荐

  1. SpringBoot静态获取 bean的三种方式,你学会了吗?

    欢迎关注方志朋的博客,回复"666"获面试宝典 来源:blog.csdn.net/showchi/article/details/97005720 注意:调用者要被spring管理 ...

  2. aes key长度_原创 | 浅谈Shiro反序列化获取Key的几种方式

    点击"关注"了解更多信息 关于Apache Shiro反序列化 在shiro≤1.2.4版本,默认使⽤了CookieRememberMeManager,由于AES使用的key泄露, ...

  3. Spring读取配置文件,获取bean的几种方式

    Spring读取配置文件,获取bean的几种方式 方法一:在初始化时保存ApplicationContext对象 代码: ApplicationContext ac = new FileSystemX ...

  4. Spring Boot 获取 Bean 的 3 种方式!还有谁不会?

    作者 | chilx 来源 | https://blog.csdn.net/showchi/article/details/97005720 注意:调用者要被spring管理 方式一 注解@PostC ...

  5. android获取自定义属性,android 自定义控件中获取属性的三种方式(转)

    第一种方法,直接设置属性值,通过attrs.getAttributeResourceValue拿到这个属性值. (1)在xml文件中设置属性值 android:layout_width="f ...

  6. SpringMVC获取参数的几种方式

    SpringMVC获取参数的几种方式 前言: 年末了,忙了一年了却发现系统的整理的东西很少,一些基础的东西都未做整理,这里就将它随便整理一下,增加一些印象,当然在网上看到一些好的资料也会整理下来以备后 ...

  7. MyBatis获取参数值的两种方式以及传参情况

    MyBatis获取参数值的两种方式 MyBatis获取参数值的两种方式:${}和#{} 传参情况 演示环境 1.单个字面量类型的参数 2.多个字面量类型的参数 3.map集合类型的参数 4.实体类类型 ...

  8. python 执行shellcode_简述获取shellcode的几种方式

    原标题:简述获取shellcode的几种方式 0×00 shellcode简介 在攻击中,shellcode是一段用于利用软件漏洞的有效负载,shellcode是16进制的机器码,以其经常让攻击者获得 ...

  9. Spring Boot当中获取request的三种方式

    本篇博客主要记录request相关知识,也是开发当中经常遇到的,感兴趣的跟小编一起学习吧! 目录 一.请求过程 二.获取request的三种方式 2.1.可以封装为静态方法 2.2.controlle ...

最新文章

  1. Spring AOP+事务控制
  2. 9.2 图像类型(灰度图像、彩色图像、二值图像以及图像间的转换)
  3. JZOJ 5371. 【NOIP2017提高A组模拟9.17】组合数问题
  4. neo4j / cypher:悬挂查询参数
  5. [vue] 你知道vue的模板语法用的是哪个web模板引擎的吗?说说你对这模板引擎的理解
  6. UML之用例图(use case)箭头方向
  7. 学硕、全日制停招!研究生重大变革,来了
  8. 50个精心收集的惊人的jquery绚丽插件--功能全覆盖
  9. java集合(一):List、Iterator、Array、ArrayList、LinkList
  10. 信用评分卡模型分析(基于Python)--python实现
  11. RV减速器静力学和动力学仿真分析
  12. GIT 操作中 Reinitialized existing Git repository in.......解决方法?
  13. Marlin固件解析G代码部分分析
  14. sqli-labs(46-49)
  15. 第一个STM8项目的记录
  16. 每日10行代码86: 计算两个向量的夹角余弦值
  17. java写triangle_Java - 制作Triangle类
  18. 最新江苏安全员B考试单选练习题库
  19. 人工智能-自然语言处理(2)
  20. 锁相环载波同步MATLAB实现,利用锁相环实现载波同步

热门文章

  1. 2019公需科目快速学完_【1017丨话题】励志!69岁大爷驾校学车走红,“科目二有信心一次过quot;...
  2. IAI OpenLab工业人工智能开放实验室白皮书(一)
  3. Pure Pursuit纯跟踪算法Python/Matlab算法实现
  4. oracle表违反主键约束,主键/约束/事务/表关系 Oracle
  5. Linux采用服务器网址,Linux实现https方式访问站点
  6. impdb导入oracle,impdp导入.dmp到oracle
  7. 教育部计算机考研大纲,2018考研大纲从哪里看?
  8. 永恒之蓝(MS17-010)补丁KB号
  9. canal 历史数据如何处理_MySQL日志解析工具Canal的使用
  10. js 获取URL参数乱码解决