SpringBoot2-获取Spring 容器中的Bean

版权声明:转载请注明出处! https://blog.csdn.net/zongf0504/article/details/85321436

Spring 会在项目启动时, 对项目进行扫描, 对使用了@service, @Component, @Repository 等注解的类,创建相应的实例bean, 然后将bean 添加到Spring的上下文中. 对于获取Spring容器中的bean, 通常有自动注入和主动获取两种方式. 自动注入是使用最广泛的一种方式, 但是对于有些特殊的应用场景,如工具类中使用bean, 那就需要使用第二种方式了.

1. 自动注入

使用自动注入需要注意以下三点:第一, 类需要使用@Service/@Component 修饰; 第二, 类中需要新增一非静态属性, 且次属性需要使用@Resource/@Autowired 来修饰.

@Service
public class UserService implements IUserService{
 
    @Resource
    private UserDao userDao;   
}

2. 主动获取

主动获取需要自定义实现ApplicationContextAware的工具类, 用户获取Spring的上下文对象. 通过Spring的上下文, 不仅可以获取Spring容器中的bean, 还可以获取应用的环境配置等信息.

2.1 Spring上下文工具类

package org.zongf.learn.sboot.quartz.util;

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

/**
 * @Description: Spring 上下文工具, 可用于获取spring 容器中的Bean
 * @author: zongf
 * @date: 2018-12-26 10:34
 */
@Component
public class SpringContextUtil implements ApplicationContextAware {

    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        SpringContextUtil.applicationContext = applicationContext;
    }

    /**
     * @Description: 获取spring容器中的bean,通过bean名称获取
     * @param beanName bean名称
     * @return: Object 返回Object,需要做强制类型转换
     * @author: zongf
     * @time: 2018-12-26 10:45:07
     */
    public static Object getBean(String beanName){
        return applicationContext.getBean(beanName);
    }

    /**
     * @Description: 获取spring容器中的bean, 通过bean类型获取
     * @param beanClass bean 类型
     * @return: T 返回指定类型的bean实例
     * @author: zongf
     * @time: 2018-12-26 10:46:31
     */
    public static <T> T getBean(Class<T> beanClass) {
        return applicationContext.getBean(beanClass);
    }

    /**
     * @Description: 获取spring容器中的bean, 通过bean名称和bean类型精确获取
     * @param beanName bean 名称
     * @param beanClass bean 类型
     * @return: T 返回指定类型的bean实例
     * @author: zongf
     * @time: 2018-12-26 10:47:45
     */
    public static <T> T getBean(String beanName, Class<T> beanClass){
        return applicationContext.getBean(beanName,beanClass);
    }
}

2.2 使用方式

public void method(){
    UserDao userDao = SpringContextUtil.getBean(UserDao.class);
    ...
}

猜你喜欢

转载自blog.csdn.net/zongf0504/article/details/85321436