在最近的项目中,有个地方我们不得不实用getBean的方法,自己从Spring context中获取bean进行数据库操作。
方法一(效率低,极易出现bug,不推荐使用):
刚刚开始的时候,我们使用这中方式,但是在应用过程中发现此方式效率低下,而且极易出现bug。
在我们系统中会生成ehcache_auto_created_时间戳文件夹,
<!-- lang: java -->
String[] xmlCfg = new String[] {"classpath:/spring/applicationContext-service.xml",
"classpath:/spring/applicationContext-util.xml",
"classpath:/spring/applicationContext.xml"};
ApplicationContext context = new FileSystemXmlApplicationContext(xmlCfg);
// 获取inspectionUtil bean
inspectionUtil = (InspectionUtil) context.getBean("inspectionUtil");
所以我google了一下,改用其他方法。
方法二(效率高,灵活性高,可复用,推荐使用):
创建一个工具类SpringContextsUtil ,通过实现Spring中的ApplicationContextAware接口,在applicationContext.xml中注入bean后Spring会自动调用setApplicationContext方法。此时我们就可以获取到Spring context。
<!-- lang: java -->
public class SpringContextsUtil implements ApplicationContextAware{
private static ApplicationContext applicationContext; //Spring应用上下文环境
/**
* 实现ApplicationContextAware接口的回调方法,设置上下文环境
* @param applicationContext
* @throws BeansException
*/
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
SpringContextsUtil.applicationContext = applicationContext;
}
/**
* @return ApplicationContext
*/
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
/**
* 获取对象
* @param name
* @return Object 一个以所给名字注册的bean的实例
* @throws BeansException
*/
public static Object getBean(String name) throws BeansException {
return applicationContext.getBean(name);
}
/**
* 获取类型为requiredType的对象
* 如果bean不能被类型转换,相应的异常将会被抛出(BeanNotOfRequiredTypeException)
* @param name bean注册名
* @param requiredType 返回对象类型
* @return Object 返回requiredType类型对象
* @throws BeansException
*/
public static Object getBean(String name, Class requiredType) throws BeansException {
return applicationContext.getBean(name, requiredType);
}
/**
* 如果BeanFactory包含一个与所给名称匹配的bean定义,则返回true
* @param name
* @return boolean
*/
public static boolean containsBean(String name) {
return applicationContext.containsBean(name);
}
/**
* 判断以给定名字注册的bean定义是一个singleton还是一个prototype。
* 如果与给定名字相应的bean定义没有被找到,将会抛出一个异常(NoSuchBeanDefinitionException)
* @param name
* @return boolean
* @throws NoSuchBeanDefinitionException
*/
public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException {
return applicationContext.isSingleton(name);
}
/**
* @param name
* @return Class 注册对象的类型
* @throws NoSuchBeanDefinitionException
*/
public static Class getType(String name) throws NoSuchBeanDefinitionException {
return applicationContext.getType(name);
}
/**
* 如果给定的bean名字在bean定义中有别名,则返回这些别名
* @param name
* @return
* @throws NoSuchBeanDefinitionException
*/
public static String[] getAliases(String name) throws NoSuchBeanDefinitionException {
return applicationContext.getAliases(name);
}
}
调用方法:
<!-- lang: java -->
// 获取inspectionUtil bean
inspectionUtil = (InspectionUtil) SpringContextUtil.getBean("inspectionUtil");
注:
1、使用时会出现无法获取applicationContext,并抛出NullPointerException。
原因:使用此方法必须在spring applicationContext.xml中注入bean。否则spring无法自动调用setApplicationContext。如下
<!-- lang: xml -->
<bean id="springContextsUtil" class="com.sinosoft.sepmis.util.SpringContextsUtil" ></bean>
2、如果注入后仍然出现这个问题。
则修改<beans default-autowire="byName" default-lazy-init="true">中的default-lazy-init="false"。
或者是修改bean注入属性
<!-- lang: xml -->
<bean id="springContextsUtil" class="com.sinosoft.sepmis.util.SpringContextsUtil" lazy-init="false"></bean>
转载于:https://my.oschina.net/u/225084/blog/167842
分享到:
相关推荐
Spring 源码分析 Spring 框架是 Java 语言中最流行的开源框架之一,它提供了一个强大且灵活的基础设施来构建企业级应用程序。在 Spring 框架中,IOC 容器扮演着核心角色,本文将深入分析 Spring 源码,了解 IOC ...
这里我们分析两种解决这个问题的方法。 首先,让我们深入理解问题的原因。在Spring中,`@Autowired`注解用于自动装配Bean,它依赖于Spring容器来扫描和管理Bean。然而,静态方法和静态变量不参与Spring的生命周期...
在该方法中,会调用BeanFactory的getBean()方法来创建BeanPostProcessor的实例。 5)AnnotationAwareAspectJAutoProxyCreator的创建过程会涉及到一系列的步骤,例如首先尝试获取一个单例对象,如果获取不到则会创建...
《Spring源码分析——BeanFactory》 在Java的IoC(Inversion of Control)和DI(Dependency Injection)领域,Spring框架扮演着至关重要的角色。BeanFactory是Spring的核心组件之一,它是容器的基石,负责管理应用...
Spring提供多种实例化Bean的方式,这里以`XmlBeanFactory`为例,通过`FileSystemResource`加载XML配置文件,然后通过`getBean`方法获取Bean实例。在`getBean`内部,会根据Bean定义创建并初始化Bean对象,包括执行...
如果你知道Bean的类型,可以使用`getBean(Class<T> requiredType)`方法,Spring会返回与给定类型匹配的第一个Bean。 ```java ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); ...
### Spring IOC容器实现分析 #### 一、Spring IOC容器概览 Spring框架作为一款轻量级的开源框架,其核心之一便是IOC(Inversion of Control)容器。该容器的主要功能在于管理和控制对象间的依赖关系,使得开发人员...
6. 添加获取Bean实例的方法,模拟Spring容器的getBean功能。 在标签中提到了“源码”和“工具”,这意味着博客可能会深入到Spring框架的源码层面,分析其内部实现机制,同时也可能介绍了一些辅助开发的工具,比如...
本文将深入探讨如何在Spring中获取`ApplicationContext`的公用方法,并结合提供的两个文件名`ShipOrderRecipientImpl.java`和`MyApplicationContextUtil.java`来分析可能的实现方式。 1. `ApplicationContext`概述...
- 在所有依赖都正确注入之后,Spring可能会调用Bean的初始化方法(如果定义了的话),以便进行额外的初始化工作。 - 初始化方法可以是`init-method`属性指定的方法或者是实现了`InitializingBean`接口中的`...
最后,通过getBean方法从容器中获取需要的Bean实例。 以上所述均基于Spring源码层面的分析。在实际应用中,开发者通常会使用更为高级的配置方式,如基于注解的配置以及Java配置类(使用@Configuration注解的类)。...
本文将深入探讨“springtest.rar”案例,通过分析构造方法注入和setter方法注入两种方式,来理解并掌握Spring的依赖注入机制。 首先,我们来看构造方法注入。当一个类的实例化需要依赖其他对象时,可以通过构造函数...
当我们调用`getBean`方法时,Spring会在这个Map中查找对应的bean。在`DefaultListableBeanFactory`的源码中,可以看到如下的逻辑: ```java public Object getBean(String name) throws BeansException { return ...
传统的程序设计中,通常是调用者主动去创建依赖对象或者调用依赖对象的方法,而在Spring框架中的IOC容器则负责将被依赖对象传入到调用者之中。这种模式使得组件之间的依赖关系由容器在运行期决定,即由容器动态地将...
本文将通过分析Spring源代码来揭示其IoC容器的工作原理。 首先,我们要理解IoC的概念。IoC是一种设计模式,它将对象的创建和管理从应用逻辑中解耦出来,由一个中心组件(如Spring的ApplicationContext)负责。在...
- 通过`SpringUtil.getBean()`获取`DeptDao`实例,并调用其方法来展示结果。 通过上述代码示例,我们可以看到Spring JDBC如何简化了常见的数据库操作,使得开发者可以将更多的精力放在业务逻辑上,而不是底层的...
- **获取Bean**:通过`ApplicationContext`的`getBean`方法获取Bean实例,进行后续操作。 4. **源码分析** Spring容器的实现涉及到`DefaultListableBeanFactory`、`BeanDefinition`、`BeanPostProcessor`等多个类...
- **依赖解析(Dependency Resolution)**:分析Bean之间的依赖关系,并在初始化Bean时注入依赖。 - **Bean实例化(Bean Instantiation)**:根据Bean定义创建Bean实例,可以使用反射API完成。 - **生命周期管理...
BeanFactory接口提供了几个关键方法,例如`getBean(String name)`用于根据bean的名称获取bean实例;`getBean(String name, Class requiredType)`则在获取bean时,确保返回的实例与指定类型匹配。`containsBean...