目录

浅析计算广告

技术人生 X 人生技术

X

通过Spring上下文获取指定名称的Bean

通过 Spring 上下文获取指定名称的 Bean

在进行 Spring 或者 SpringBoot 项目开发的时候,往往有很多情况我们需要在工具类或者其他
非 Spring 注解的类中用到某个注解类(Service),这个时候就比较麻烦了,因为当前类不是
通过 Spring 注解来的,也就是类名上面没有配置注解,如果现在要用到其他注解类就不行了。
很多人第一反应就是 new 一个需要的注解类,但是这样是不行的,运行的时候会报空指针异常
所以这里就需要先获取 Spring 的上下文了,通过 Spring 的上下文,然后在上下文中就可以拿到
指定名称的注解类了。。。示例如下

 1package com.coocaa.salad.node.interceptor;
 2
 3import org.springframework.beans.BeansException;
 4import org.springframework.context.ApplicationContext;
 5import org.springframework.context.ApplicationContextAware;
 6import org.springframework.stereotype.Component;
 7
 8/**
 9 * <br>
10 * <b>功能:</b>设置Spring的上下文<br>
11 * <b>作者:</b>silence<br>
12 * <b>日期:</b>2016-11-16 23:49<br>
13 * <b>详细说明:</b>获取Spring上下文中指定名称的Bean<br>
14 */
15@Component
16public class ApplicationContextProvider implements ApplicationContextAware {
17
18    private static ApplicationContext context;
19
20    private ApplicationContextProvider() {
21    }
22
23    @Override
24    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
25        context = applicationContext;
26    }
27
28    public static Object getBean(String name, Class clazz) {
29        return context.getBean(name, clazz);
30    }
31}
32

用法如下:

1private AdScheduleService scheduleService = (AdScheduleService) ApplicationContextProvider.getBean("adScheduleService", AdScheduleService.class);

其中 AdScheduleService 就是一个注解类,在进行强转一下就可以了,getBean()方法的第一个参数是注解类的名称,默认是注解类名称的第一个字母小写,可以自己在注入的时候指定,第二个参数就是该注解类