`

通过实现ApplicationContextAware接口动态获取bean

 
阅读更多

场景:

在代码中需要动态获取spring管理的bean

 

代码:

SpringContextUtils.java

package com.wyy.snail.core.util;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

/**
 * Spring的工具类,用来获得配置文件中的bean
 * 
 * @author penghy
 * @date 2014-04-08
 * 
 */
@Component
public class SpringContextUtils implements ApplicationContextAware {

	private static ApplicationContext applicationContext = null;

	/***
	 * 当继承了ApplicationContextAware类之后,那么程序在调用 getBean(String)的时候会自动调用该方法,
	 * 不用自己操作
	 */
	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
		SpringContextUtils.applicationContext = applicationContext;
	}

	public static ApplicationContext getApplicationContext() {
		return applicationContext;
	}

	/***
	 * 根据一个bean的id获取配置文件中相应的bean
	 * 
	 * @param name
	 * @return
	 * @throws BeansException
	 */
	public static Object getBean(String name) throws BeansException {
		return applicationContext.getBean(name);
	}

	/***
	 * 类似于getBean(String name)只是在参数中提供了需要返回到的类型。
	 * 
	 * @param name
	 * @param requiredType
	 * @return
	 * @throws BeansException
	 */
	public static <T> T getBean(String name, Class<T> 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);
	}
}

 

分享到:
评论

相关推荐

    Spring实现Aware接口自定义获取bean的两种方式

    ApplicationContextAware接口是Spring框架中的一种 Aware接口,通过实现该接口,可以获取ApplicationContext对象,从而获取bean对象。代码如下: @Service public class ApplicationContextHelper implements ...

    Java获取Bean的几种方式.pdf

    5. **实现ApplicationContextAware接口** 实现这个接口,Spring会在初始化时自动调用`setApplicationContext(ApplicationContext context)`方法,将ApplicationContext注入到Bean中。 ```java public class ...

    线程中获取spring 注解bean

    在提交任务时,可以将bean作为参数传递,或者在任务内部使用`ApplicationContextAware`接口获取应用上下文,从而获取bean。 4. **ApplicationContextAware**:让线程处理类实现`ApplicationContextAware`接口,...

    spring-aware接口实现与bean作用域(spring多容器层面)

    在多个项目整合且跨越Spring容器的情况下,获取Bean的实现方式可能更复杂。可以通过Spring的`ConfigurableApplicationContext`接口的`getBeanFactory()`方法获取`BeanFactory`,然后使用`BeanFactory`的`...

    Spring Aware标记接口使用案例解析

    通过实现 ApplicationContextAware 接口,Bean 对象可以获取到ApplicationContext 对象,从而访问 Spring 容器中的其他 Bean 对象。 在实际开发中,我们可以通过实现 ApplicationContextAware 接口来获取到...

    Spring通过ApplicationContext主动获取bean的方法讲解

    在上面的代码中,我们实现了ApplicationContextAware接口,并提供了几个静态方法来获取bean。getBean(String name)方法可以根据bean的名称来获取bean,而getBeanByName(Class&lt;T&gt; clazz)方法可以根据bean的类型来获取...

    Web项目中获取SpringBean与在非Spring组件中获取SpringBean.pdf

    总的来说,获取非Spring管理组件中的SpringBean主要有两种方式:一是通过实现`ApplicationContextAware`接口并存储ApplicationContext,二是使用注解和静态内部类来注入BeanFactory。这两种方法都是Spring框架提供的...

    5. 多个service实现同一个接口 或者抽象类 1

    `ApplicationContextHolder`类中的`getApplicationContext`和`getBean`方法提供了一种全局获取Spring应用上下文和bean的方法,这对于在应用中需要跨组件共享bean或者在不直接依赖于Spring的情况下获取bean非常有用。...

    Spring在应用中获得Bean的方法

    实现`ApplicationContextAware`接口,可以获取到`ApplicationContext`的引用,然后通过它获取Bean。 ```java public class MyClass implements ApplicationContextAware { private ApplicationContext context; ...

    多线程Autowire注入null的解决方案.docx

    解决方案二:写个获取spring bean的帮助类,实现ApplicationContextAware接口 可以创建一个帮助类,实现ApplicationContextAware接口,并在其中保存Spring ApplicationContext。然后,在需要使用service的地方,...

    Spring在代码中获取bean的方法小结

    在非Spring管理的类中,如果该类由Spring初始化,我们可以创建一个持有ApplicationContext的成员变量,并使用`@Autowired`注解进行注入,再通过ApplicationContext获取Bean: ```java @Autowired private ...

    17. Spring Boot普通类调用bean【从零开始学Spring Boot】

    你可以通过实现ApplicationContextAware接口,或者直接在代码中创建ApplicationContext实例来访问bean。 5. **非Spring管理类调用bean**: 在非Spring管理的类中,如果你想使用Spring容器中的bean,有以下几种方式...

    Spring中如何动态注入Bean实例教程

    * 实现 ApplicationContextAware 接口的回调方法,设置上下文环境 * * @param applicationContext */ public void setApplicationContext(ApplicationContext applicationContext) { SpringContextUtil....

    Spring启动后获取所有拥有特定注解的Bean实例代码

    在Bean的生命周期中,Spring提供了多种方式来获取Bean的实例,例如通过getBean方法、通过BeanFactory获取Bean实例等。 在获取所有拥有特定注解的Bean实例代码时,需要注意的是,ApplicationContextAware接口不能...

    springboot插件

    开发者可以通过实现ApplicationContextAware接口,获取到ApplicationContext实例,然后调用它的registerBeanDefinition方法来注册新的BeanDefinition。此外,还可以使用BeanPostProcessor接口来实现Bean实例化后的...

    Spring Bean生命周期.pdf

    这些接口允许Bean获取容器的相关信息,如Bean的名称、类加载器、Bean工厂等。 - InitializingBean:对应初始化阶段,它提供了afterPropertiesSet方法供开发者实现Bean初始化逻辑。 - DisposableBean:对应销毁阶段...

    Spring中关于Bean的管理的课件

    12. **BeanFactoryAware**:Bean可以通过实现这个接口获取到BeanFactory实例,从而在运行时能够访问到Spring容器的其他服务。 13. **ApplicationContextAware**:类似于BeanFactoryAware,但提供的是...

    Spring在代码中获取bean的几种方式详解

    在独立应用程序中,我们可以通过读取XML文件生成ApplicationContext对象,然后获取Bean实例。例如: ``` ApplicationContext ac = new FileSystemXmlApplicationContext("applicationContext.xml"); ac.getBean(...

    关于SpringBoot获取IOC容器中注入的Bean(推荐)

    这个类实现了`ApplicationContextAware`接口,使用`setApplicationContext`方法来设置`ApplicationContext`对象,然后提供了多个获取Bean对象的方法,例如`getBean(String name)`、`getBean(Class&lt;T&gt; clazz)`等。...

    spring的bean作用域

    自定义作用域需要实现ApplicationContextAware接口来获取ApplicationContext,并通过实现Scope接口来定义作用域的行为。 理解并正确使用Bean的作用域是优化Spring应用程序性能和资源管理的关键。选择合适的作用域...

Global site tag (gtag.js) - Google Analytics