获取springbean的几种方式
首先我说一下我遇到的问题,再项目初始化时候,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 BlhRequestExecutor
extends 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);
}
}
获取springbean的几种方式的更多相关文章
- 获取Type的三种方式
using System;using UnityEngine; public class Type_Test : MonoBehaviour{ private void Awake() { ...
- java动态获取WebService的两种方式(复杂参数类型)
java动态获取WebService的两种方式(复杂参数类型) 第一种: @Override public OrderSearchListRes searchOrderList(Order_Fligh ...
- AngularJS中获取数据源的几种方式
在AngularJS中,可以从$rootScope中获取数据源,也可以把获取数据的逻辑封装在service中,然后注入到app.run函数中,或者注入到controller中.本篇就来整理获取数据的几 ...
- java 获取时间戳的三种方式
java 获取时间戳的三种方式 CreationTime--2018年7月13日16点29分 Author:Marydon 1.实现方式 方式一:推荐使用 System.currentTimeMi ...
- 【Struts2】Struts2获取session的三种方式
1.Map<String,Object> map = ActionContext.getContext().getSession(); 2.HttpSession session = S ...
- js获取时间戳的三种方式
js获取时间戳的三种方式 CreateTime--2018年5月23日08:44:10 Author:Marydon // 方式一:推荐使用 var timestamp=new Date().ge ...
- Struts2(四.注册时检查用户名是否存在及Action获取数据的三种方式)
一.功能 1.用户注册页面 <%@ page language="java" contentType="text/html; charset=UTF-8" ...
- HTTP获取信息的四种方式
HTTP 从网络获取信息的四种方式 GET GET指代你在浏览器中输入网址,浏览网站时做的事.例如,我们使用 http://www.baidu.com 的时候,可以将GET想象成他说:"hi ...
- SpringMVC获取参数的几种方式
前言: 年末了,忙了一年了却发现系统的整理的东西很少,一些基础的东西都未做整理,这里就将它随便整理一下,增加一些印象,当然在网上看到一些好的资料也会整理下来以备后用.今天整理一下springMVC获取 ...
随机推荐
- 关于SVG图片不显示
SVG图片在本地调试时.可以正常显示.可是上传到server或者虚拟主机以后不显示. 这个问题该怎么解决呢? 两种解决的方法: 第一种:在server上 IIS 或者其它Webserver上 加入 S ...
- 'IOKING' TCP Transmission Server Engine ('云猴'©TCP通讯server引擎)(预告版)
关键词: IOKING IOCP TCP Transmission Server Engine Lock Free Interlocked 云猴完毕portTCP通讯server引擎 无锁 原子锁( ...
- 适合国内网速的CDH5安装
0.集群规划 说明:因为CDH能够方便的动态加入删除主机,动态改变主机上的服务,所以后面再对各机器上跑得服务进行分配. 共三台机器 操作系统: centos6.5 机器名:work01.work02. ...
- tiny4412 裸机程序 九、串口排查驱动原因及字符图片显示【转】
本文转载自:http://blog.csdn.net/eshing/article/details/37410571 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 一 ...
- bzoj1143: [CTSC2008]祭祀river && bzoj27182718: [Violet 4]毕业旅行
其实我至今不懂为啥强联通缩点判入度会错... 然后这个求的和之前那道组合数学一样,就是最长反链=最小链覆盖=最大独立集. #include<cstdio> #include<iost ...
- [bzoj3274]Circle
https://www.zybuluo.com/ysner/note/1243396 题面 有\(n\)个排成一圈的格子,并且已知正整数\(k\)和\(m\),你需要往每个格子中填入一个大于等于\(k ...
- pandas删除满足特定列信息的行记录
#!/usr/bin/python import pandas as pd df = pd.read_excel('c:\data\zichan.xlsx') df_sn = pd.read_exce ...
- 常见的几种异常类型Exception
转自:https://blog.csdn.net/niceworkgogogo/article/details/71746208 算数异常类:ArithmeticExecption 空指针异常类型:N ...
- 数据库登陆失败原因: 未与信任 SQL Server 连接相关联
解决方案:用户 'sa' 登录失败.原因: 未与信任 SQL Server 连接相关联. 问题简述: 用户 'sa' 登录失败.原因: 未与信任 SQL Server 连接相关联. 说明: 执行当前 ...
- 创建 /dev/video0 节点 (转载)
转自:http://blog.csdn.net/linuxmake/article/details/8208464 最近做摄像头驱动,发现没有 /dev/video0节点,经过查看发现是内核编译时没有 ...