AppContextAware.getBean(XX.class);
package com.jmu.infrastructure.utils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; /** * 类说明:用于注入Spring上下文ApplicationContext,以在应用程序中提供更为方便的控制. * 注意,只能该对象被配置到Spring中时才有效,需要在Spring的配置文件中进行配置, * * <pre> * 范例:<bean class="com.jmu.infrastructure.utils.AppContextAware" /> * </pre> * */ public class AppContextAware implements ApplicationContextAware { /** * logger */ private static Logger logger = LoggerFactory.getLogger(AppContextAware.class); /** * 系统中的context对象 */ private static ApplicationContext context = null; /** * * 获取Spring上下文ApplicationContext对象 * * @return ApplicationContext对象 * */ public static ApplicationContext getContext() { if (context == null) { logger.error("当前context为空,可能是Spring配置文件中没有配置加载本类[{}]!", AppContextAware.class.getName()); throw new IllegalStateException("当前没有Spring的applicationContext注入,请确定是否有配置Spring,并在Spring中配置了本类的注入!" + AppContextAware.class); } return context; } /** * 取指定类型的Bean,如果不存在或存在多于1个,则抛出异常IllegalStateException. * * @param <E> * E * @param type * type * @return 指定类型的Bean */ @SuppressWarnings("unchecked") public static <E> E getBeanByType(Class<? extends E> type) { try { String[] beanNames = getContext().getBeanNamesForType(type); if (beanNames != null && beanNames.length == 1) { return (E) getContext().getBean(beanNames[0]); } if (beanNames == null || beanNames.length == 0) { throw new IllegalStateException("未找到指定类型的Bean定义."); } throw new IllegalStateException("找到多个同类型的Bean定义."); } catch (Exception e) { logger.error("根据类型在Spring上下文查找对象出错:" + type, e); throw new IllegalStateException("根据类型在Spring上下文查找对象出错:" + type, e); } } /** * * 从Spring Context中获取指定的Bean * * @param <E> * E * @param beanName * bean的名称 * @return bean对象 * */ @SuppressWarnings("unchecked") // 从Spring中取对象并转换是免不了有这错误的,所以忽略 public static <E> E getBean(String beanName) { try { return (E) getContext().getBean(beanName); } catch (Exception e) { // logger.error("在Spring上下文查找对象出错:" + beanName, th); throw new IllegalStateException("在Spring上下文查找对象出错:" + beanName); } } /** * 从Spring Context中获取指定的Bean * * @param <E> * E * @param clazz * clazz * @return 指定的Bean * */ public static <E> E getBean(Class<E> clazz) { return getBeanByType(clazz); // return getBean(clazz.getName()); } /** * * 是否有指定的Bean存在. * * @param beanName * beanName * @return 是否有指定的Bean存在. * */ public static boolean containBean(String beanName) { return getContext().containsBean(beanName); } /** * * 用于在被Spring加载时,由Spring注入ApplicationContext对象 * * @param context * 被注入的context对象 * @throws BeansException */ public void setApplicationContext(ApplicationContext context) throws BeansException { logger.debug("准备注入SpringContext[{}]", context.toString()); if (AppContextAware.context != null) { logger.warn("注意,已经注入过Spring上下文[{}],请检查配置是否有问题导致重复注入!", AppContextAware.context.toString()); // throw new // IllegalStateException("已经注册过Spring上下文,请检查配置是否有问题导致重复注入!"); } AppContextAware.context = context; } }
相关推荐
java *spring工具类 方便在非spring管理环境中获取beanjava *spring工具类 方便在非spring管理环境中获取beanjava *spring工具类 方便在非spring管理环境中获取beanjava *spring工具类 方便在非spring管理环境中获取...
这里我们将详细探讨如何在Java中通过Spring获取配置的bean。 1. **BeanFactory与ApplicationContext** - **BeanFactory** 是Spring中最基础的IoC容器,负责管理和实例化Bean。它允许开发者定义Bean的生命周期和...
java spring工具类 方便在非spring管理环境中获取beanjava spring工具类 方便在非spring管理环境中获取beanjava spring工具类 方便在非spring管理环境中获取beanjava spring工具类 方便在非spring管理环境中获取bean...
这样,我们就能在普通类中获取到Spring管理的bean实例。 2. **@Autowired**:如果普通类也是Spring的一部分,即它也被Spring管理,那么可以使用注解`@Autowired`来自动装配bean。这样,Spring会自动找到类型匹配的...
总的来说,获取非Spring管理组件中的SpringBean主要有两种方式:一是通过实现`ApplicationContextAware`接口并存储ApplicationContext,二是使用注解和静态内部类来注入BeanFactory。这两种方法都是Spring框架提供的...
当需要在线程中获取Spring注解的bean时,有几种常见的方法: 1. **ThreadLocal**:Spring提供了一种名为`ThreadLocalTargetSource`的特殊`TargetSource`实现,可以将bean实例绑定到当前线程。这样,每个线程都有其...
`<bean>`元素用于告诉Spring容器一个类及其配置方式。它包含了以下关键属性: - **class属性**:表示JavaBean的全限定类名。例如,`com.example.MyClass`。这是Spring创建Bean实例的基础。 - **id属性**:是Bean...
在Java编程中,Spring框架是应用广泛的企业级开发工具,它提供了一种强大的依赖注入机制,使得开发者可以方便地管理并获取容器中的Bean。本文将详细介绍在Spring框架中获取配置Bean的三种主要方法。 1. **通过...
本文将深入探讨如何在Java中获取Spring容器中的Bean,并通过具体的示例来讲解这一过程。 ### Spring框架概述 Spring框架是由Rod Johnson创建的一个开源项目,旨在简化Java企业级应用程序的开发。Spring的核心特性...
3. **Java配置类**:Spring 3.0引入了Java配置,允许我们使用Java类来配置Bean。 ```java @Configuration public class AppConfig { @Bean public MyBean myBean() { return new MyBean(); } } ``` 这里的`@Bean...
Spring框架是Java企业级应用开发的事实标准,它通过依赖注入(DI)和面向切面编程(AOP)来...需要注意的是,无论是哪种方式,理解Spring Bean管理的原理和生命周期,对于开发高质量的Java企业级应用都是必不可少的。
要从一个非Spring管理的类中获取Bean,我们需要先创建或获取`ApplicationContext`实例。有多种方式可以做到这一点,例如: 1. 通过`ClassPathXmlApplicationContext`或`FileSystemXmlApplicationContext`加载XML...
在Spring Boot框架中,普通类调用bean是常见的操作,特别是在构建复杂应用时。这篇博客“17. Spring Boot普通类调用bean【从零开始学Spring Boot】”旨在指导初学者如何在非Spring管理的类中访问和使用Spring容器中...
在Spring应用中,我们经常需要在Java类中获取由Spring管理的bean,以便进行依赖注入或者调用其方法。本文将详细介绍5种在Java类中获取Spring bean的方法。 1. **通过ApplicationContext初始化** 这是最基础的方式...
Spring框架为我们提供了多种获取Bean的方法,这些方法可以帮助开发者在不同场景下灵活地使用Bean。本篇将详细介绍Spring Boot中获取Bean的几种常见方式。 首先,让我们理解什么是Spring Bean。在Spring框架中,Bean...
Bean在Spring中是核心组件,它代表了应用程序中的对象,可以通过配置文件、注解或者Java配置类进行定义。Bean的生命周期包括初始化、使用和销毁等阶段,Spring容器负责管理这些过程。Bean可以依赖注入其他Bean,使得...
从Spring 3.0开始,推荐使用Java配置类中的@Bean注解来指定初始化方法。 4. 销毁(Destruction) 销毁阶段发生在Spring容器关闭或Bean不再需要时。销毁之前会调用实现了DisposableBean接口的destroy方法或通过XML...
在Spring框架中,动态注册Bean是一项非常实用的功能,它允许我们在应用运行时向Spring容器添加新的Bean定义。这种能力在很多场景下都是极其有用的,比如根据不同的环境配置加载不同的服务实现,或者在运行时根据某些...
获取 Spring 里注册的 Bean 对象可以使用四种方法:继承 BaseDispatchAction、实现 BeanFactoryAware、使用 ApplicationContext、使用 @Autowired。每种方法都有其特点和应用场景,开发者可以根据实际情况选择合适的...
Spring提供了多种注解,如`@Component`、`@Service`、`@Repository`和`@Controller`,它们可以用来标记Bean类,自动注册到Spring容器。同时,使用`@Autowired`注解可以完成依赖注入。 ```java @Service public ...