java 获取bean_Spring获取bean的几种方式

工作中需要对一个原本加载属性文件的工具类修改成对数据库的操作当然,ado层已经写好,但是需要从Spring中获取bean,然而,工具类并没有交给Spring来管理,所以需要通过方法获取所需要的bean。于是整理了Spring获取bean的几种方法。

一. 在初始化时保存ApplicationContext对象

ApplicationContext ac = new FileSystemXmlApplicationContext("classpath:beans.xml");

ac.getBean("beanId");

说明:这种方式适用于采用Spring框架的独立应用程序,需要程序通过配置文件手工初始化Spring的情况。不难理解对于通过web.xml配置启动的Spring来说也一定是里面实现了此方法。

二. 通过Spring提供的工具类获取ApplicationContext对象

ApplicationContext ac1 =WebApplicationContextUtils.getRequiredWebApplicationContext(ServletContext sc);

ApplicationContext ac2=WebApplicationContextUtils.getWebApplicationContext(ServletContext sc);

ac1.getBean("beanId");

ac2.getBean("beanId");

说明:这种方法适合于B/S模式,需要提供ServletContext,局限性比较大,至于以上两个方法区别是前者出错会抛出异常,而后者会返回null。

三. 继承自抽象类ApplicationObjectSupport

说明:抽象类ApplicationObjectSupport提供getApplicationContext()方法,可以方便的获取ApplicationContext。

Spring初始化时,会通过该抽象类的setApplicationContext(ApplicationContext context)方法将ApplicationContext 对象注入。

四. 继承自抽象类WebApplicationObjectSupport

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

五:实现接口ApplicationContextAware

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

相比下来对于需要获取已经启动的bean。我们需要获取bean方法,这时我们可以通过实现接口ApplicationContextAware来获取。

实际应用:

一. SpringContextHolder类

package com.gren.supervise.commons;

import org.springframework.context.ApplicationContext;

import org.springframework.context.ApplicationContextAware;

/**

* 以静态变量保存Spring ApplicationContext, 可在任何代码任何地方任何时候中取出ApplicaitonContext.

*

*/

public class SpringContextHolder implements ApplicationContextAware {

private static ApplicationContext applicationContext;

/**

* 实现ApplicationContextAware接口的context注入函数, 将其存入静态变量.

*/

public void setApplicationContext(ApplicationContext applicationContext) {

SpringContextHolder.applicationContext = applicationContext; // NOSONAR

}

/**

* 取得存储在静态变量中的ApplicationContext.

*/

public static ApplicationContext getApplicationContext() {

checkApplicationContext();

return applicationContext;

}

/**

* 从静态变量ApplicationContext中取得Bean, 自动转型为所赋值对象的类型.

*/

@SuppressWarnings("unchecked")

public static T getBean(String name) {

checkApplicationContext();

return (T) applicationContext.getBean(name);

}

/**

* 从静态变量ApplicationContext中取得Bean, 自动转型为所赋值对象的类型.

*/

@SuppressWarnings("unchecked")

public static T getBean(Class clazz) {

checkApplicationContext();

return (T) applicationContext.getBeansOfType(clazz);

}

/**

* 清除applicationContext静态变量.

*/

public static void cleanApplicationContext() {

applicationContext = null;

}

private static void checkApplicationContext() {

if (applicationContext == null) {

throw new IllegalStateException("applicaitonContext未注入,请在applicationContext.xml中定义SpringContextHolder");

}

}

}

二. PropertyUtil

package com.gren.supervise.util;

import java.io.IOException;

import java.util.ArrayList;

import java.util.Enumeration;

import java.util.List;

import java.util.Properties;

import com.gren.supervise.commons.SpringContextHolder;

import com.gren.supervise.dao.MapCnfDao;

import com.gren.supervise.pojo.MapCnf;/**

* 媒资系统配置文件参数获取工具

**/

public final classPropertyUtil {private staticProperties props;private staticMapCnfDao cnfDao;privatePropertyUtil() {

}static{

cnfDao= (MapCnfDao) SpringContextHolder.getBean("cnfDao");

props= newProperties();try{

props.load(PropertyUtil.class.getResourceAsStream("/config.properties"));

}catch(IOException e) {

e.printStackTrace();

}

}public staticProperties getSysProperties() {

Properties properties= newProperties();

List cnfs =cnfDao.list();for (int i = 0; i < cnfs.size(); i++) {

properties.put(cnfs.get(i).getKey(), cnfs.get(i).getValue());

}returnproperties;

}/**

* 获取指定的系统属性

*

* @param key

* 指定的属性名称

* @return 指定的系统属性值*/

public staticString getProperty(String key) {

ConditionFilter conditionFilter= new ConditionFilter("key", key,

ConditionFilter.EQ);

List conditionFilters = new ArrayList();

conditionFilters.add(conditionFilter);

List cnfs =cnfDao.queryByCondition(conditionFilters);if(null==cnfs){return null;

}return cnfs.get(0).getValue();

}/**

* 获取指定的系统属性

*

* @param key

* 指定的属性名称

* @param defaultVal

* 默认值

* @return 指定的系统属性值*/

public staticString getProperty(String key, String defaultVal) {returngetProperty(key);

}/** 修改属性*/

public static voidput(String key, String value) {

MapCnf entity= newMapCnf();

entity.setKey(key);

entity.setValue(value);

ConditionFilter conditionFilter= new ConditionFilter("key", key,

ConditionFilter.EQ);

List conditionFilters = new ArrayList();

conditionFilters.add(conditionFilter);

List cnfs =cnfDao.queryByCondition(conditionFilters);if(null!=cnfs&&cnfs.get(0).getId()>0){

entity.setId(cnfs.get(0).getId());

cnfDao.saveOrupdate(entity);

}

}public static voidtoCnfMap() {

Enumeration enumeration=props.propertyNames();while(enumeration.hasMoreElements()) {

String key=(String) enumeration.nextElement();

PropertyUtil.put(key, (String) props.get(key));

}

}

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于计算机专业的学生而言,参加各类比赛能够带来多方面的益处,具体包括但不限于以下几点: 技能提升: 参与比赛促使学生深入学习和掌握计算机领域的专业知识与技能,如编程语言、算法设计、软件工程、网络安全等。 比赛通常涉及实际问题的解决,有助于将理论知识应用于实践,增强问题解决能力。 实践经验: 大多数比赛都要求参赛者设计并实现解决方案,这提供了宝贵的动手操作机会,有助于积累项目经验。 实践经验对于计算机专业的学生尤为重要,因为雇主往往更青睐有实际项目背景的候选人。 团队合作: 许多比赛鼓励团队协作,这有助于培养学生的团队精神、沟通技巧和领导能力。 团队合作还能促进学生之间的知识共享和思维碰撞,有助于形成更全面的解决方案。 职业发展: 获奖经历可以显著增强简历的吸引力,为求职或继续深造提供有力支持。 某些比赛可能直接与企业合作,提供实习、工作机会或奖学金,为学生的职业生涯打开更多门路。 网络拓展: 比赛是结识同行业人才的好机会,可以帮助学生建立行业联系,这对于未来的职业发展非常重要。 奖金与荣誉: 许多比赛提供奖金或奖品,这不仅能给予学生经济上的奖励,还能增强其成就感和自信心。 荣誉证书或奖状可以证明学生的成就,对个人品牌建设有积极作用。 创新与研究: 参加比赛可以激发学生的创新思维,推动科研项目的开展,有时甚至能促成学术论文的发表。 个人成长: 在准备和参加比赛的过程,学生将面临压力与挑战,这有助于培养良好的心理素质和抗压能力。 自我挑战和克服困难的经历对个人成长有着深远的影响。 综上所述,参加计算机领域的比赛对于学生来说是一个全面发展的平台,不仅可以提升专业技能,还能增强团队协作、沟通、解决问题的能力,并为未来的职业生涯奠定坚实的基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值