`

Java类获取Spring的bean

 
阅读更多

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管理环境中获取bean

    java *spring工具类 方便在非spring管理环境中获取beanjava *spring工具类 方便在非spring管理环境中获取beanjava *spring工具类 方便在非spring管理环境中获取beanjava *spring工具类 方便在非spring管理环境中获取...

    Java中Spring获取bean方法小结

    这里我们将详细探讨如何在Java中通过Spring获取配置的bean。 1. **BeanFactory与ApplicationContext** - **BeanFactory** 是Spring中最基础的IoC容器,负责管理和实例化Bean。它允许开发者定义Bean的生命周期和...

    java spring工具类 方便在非spring管理环境中获取bean

    java spring工具类 方便在非spring管理环境中获取beanjava spring工具类 方便在非spring管理环境中获取beanjava spring工具类 方便在非spring管理环境中获取beanjava spring工具类 方便在非spring管理环境中获取bean...

    普通类调用Spring bean对象

    这样,我们就能在普通类中获取到Spring管理的bean实例。 2. **@Autowired**:如果普通类也是Spring的一部分,即它也被Spring管理,那么可以使用注解`@Autowired`来自动装配bean。这样,Spring会自动找到类型匹配的...

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

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

    线程中获取spring 注解bean

    当需要在线程中获取Spring注解的bean时,有几种常见的方法: 1. **ThreadLocal**:Spring提供了一种名为`ThreadLocalTargetSource`的特殊`TargetSource`实现,可以将bean实例绑定到当前线程。这样,每个线程都有其...

    spring bean 属性总结

    `&lt;bean&gt;`元素用于告诉Spring容器一个类及其配置方式。它包含了以下关键属性: - **class属性**:表示JavaBean的全限定类名。例如,`com.example.MyClass`。这是Spring创建Bean实例的基础。 - **id属性**:是Bean...

    Java获取Spring中配置的Bean的三种方式

    在Java编程中,Spring框架是应用广泛的企业级开发工具,它提供了一种强大的依赖注入机制,使得开发者可以方便地管理并获取容器中的Bean。本文将详细介绍在Spring框架中获取配置Bean的三种主要方法。 1. **通过...

    java中获得spring中的BEAN

    本文将深入探讨如何在Java中获取Spring容器中的Bean,并通过具体的示例来讲解这一过程。 ### Spring框架概述 Spring框架是由Rod Johnson创建的一个开源项目,旨在简化Java企业级应用程序的开发。Spring的核心特性...

    spring中的bean

    3. **Java配置类**:Spring 3.0引入了Java配置,允许我们使用Java类来配置Bean。 ```java @Configuration public class AppConfig { @Bean public MyBean myBean() { return new MyBean(); } } ``` 这里的`@Bean...

    Spring bean 管理

    Spring框架是Java企业级应用开发的事实标准,它通过依赖注入(DI)和面向切面编程(AOP)来...需要注意的是,无论是哪种方式,理解Spring Bean管理的原理和生命周期,对于开发高质量的Java企业级应用都是必不可少的。

    在非spring注解类中使用spring容器中的bean_普通类中使用yml配置文件中的配置信息

    要从一个非Spring管理的类中获取Bean,我们需要先创建或获取`ApplicationContext`实例。有多种方式可以做到这一点,例如: 1. 通过`ClassPathXmlApplicationContext`或`FileSystemXmlApplicationContext`加载XML...

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

    在Spring Boot框架中,普通类调用bean是常见的操作,特别是在构建复杂应用时。这篇博客“17. Spring Boot普通类调用bean【从零开始学Spring Boot】”旨在指导初学者如何在非Spring管理的类中访问和使用Spring容器中...

    Java类获取Spring中bean的5种方式

    在Spring应用中,我们经常需要在Java类中获取由Spring管理的bean,以便进行依赖注入或者调用其方法。本文将详细介绍5种在Java类中获取Spring bean的方法。 1. **通过ApplicationContext初始化** 这是最基础的方式...

    SpringBoot 获取spring bean方式.rar

    Spring框架为我们提供了多种获取Bean的方法,这些方法可以帮助开发者在不同场景下灵活地使用Bean。本篇将详细介绍Spring Boot中获取Bean的几种常见方式。 首先,让我们理解什么是Spring Bean。在Spring框架中,Bean...

    深入解析Java的Spring框架中的混合事务与bean的区分

    Bean在Spring中是核心组件,它代表了应用程序中的对象,可以通过配置文件、注解或者Java配置类进行定义。Bean的生命周期包括初始化、使用和销毁等阶段,Spring容器负责管理这些过程。Bean可以依赖注入其他Bean,使得...

    Spring Bean生命周期.pdf

    从Spring 3.0开始,推荐使用Java配置类中的@Bean注解来指定初始化方法。 4. 销毁(Destruction) 销毁阶段发生在Spring容器关闭或Bean不再需要时。销毁之前会调用实现了DisposableBean接口的destroy方法或通过XML...

    spring运行过程中动态注册bean

    在Spring框架中,动态注册Bean是一项非常实用的功能,它允许我们在应用运行时向Spring容器添加新的Bean定义。这种能力在很多场景下都是极其有用的,比如根据不同的环境配置加载不同的服务实现,或者在运行时根据某些...

    获得spring里注册Bean的四种方法

    获取 Spring 里注册的 Bean 对象可以使用四种方法:继承 BaseDispatchAction、实现 BeanFactoryAware、使用 ApplicationContext、使用 @Autowired。每种方法都有其特点和应用场景,开发者可以根据实际情况选择合适的...

    spring创建bean简单示例

    Spring提供了多种注解,如`@Component`、`@Service`、`@Repository`和`@Controller`,它们可以用来标记Bean类,自动注册到Spring容器。同时,使用`@Autowired`注解可以完成依赖注入。 ```java @Service public ...

Global site tag (gtag.js) - Google Analytics