springboot实现在工具类(util)中调用注入service层方法

一、新建BeanUtil类

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import java.util.ArrayList;
import java.util.List;

@Slf4j
public class BeanUtil implements ApplicationContextAware, DisposableBean {
    private static ApplicationContext applicationContext = null;

    /**
     * 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型.
     */
    public static <T> T getBean(Class<T> requiredType) {
        if(applicationContext==null){
            throw new IllegalStateException("applicaitonContext属性未注入, 请在SpringBoot启动类中注册BeanUtil.");
        }
        return applicationContext.getBean(requiredType);
    }

    @Override
    public void destroy() {
        applicationContext = null;
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        if (BeanUtil.applicationContext != null) {
            log.warn("BeanUtil中的ApplicationContext被覆盖, 原有ApplicationContext为:" + BeanUtil.applicationContext);
        }
        BeanUtil.applicationContext = applicationContext;
    }
}

二、在启动类中注入BeanUtil

@SpringBootApplication
public class StartApplication {

    public static void main(String[] args) {
        SpringApplication.run(StartApplication.class, args);
    }

    @Bean
    public BeanUtil beanUtil() {
        return new BeanUtil();
    }
}

三、在Util类中获取Service

public class MyUtils {

    public static UserDetails getCurrentUser() {
        MyUserDetailsService userDetailsService = BeanUtil.getBean(MyUserDetailsService.class);
        //TODO 调用service中的方法处理自己的业务
        return null;
    }
}

springBoot中普通类直接调用spring管理的dao.service等bean

在项目中经常会用到一些不是controller和service层的去访问dao层,或者是普通类访问service层。

前提:

首先确保dao,serivce全部可以在项目启动的时候扫描到

编写一个工具类,通过工具类去获取ApplicationContext对象,然后通过applicationContext对象去加载spring管理的bean

将该工具类在项目启动类进行引入,否则会报空指针异常。

具体使用方法如下:

1)编写工具

package com.bonc.springboot.utils;
/*
 * @desc:提供非SPRING管理类调用管理类的功能
 * 注意在服务启动的时候进行import,apllication中引入
 */
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
public class SpringUtil implements ApplicationContextAware {
       private static ApplicationContext applicationContext = null;
       @Override

       public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {

              if(SpringUtil.applicationContext == null){
                     SpringUtil.applicationContext  = applicationContext;
              }
              System.out.println("---------------------------------------------------------------------");
              System.out.println("========ApplicationContext配置成功,在普通类可以通过调用SpringUtils.getAppContext()获取applicationContext对象,applicationContext="+SpringUtil.applicationContext+"========");
              System.out.println("---------------------------------------------------------------------");
       }

       //获取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)将该工具类,在服务启动类application 中导入

3)普通类中使用APPlicationContent对象获取对应的bean进行使用:

ApplicationContext appCtx = SpringUtil.getApplicationContext();
public  TestDao dao = appCtx.getBean(TestDao.class);

也可写成

public  TestDao dao = SpringUtil.getBean(TestDao.class);

具体测试如下:

例:比如有一个请求中调用了实体类,实体类的构造方法调用的dao,进行的数据库的访问

请求:

//普通类进行构造的时候,可以调用dao 对象
@RequestMapping(value="/testClassQuery")
public  void  testClassQuery(){
  TestClassQuery testClassQuery =new TestClassQuery();
}

普通类代码:

**
 * @Description: 测试普通类如何调用mapper
 */

public  class TestClassQuery {
    ApplicationContext appCtx = SpringUtil.getApplicationContext();
    public  TestDao dao = appCtx.getBean(TestDao.class);

    private  User user;

    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }

    public  TestClassQuery(){
        testQuery();
    }

    public  void testQuery(){
        user = dao.queryUser("1"); //通过id获取值
        System.out.println(user.toString());
    }
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Spring boot工具类静态属性注入及多环境配置详解

    由于需要访问MongoDB,但是本地开发环境不能直接连接MongoDB,需要通过SecureCRT使用127.0.0.2本地IP代理.但是程序部署到线上生产环境后,是可以直接访问MongoDB的,因此开发好程序后,总是要修改一下MongoDB服务器的IP才能提交代码,这样很是不方便. private static final String PUBCHAT_HOST = "127.0.0.2"; // private static final String PUBCHAT_HOST =

  • Springboot实现多线程注入bean的工具类操作

    场景: 使用springboot多线程,线程类无法自动注入需要的bean 解决方法: 通过工具类获取需要的bean 工具类代码: import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springfram

  • 详解SpringBoot 解决拦截器注入Service为空问题

    一.自定义拦截器实现 HandlerInterceptor 接口 /** * * Created by zhh on 2018/04/20. */ public class MyInterceptor implements HandlerInterceptor { @Autowired private NetworkProxyInfoService networkProxyInfoService; @Override public void afterCompletion(HttpServlet

  • springboot实现在工具类(util)中调用注入service层方法

    一.新建BeanUtil类 import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeansException; import org.springframework.beans.factory.DisposableBean; import org.springframework.context.ApplicationContext; import org.springframework.context.Applic

  • Android封装高德地图定位工具类Util的详细步骤

    目录 前提 第一步.去官网创建高德Key 第二步  通过Gradle集成SDK(方便): 第三步    配置参数 第四步   获取定位数据 总结 前提 每次做的项目中或者维护公司之前旧项目的时候,都会用到通过定位来获取经纬度,我们都知道,Android官方也提供了获取经纬度的方法,但是不太好使,所以就用了高德地图的API,不能每次用的时候都要写一堆代码,效率挺低的,于是就想着,封装成一个工具类,方便调用,为以后的项目,不管是管理方面还是查找方面都简洁了不少. 第一步.去官网创建高德Key 官网地

  • SpringBoot整合Kafka工具类的详细代码

    目录 kafka是什么? 应用场景 kafka是什么? Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写.Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据. 这种动作(网页浏览,搜索和其他用户的行动)是在现代网络上的许多社会功能的一个关键因素. 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决. 对于像Hadoop一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案.Kafka的

  • SpringBoot 内置工具类的使用

    目录 断言 对象.数组.集合 ObjectUtils StringUtils CollectionUtils 文件.资源.IO 流 FileCopyUtils ResourceUtils StreamUtils 反射.AOP ReflectionUtils AopUtils AopContext 断言 断言是一个逻辑判断,用于检查不应该发生的情况 Assert 关键字在 JDK1.4 中引入,可通过 JVM 参数-enableassertions开启 SpringBoot 中提供了 Assert

  • JSP 开发之servlet中调用注入spring管理的dao

    JSP 开发之servlet中调用注入spring管理的dao 我们用spring的依赖注入可以将dao注入到action中,然后我们就可以直接调用了dao中的方法了,可是servlet不是由spring容器管理,所以在servlet中不能注入dao类,也就不能用dao中的方法. 下面是实现方法: private UserDao userDao; public void init() throws ServletException { super.init(); ServletContext s

  • ThinkPHP的模版中调用session数据的方法

    ThinkPHP框架的模板中调用session数据的方法有很多,可以很据情况灵活运用,常见的有以下几类: 1.在模板中直接调用{$Think.session}获取session: 2.在<php></php>标签直接编写php代码来调用$_SESSION数据: 3.在模板中写<?php  ?>,然后在里面直接编写php代码来调用$_SESSION: 4.在Action中将$_SESSION变量通过assign()方法赋值给模板: 5.在自定义函数库中,新建一个函数用来返

  • Go语言中调用外部命令的方法总结

    目录 引子 运行命令 显示输出 显示到标准输出 输出到文件 发送到网络 保存到内存对象中 输出到多个目的地 运行命令,获取输出 分别获取标准输出和标准错误 标准输入 环境变量 检查命令是否存在 封装 总结 引子 在工作中,我时不时地会需要在Go中调用外部命令.前段时间我做了一个工具,在钉钉群中添加了一个机器人,@这个机器人可以让它执行一些写好的脚本程序完成指定的任务.机器人倒是不难,照着钉钉开发者文档添加好机器人,然后@这个机器人就会向一个你指定的服务器发送一个POST请求,请求中会附带文本消息

  • C#中调用MySQL存储过程的方法

    本文实例讲述了C#中调用MySQL存储过程的方法.分享给大家供大家参考.具体如下: 这段代码演示在 C# 程序中调用 MySQL 的存储过程,没有返回值,没有参数传递. MySqlConnection myConnection; myConnection = new MySqlConnection(); myConnection.ConnectionString = "database="+database+";server="+ server+";use

  • asp.net中调用oracle存储过程的方法

    存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它. 存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程. 不多说了,本文通过两种方法介绍asp.net中调用oracle存储过程的方法,具体内容请看下面代码. 调用oracle存储过程方法一: ORACLE代码 CREATE OR REP

  • 去除element-ui中Dialog对话框遮罩层方法详解

    目录 前言 modal 属性 示例代码: 前言 本文主要介绍了如何去除 element-ui 中 Dialog 对话框遮罩层的方法,并给出了示例代码以及页面效果作为参考. modal 属性 在使用element-ui的Dialog时,默认会有遮罩层,想要去除遮罩层,官方文档给出了 modal 属性: modal 是一个布尔值,表示是否需要遮罩层: 然而,将 modal 赋值为 false 时并不生效: 这里官方文档也给出了提示: 当 modal 的值为 false 时,请一定要确保 append

随机推荐