Springboot未注入的类使用Spring容器的实体类,实体类又需要插入yml的数据,实体类属于Spring容器。

Springboot中Bean的注入
我们都知道,Springboot可以使用方法级别注解(@Bean)和类级别注解(@Controller、@Component、@Service等)加包扫描的方式注入Beans。实现交给Spring容器管理。这样我们就能很方便的实现,在Controller中注注入Service,在Service中注入Mapper。比较常用的就是Service的注入(@Autowired)与使用,我们会经常利用封装好的Service层调用dao层的接口进行业务逻辑应用的处理。比如Controller中注入Service来根据不同情况调用Service中的方法来完成功能实现。

自己new的无法注入
但是这其中有一个问题,就是当我们需要自己手动new对象的时候,这个对象对应的类是无法交给Spring管理的。这种情况通常发生在一些需要自己处理的参数,比如监听器类。我是使用阿里云EasyExcel对表格内容进行操作时碰到的。可以看到下图中参数列表中除了流的要求外还要有一个ReadListener的监听器。
 

大概场景就是需要把表格里的数据读取出来并且进行相应的数据库操作。这时候我们这个监听器对象Listener就会需要使用到Service层的方法区操作。按照平常,我们只需要在这个Listener类中@Autowired注入Service然后直接用就好了。但是这个Listener又无法交给Spring管理。如果我们注入就会发现会报错(应该是空指针异常),无法注入。因为@Autowired注入时是将类交给Springboot管理,而new出来的实例脱离了Springboot的管理,两个东西不在一个管理者管理下,所以没法联系在一起,@Autowired注入就会为null,就会出现空指针的情况。
 

解决办法1️⃣
既然我们在参数中new了一个Listener,那么其实我们在new的时候就可以把Service通过参数的方式传递进去,我们就可以使用了。具体实现:首先我们得在自己的Listener中添加有参构造和无参构造(参数其实就是Service) 我们其实可以从上层调用方法的时候就一步一步的把注入的Service一步步传递过来。在我们new Listener的时候,就把Service作为参数传递进这个Listener监听器类中,那我们就可以在这个监听器中随心所欲的使用Service完成我们想要的操作了。
 

进阶办法

New出来的数据实体类是取不到Springboot的yml参数值的

@Component
@Data
public class GptConfig {
    @Value("${gpt.token}")
    private String token;
}

yml的token参数 

gpt:
  token: Bearer sk-pG6eVk8Zju6TnkoM018hT3BlbkF

new创建实例无法加载yml的参数token为空 

GptConfig gptConfig1 = new GptConfig();
        String token = gptConfig.getToken();//token为空

 注入的方法可以加载yml参数

@Autowired
        private GptConfig gptConfig2;
        String token1 = gptConfig2.getToken();//token:Bearer sk-pG6eVk8Zju6TnkoM018hT

但是某些类不想交给Spring管理,也就是没有加@Component

 

 这样就无法使用Spring的注解注入实体类

 所以需要用另一个方法,也就是借助Spring上下文的联系,通过getBean方法获取,boot中的实例对象。

 

 GptConfig gptConfig = (GptConfig) com.example.utils.SpringBeanUtil.getBean("gptConfig");
            String token3 = gptConfig.getToken();//token:Bearer sk-pG6eVk8Zju6TnkoM018hT

注意注意 

com.example.utils.SpringBeanUtil.getBean("gptConfig");

getBean()里面的类名默认小写开头!!!,不然会报找不到这个bean名称

这样就能实现需求。

SpringBeanUtil工具包如下
package com.example.utils;


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


@Component
public class SpringBeanUtil implements ApplicationContextAware {
    /**
     * 上下文对象实例
     */
    private static ApplicationContext applicationContext;
    @Override
    public void setApplicationContext(ApplicationContext applicationContext_) throws BeansException {
        applicationContext = applicationContext_;
    }
    /**
     * 获取applicationContext
     * @return
     */
    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }
    /**
     * 通过name获取 Bean.
     * @param name
     * @return
     */
    public static Object getBean(String name){
        return getApplicationContext().getBean(name);
    }
    /**
     * 通过class获取Bean.
     * @param clazz
     * @param <T>
     * @return
     */
    public static <T> T getBean(Class<T> clazz){
        return getApplicationContext().getBean(clazz);
    }
    /**
     * 通过name,以及Clazz返回指定的Bean
     * @param name
     * @param clazz
     * @param <T>
     * @return
     */
    public static <T> T getBean(String name,Class<T> clazz){
        return getApplicationContext().getBean(name, clazz);
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以回答您的问题。 首先,您需要在项目中添加 MongoDB 的依赖,可以在 Maven 中添加以下依赖: ```xml <!-- MongoDB 驱动 --> <dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-java-driver</artifactId> <version>3.12.7</version> </dependency> <!-- Spring Data MongoDB --> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-mongodb</artifactId> <version>2.2.7.RELEASE</version> </dependency> ``` 接下来,在 Spring Boot 的配置文件中添加 MongoDB 的连接配置,如下所示: ```yml spring: data: mongodb: host: localhost port: 27017 database: test ``` 然后,您可以通过以下方式查询数据: ```java public class MongoUtils { private static final Logger logger = LoggerFactory.getLogger(MongoUtils.class); private static MongoTemplate mongoTemplate; /** * 初始化 MongoDB 连接 * * @param mongoClientURI MongoDB 连接地址 */ public static void init(String mongoClientURI) { MongoClientURI uri = new MongoClientURI(mongoClientURI); MongoClient mongoClient = new MongoClient(uri); mongoTemplate = new MongoTemplate(mongoClient, uri.getDatabase()); logger.info("MongoDB 连接成功"); } /** * 查询数据 * * @param collectionName 集合名称 * @param query 查询条件 * @return 查询结果 */ public static List<Document> find(String collectionName, Document query) { Query q = new BasicQuery(query); return mongoTemplate.find(q, Document.class, collectionName); } } ``` 以上代码中的 `mongoClientURI` 是 MongoDB 的连接地址,您可以将其配置在 Spring Boot 的配置文件中,然后在初始化 MongoDB 连接时使用。`find` 方法可以根据集合名称和查询条件查询数据,并返回查询结果。 希望能对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值