Spring boot 无法注入service问题

目录
  • Spring boot 无法注入service
  • @Autowired注入无法实例化service
    • 问题场景
    • 问题解读
    • 解决方案
    • @PostConstruct 描述

Spring boot 无法注入service

SpringBoot项目的Bean装配默认规则是根据Application类所在的包位置从上往下扫描!

“Application类”是指SpringBoot项目入口类。

这个类的位置很关键:

如果Application类所在的包为:com.boot.app,则只会扫描com.boot.app包及其所有子包,如果service或dao所在包不在com.boot.app及其子包下,则不会被扫描!

即,把Application类放到dao、service所在包的上级,com.boot.Application

知道这一点非常关键,大多数情况下bean无法注入进来都是这个原因引起的。

附上正确目录结构

@Autowired注入无法实例化service

问题场景

springboot整合netty时,netty的处理类无法实例化service

问题解读

经过查阅资料,netty的bean对象默认不交由spring管理

解决方案

@Component//1.添加注解
public class NettyServerHandler extends ChannelInboundHandlerAdapter {
    private static Log log = LogFactory.getLog(NettyServerHandler.class);
    @Autowired
    private RedisUtils redisUtils;
    //2.声明本类
    private static NettyServerHandler nettyServerHandler;
    //3.声明构造方案
    public NettyServerHandler(){}
    //4.添加注解,在项目初始化时执行这个方法
    @PostConstruct
    public void init() {
        nettyServerHandler = this;
        nettyServerHandler.redisUtils = this.redisUtils;
    }
=====================================
经过以上4步骤的处理
for (Map dto : variants){
    String key = dto.get("key").toString();
     nettyServerHandler.redisUtils.hmset(dto.get("key").toString(),
dto, 100000);
 }
//nettyServerHandler.redisUtils.hmset()  通过这种方式调用redisUtils就可以了

@PostConstruct 描述

@PostConstruct

从Java EE5规范开始,Servlet增加了两个影响Servlet生命周期的注解(Annotation):@PostConstruct和@PreConstruct。这两个注解被用来修饰一个非静态的void()方法.而且这个方法不能有抛出异常声明。 @PostContruct是spring框架的注解,在方法上加该注解会在项目启动的时候执行该方法,也可以理解为在spring容器初始化的时候执行该方法。

@PostConstruct在项目中的用处

@PostConstruct注解的方法在项目启动的时候执行这个方法,也可以理解为在spring容器启动的时候执行,可加载项目中常规数据。

spring中Constructor、@Autowired、@PostConstruct的顺序

要将对象b注入到对象a,那么首先就必须得生成对象b与对象a,才能执行注入。所以,如果一个类a中有个成员变量b被@Autowired注解,那么@Autowired注入是发生在a的构造方法执行完之后的。

如果想在生成对象时候完成某些初始化操作,而偏偏这些初始化操作又依赖于依赖注入,那么就无法在构造函数中实现。为此,可以使用@PostConstruct注解一个方法来完成初始化,@PostConstruct注解的方法将会在依赖注入完成后被自动调用。

Constructor >> @Autowired >> @PostConstruct

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

(0)

相关推荐

  • 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 解决拦截器注入Service为空问题

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

  • SpringBoot中的main方法注入service

    一.SpringBoot中的main方法注入service 在springboot中使用main方法常规无法注入service,因为以后也可能会有这种情况,所以采取工具类的方式进行,该工具类为固定写法,直接复制就行 @Component public class SpringContextUtil implements ApplicationContextAware { private static ApplicationContext applicationContext = null; @O

  • 解决springboot报错找不到自动注入的service问题

    springboot报错找不到自动注入的service 找了不少资料,最后发现是每个service接口(虽然已经使用了@service注解)的实现类都需要加上@service注解. 如果是使用junit生成的测试类,发现无法自动注入服务的话 在test启动类前加上 @RunWith(SpringRunner.class) @SpringBootTest @ComponentScan("com.XXX.service") 这是因为test包和启动类不在同一个包或子包下,无法自动注入 Sp

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

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

  • Spring boot 无法注入service问题

    目录 Spring boot 无法注入service @Autowired注入无法实例化service 问题场景 问题解读 解决方案 @PostConstruct 描述 Spring boot 无法注入service SpringBoot项目的Bean装配默认规则是根据Application类所在的包位置从上往下扫描! "Application类"是指SpringBoot项目入口类. 这个类的位置很关键: 如果Application类所在的包为:com.boot.app,则只会扫描co

  • Spring Boot自动注入的原理分析

    前言 我们经常会被问到这么一个问题:SpringBoot相对于spring有哪些优势呢?其中有一条答案就是SpringBoot自动注入.那么自动注入的原理是什么呢? 我们进行如下分析. 1:首先我们分析项目的启动类时,发现都会加上@SpringBootApplication这个注解,我们分析这个继续进入这个注解会发现,它是由多个注解组成的,如下 @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @I

  • Spring Boot循环依赖的症状和解决方案

    目录 什么是循环依赖? 问题及症状 ComponentA ComponentB 错误 解决方法 构造器注入的案例 延迟注入的案例 接口隔离的案例 什么是循环依赖? 循环依赖是指在Spring Boot 应用程序中,两个或多个类之间存在彼此依赖的情况,形成一个循环依赖链.在这种情况下,当一个类在初始化时需要另一个类的实例,而另一个类又需要第一个类的实例时,就会出现循环依赖问题.这会导致应用程序无法正确地初始化和运行,因为Spring Boot 无法处理这种循环依赖关系. 问题及症状 在2.6.0之

  • 解决Spring Boot 多模块注入访问不到jar包中的Bean问题

    情景描述 一个聚合项目spring-security-tutorial,其中包括4个module,pom如下所示: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://mav

  • Spring Boot产生环形注入的解决方案

    目录 Spring Boot产生环形注入 错误产生原因 解决方法 Spring Boot循环注入的坑 一般循环注入的原因是 解决办法 Spring Boot产生环形注入 *************************** APPLICATION FAILED TO START *************************** Description: The dependencies of some of the beans in the application context for

  • spring boot项目application.properties文件存放及使用介绍

    一.方法一多环境配置文件 我们一般都会有多个应用环境,开发环境.测试环境.生产环境,各个环境的配置会略有不同,我可以根据这个创建多份配置文件,由主配置文件来控制读取那个子配置 创建spring boot项目后可以同时创建多个.properties文件,只要符合它要求的格式即可 格式:application-{profile}.properties:{profile}是变量用于自定义配置文件名称 分别创建三个应用环境的配置和一个主配置 1.application.properties 主配置(以下

  • Spring boot将配置属性注入到bean类中

    一.@ConfigurationProperties注解的使用 看配置文件,我的是yaml格式的配置: // file application.yml my: servers: - dev.bar.com - foo.bar.com - jiaobuchong.com 下面我要将上面的配置属性注入到一个Java Bean类中,看码: import org.springframework.boot.context.properties.ConfigurationProperties; import

  • Spring Boot(三)之找回熟悉的Controller,Service

    找回熟悉的Controller,Service Controller哪儿去了? 对于很多习惯了Spring开发的同学来讲,Controller,Service,DAO 这些套路突然间都没了会有不适感.其实呢,这些东西还在,只不过对于较简单的情景下,这些都变成了系统背后帮你做的事情.这一小节我们就先来看看如何将Controller再召唤回来.召唤回来的好处有哪些呢?首先我们可以自定义API URL的路径,其次可以对参数和返回的json结构做一定的处理. 如果要让 TodoController 可以

  • Spring Boot中单例类实现对象的注入方式

    Spring Boot 单例类实现对象的注入 1.最近接手了一个项目 项目用的是SpringBoot,但其中有个类用的是单例,为了不改变单例,且还需要引入Spring管理的Bean对象 2.对于一个单例类按照平时的注解方式添加 启动时会报空指针异常,因为static类对象是创建对象后,内存中还没有注入Bean信息,且无法初始化Bean实例,这里的解决办法是利用@PostConstruct来对单例类中对象的注入 @Component public class MesssageHandle impl

  • spring boot 注入 property的三种方式(推荐)

    以前使用spring的使用要注入property要配置PropertyPlaceholder的bean对象.在springboot除  了这种方式以外还可以通过制定 配置ConfigurationProperties直接把property文件的 属性映射到 当前类里面. @ConfigurationProperties(prefix = "mypro", merge = true, locations = { "classpath:my.properties" })

随机推荐