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

背景:

做了一个TCP服务器来接入智能设备,然后需要将设备实时发送的定位等关键信息存储到数据库。

为了考虑将来可能对外提供rest接口,采用将TCP服务器集成到SpringBoot框架,当然,也是为了能最快利用mybatis框架实现数据访问,然后依次解决了如何启动,如何注销等各种问题,然后在TCP服务器消息处理时,需要写数据库,直接调用DAO层,编译报错。

改为调用Service层,编译正常,运行到调用的地方,报空指针异常,跟踪到异常位置,发现service为空,也就是按照之前controller层通过@Autowired注入service层失效。

解决方案:

1.上代码

@Component
public class ServerHandler extends IoHandlerAdapter {
    @Autowired
    protected HealthDataService healthDataService;
    private static ServerHandler  serverHandler ;
    @PostConstruct //通过@PostConstruct实现初始化bean之前进行的操作
    public void init() {
        serverHandler = this;
        serverHandler.healthDataService = this.healthDataService;
        // 初使化时将已静态化的testService实例化
    }
    //测试调用
    public void test(){
        serverHandler .healthDataService.<你的service层方法>;
    }

2.说明:

将需要调用Spring的Service层的类通过@Component注解为组件加载;

同样通过@Autowired获取Service层的Bean对象;

为类声明一个静态变量,方便下一步存储bean对象;

划重点:通过注解@PostConstruct ,在初始化的时候初始化静态对象和它的静态成员变量healthDataService,原理是拿到service层bean对象,静态存储下来,防止被释放。

那些趟过的坑:

刚开始调用的时候,总觉得很简单,以前springmvc写个配置,将对象标注为bean就可以随意调用Spring IOC容器的beans了,但是这是SpringBoot,估计还是有区别,一次试验了百度出来的前三页帮助,基本没有成功的。包括:

1)将工具类申明为spring组件,如@controller @compent 等,在spring自动扫描包设置中将工具类所在的包加进来; 无效

2)new一个service; 无效;

springboot多个service互相调用的事务处理

想在一个service的方法A中,调用另一个service的方法B,方法A和方法B均存在数据库插入操作,并且@Transaction注解也都加了,但是当B方法中抛出异常时,A中的插入语句还是能够执行成功。

注解配置如下:

@Transactional(isolation= Isolation.DEFAULT,propagation= Propagation.REQUIRED)

百思不得其解,再查找了相关资料后,问题还是出在@Transaction注解的配置上,需要配置异常回滚。

@Transactional(isolation= Isolation.DEFAULT,propagation= Propagation.REQUIRED,rollbackFor = Exception.class)

这样,当B方法中抛出异常时,A中的操作也会进行回滚,事务就会起到控制作用。

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

(0)

相关推荐

  • 在SpringBoot下读取自定义properties配置文件的方法

    SpringBoot工程默认读取application.properties配置文件.如果需要自定义properties文件,如何读取呢? 一.在resource中新建.properties文件 在resource目录下新建一个config文件夹,然后新建一个.properties文件放在该文件夹下.如图remote.properties所示 二.编写配置文件 remote.uploadFilesUrl=/resource/files/ remote.uploadPicUrl=/resource

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

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

  • springBoot service层事务控制的操作

    springBoot使用事物比较简单,在Application启动类s上添加@EnableTransactionManagement注解,然后在service层的方法上添加@Transactional注解 @Transactional属性 属性 类型 描述 value String 可选的限定描述符,指定使用的事务管理器 propagation enum: Propagation 可选的事务传播行为设置 isolation enum: Isolation 可选的事务隔离级别设置 readOnly

  • Spring Boot jpa Service层代码实例

    这篇文章主要介绍了Spring Boot jpa Service层代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 package com.fei.service.impl; import java.util.ArrayList; import java.util.List; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criter

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

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

  • java实现在普通类中注入service或mapper

    普通类中注入service或mapper 1.类加@Component注解 2.注入需要引入的service @Autowired private UserService userService; 3.建静态文件 private static UserService users; 4.初始化方法 @PostConstruct public void init() { users= userService; } 5.调用 users.selectUser(user); mapper为null的情况

  • Android在自定义类中实现自定义监听器方式

    监听器可以说是Android开发中最常用的东西之一.我们通过监听器可以监听对象的各种变化事件,并进行一些需要的处理,相当有用,而且使用起来也很简单.其实,监听器就相当于C++中的回调函数,达到条件就回调执行. 很多时候,我们在自定义控件类中也需要实现一些属性变化的监听器,实现跟原生控件监听器一样的功能.以下分几个步骤说明自定义监听器实现和使用(以自定义类MyClass加载完成监听器为例): 一.自定义监听器的实现: 1. 定义一个加载完成监听接口 //加载监听接口 public static i

  • IOS中自定义类中限制使用原生实例化方法

    IOS中自定义类中限制使用原生实例化方法 在自定义的类中,除了有系统自带的实例化方法外,还可能会有开发者自定义的实例化方法.当不想使用系统自定义方法时,而仅使用自定义的实例化方法时,可以这样做下限制. 如下示例所示: #import <UIKit/UIKit.h> @interface MYView : UIView // 限制使用系统方法进行实例化 // 方法1 - (instancetype)init UNAVAILABLE_ATTRIBUTE; // 方法2 - (instancetyp

  • 在docker容器中调用和执行宿主机的docker操作

    首先这个帖子,献给docker新手.当然如果你是一个老手,文中分割线后的操作方法也是一种思路. 首先说一下,如何在docker中执行宿主机的docker操作,我们管它叫docker in docker. 至于为什么要在docker中操作宿主机的docker,优点不言而喻,你既可以将你的具体需求容器化部署,又不用直接在宿主机上安装(假设我们没有办法在docker中操作宿主机的docker,那么我们只能将这样的软件程序直接安装到宿主机上,这样显然是不利于管理和维护的). 实现这种需求,其实非常简单,

  • SpringBoot如何在线程中获取@Service Bean类

    目录 如何在线程中获取@ServiceBean类 我们现在开始解决问题 多线程中获取bean对象 创建类 多线程中的调用方式 如何在线程中获取@Service Bean类 这个适用于没有Spring配置文件的Springboot项目中,有配置文件的话取bean就方便多了. 下图是我用@Service注解声明的一个Mybatis Mapper Bean,平常在Springboot扫描配置下的类直接用 @Autowired注解依赖注入. 我现在需要在线程中使用,然而Springboot自然而然只能扫

  • 使用springboot在工具类中读取配置文件(ClassPathResource)

    springboot工具类中读取配置文件 1.创建配置文件(application.properties) spring.activemq.broker-url=tcp://localhost:61616 spring.activemq.user=admin spring.activemq.password=admin spring.activemq.in-memory=true spring.activemq.pool.enabled=false 2.创建工具类(PropertiesUtil.

  • 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中如何通过main方法调用service或dao

    目录 如何通过main方法调用service或dao 创建类,并复制下面代码 再创建TestApp方法 在普通类中获取service或者dao 手动创建工具类 调用配置类 如何通过main方法调用service或dao 大多数情况下,我们使用springboot是创建一个web项目,然后通过接口访问,但是也有特殊情况,比如线上跑着的web项目,有一些特殊的数据,需要经过计算导入到数据库,这个时候,我们可能需要原来的web项目中的一些service,dao才辅助操作,但是又不能在服务端新开接口.我

  • SpringBoot集成shiro,MyRealm中无法@Autowired注入Service的问题

    网上说了很多诸如是Spring加载顺序,shiroFilter在Spring自动装配bean之前的问题,其实也有可能忽略如下低级错误. 在ShiroConfiguration中要使用@Bean在ApplicationContext注入MyRealm,不能直接new对象. 道理和Controller中调用Service一样,都要是SpringBean,不能自己new. 错误方式: @Bean(name = "securityManager") public SecurityManager

随机推荐