springboot项目中通过springcontext获取bean

1. 编写工具类

写的工具类为SpringUtil,实现ApplicationContextAware接口,并加入Component注解,让spring扫描到该bean

package com.demo.util;

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

@Component
public class SpringUtil implements ApplicationContextAware {

    private static ApplicationContext applicationContext;

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

    //获取applicationContext
    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    //通过name获取 Bean.
    public static Object getBean(String name){
        return getApplicationContext().getBean(name);
    }

    //通过class获取Bean.
    public static <T> T getBean(Class<T> clazz){
        return getApplicationContext().getBean(clazz);
    }

    //通过name,以及Clazz返回指定的Bean
    public static <T> T getBean(String name,Class<T> clazz){
        return getApplicationContext().getBean(name, clazz);
    }

}

2. 将工具类注入spring容器

将工具类注入spring环境分为两种情况,一种是和启动类的自动扫描包下,此时程序会自动扫描,不需要特别处理;另一种是工具类不在启动类的自动扫描包下,此时需要额外的处理。

2.1 工具类在启动类的默认扫描包下

启动类代码如下:

package com.demo;

import com.ftsafe.order.OrderApplication;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;


@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {

        SpringApplication.run(DemoApplication.class, args);

    }
}

启动类代码在com.demo包下,工具类代码在com.demo.util包下,在@SpringBootApplication注解的默认扫描包下。

package com.demo.controller;

import com.demo.util.SpringUtil;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/beantest")
public class DemoController {

    @RequestMapping("/test1")
    public Object testSpringUtil1() {
        return SpringUtil.getBean("testDemo");
    }
}

以上代码可以通过工具类,SpringUtil.getBean("testDemo")获取Spring容器中名称为testDemo的bean实例。

2.2 工具类不在启动类的默认扫描包下

工具类不在启动类的默认扫描包下,可以在启动类增加扫描包路径。比如工具类路径在“com.common.util”。

通过@ComponentScan注解添加扫描包。

package com.demo;

import com.ftsafe.order.OrderApplication;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;


@SpringBootApplication
@ComponentScan({"com.demo.util", "com.common.util"})
public class DemoApplication {

    public static void main(String[] args) {

        SpringApplication.run(DemoApplication.class, args);

    }
}

设置扫描路径时,应将工具包路径和默认路径一起配置,避免只扫描工具包路径,没有扫描默认路径导致程序运行异常。

另外一种方式是使用@import

package com.demo;

import com.demo.common.SpringUtil;
import com.ftsafe.order.OrderApplication;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Import;


@SpringBootApplication
@Import(SpringUtil.class)
public class DemoApplication {    

    public static void main(String[] args) {

        SpringApplication.run(DemoApplication.class, args);

    }
}

这里使用@import注解。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值