SpringBoot实现其他普通类调用Spring管理的Service,dao等bean

目录
  • 普通类调用Spring管理的Service、dao等bean
    • 举个使用情景
    • 下面来看我给出的解决办法
  • 普通类中使用service、dao层中的类,只需三步
    • 1、写一个工具类 SpringUtil
    • 2、在Application启动类中将工具类导入
    • 3、在ApplicationTests测试类中调用

普通类调用Spring管理的Service、dao等bean

在springboot的使用中,有时需要在其他的普通类中调用托管给spring的dao或者service,从而去操作数据库。网上大多数的资料都是说添加一些注解什么的,但是这都是不行的。

举个使用情景

比如在服务器在于硬件或者客户端之间进行Socket通讯时,那么如果说服务器收到了一条消息,需要去操作数据库的话,怎么去调用Service或者dao去操作数据库呢?

下面来看我给出的解决办法

(1)首先需要新建一个类,实现 ApplicationContextAware 接口。

@Component
public class SpringUtils implements ApplicationContextAware {
    private static ApplicationContext applicationContext = null;
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        if(SpringUtils.applicationContext == null){
            SpringUtils.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)在通讯类中获取ApplicationContext对象,然后去获取需要的service 或者 dao。

然后就可以直接调用了。

普通类中使用service、dao层中的类,只需三步

在一个web项目的jsp中想要使用service中的一个类来获取数据库中的数据,但是用完之后报错说是空指针异常,上网查了之后总结了一下解决办法,只需三步。

1、写一个工具类 SpringUtil

package com.shop.util;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
public final class SpringUtil implements ApplicationContextAware {
	private static ApplicationContext applicationContext = null;
	@Override
	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
		// TODO Auto-generated method stub
		if (SpringUtil.applicationContext == null) {
			SpringUtil.applicationContext = applicationContext;
			System.out.println(
					"========ApplicationContext配置成功,在普通类可以通过调用ToolSpring.getAppContext()获取applicationContext对象,applicationContext="
							+ applicationContext + "========");
		}
	}

	public static ApplicationContext getApplicationContext() {
		return applicationContext;
	}

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

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

2、在Application启动类中将工具类导入

不然依然无法使用

3、在ApplicationTests测试类中调用

package com.shop.JZShop;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import com.shop.serviceImpl.GoodsServiceImpl;
import com.shop.util.SpringUtil;
@RunWith(SpringRunner.class)
@SpringBootTest
public class JzShopApplicationTests {

	@Test
	public void contextLoads() {
		//GoodsServiceImpl为我想要获取的service层中的类
		GoodsServiceImpl goodsServiceImpl = (GoodsServiceImpl)SpringUtil.getBean(GoodsServiceImpl.class);
		System.out.println(goodsServiceImpl.getGoodsByID(27).getGoodsName());
	}
}

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

(0)

相关推荐

  • SpringBoot如何在普通类加载Spring容器

    前言 在我们的工作中,经常会遇到需要在普通类中使用放在Spring容器中的类的情况.最常见的情况大概就是有一个类他的属性的是通过spring的配置文件读取的.这样这个类必然要交给Spring容器进行管理.这个时候如果我们在普通类中直接new这个类是不可以拿到的.属性值不会加载成功.下面介绍一个方法. 实现 封装一个beanutil 我们获取spring容器中的类,都从这个工具类里面来获取. import org.springframework.context.ConfigurableApplic

  • SpringBoot在自定义类中调用service层等Spring其他层操作

    背景: 做了一个TCP服务器来接入智能设备,然后需要将设备实时发送的定位等关键信息存储到数据库. 为了考虑将来可能对外提供rest接口,采用将TCP服务器集成到SpringBoot框架,当然,也是为了能最快利用mybatis框架实现数据访问,然后依次解决了如何启动,如何注销等各种问题,然后在TCP服务器消息处理时,需要写数据库,直接调用DAO层,编译报错. 改为调用Service层,编译正常,运行到调用的地方,报空指针异常,跟踪到异常位置,发现service为空,也就是按照之前controlle

  • 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

  • 如何实现springboot中controller之间的相互调用

    springboot controller之间相互调用 SpringBoot之间内部调用 @Autowired private RestTemplate restTemplate ;//自动装配restTemplate -------------------返回json字符串类型---------------------------------- @RequestMapping("/selectHospatal") @ResponseBody public String selectH

  • SpringBoot普通类获取spring容器中bean的操作

    前言 在spring框架中,是无法在普通类中通过注解注入实例的,因为sping框架在启动的时候,就会将标明交给spring容器管理的类进行实例化,并梳理他们彼此的依赖关系,进行注入,没有交给spring容器管理的普通类,是不会进行注入的,即使你使用了注入的相关注解.这个时候,如果我们需要在普通类中获取spring容器中的实例,就需要一些特定的方法,这里将整理一下如何在springboot中实现这样的方法. 创建springboot工程demo 项目结构图示 项目结构说明 service包下为de

  • SpringBoot实现其他普通类调用Spring管理的Service,dao等bean

    目录 普通类调用Spring管理的Service.dao等bean 举个使用情景 下面来看我给出的解决办法 普通类中使用service.dao层中的类,只需三步 1.写一个工具类 SpringUtil 2.在Application启动类中将工具类导入 3.在ApplicationTests测试类中调用 普通类调用Spring管理的Service.dao等bean 在springboot的使用中,有时需要在其他的普通类中调用托管给spring的dao或者service,从而去操作数据库.网上大多数

  • SpringBoot 普通类调用Bean对象的一种方式推荐

    目录 SpringBoot 普通类调用Bean对象 SpringBoot 中bean的使用 SpringBoot 普通类调用Bean对象 有时我们有一些特殊的需要,可能要在一个不被Spring管理的普通类中去调用Spring管理的bean对象的一些方法,比如一般SpringMVC工程在controller中通过 @Autowired private TestService testService; 注入TestService 接口就可以调用此接口实现类的实现的方法. 但在一般类中显然不可以这么做

  • 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

  • Spring Boot集成Quartz注入Spring管理的类的方法

    在Spring Boot中使用Quartz时,在JOB中一般需要引用Spring管理的Bean,通过定义Job Factory实现自动注入. Spring有自己的Schedule定时任务,在Spring boot中使用的时候,不能动态管理JOB,于是就使用Quartz来实现. 在Spring Boot中配置Quartz: import java.io.IOException; import java.util.Properties; import org.springframework.bean

  • 从零开始学springboot整合feign跨服务调用的方法

    介绍 微服务横行的互联网世界, 跨服务调用显得很平凡, 我们除了采用传统的http方式接口调用, 有没有更为优雅方便的方法呢? 答案是肯定的,feign就提供了轻便的方式! 如果你的服务都注册了注册中心,比如nacos, 那么调用会显得很轻松, 只需一个注解, 带上需要调用的服务名即可,**feign + nacos**会帮你做剩余的事. 如果没有注册中心, 也无需担心, feign一样可以以传统的 ip:port 方式进行调用~ 下面,我们来实践下吧 springboot整合feign 引入依

  • 如何获取所有spring管理的bean

    目录 获取所有spring管理的bean IOC容器 使用ListableBeanFactory接口 使用Spring Boot Actuator 小结一下 spring管理bean的原理 使用spring时,获取spring注入的bean是这样 那下面我们模拟spring管理bean这个的过程 小结一下 获取所有spring管理的bean 本文我们探索使用不同的方式获取spring容器中所有bean. IOC容器 bean是基于spring应用的基础,所有bean都驻留在ioc容器中,由容器负

  • SpringBoot实现定时任务和异步调用

    本文实例为大家分享了SpringBoot实现定时任务和异步调用的具体代码,供大家参考,具体内容如下 环境: jdk1.8:spring boot2.0.2:Maven3.3 摘要说明: 定时任务:定时任务是业务场景中经常出现的一种情况如:定时发送邮件,短信.定时统计监控数据.定时对账等 异步调用:一个都买流程可能包括下单.发货通知.短信推送.消息推送等,其实除了下单这个主要程序是主程序,其他子程序可以同时进行且不影响主程序的运行,这个时候就可以使用异步调用来调用这些子程序: 步骤: 1.定时任务

  • Spring与Struts整合之让Spring管理控制器操作示例

    本文实例讲述了Spring与Struts整合之让Spring管理控制器操作.分享给大家供大家参考,具体如下: 一 Web配置 <?xml version="1.0" encoding="GBK"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

随机推荐