在controller层,方法使用private修饰,导致注入的service在该方法中无法使用(null)的问题

在controller层,方法使用private修饰,导致注入的service在该方法中无法使用(null)的问题。

  1. 首先明晰该问题的根源所在。

    java中的反射机制,获取不到private方法。

  2. spring boot 中的默认包扫描机制。

    spring boot启动时,会自动扫描引导类所在包及其子包下的所有文件。此时被@RestController注解的controller类,被注入到了spring容器中。

    问题来了,为什么被@RestController注解的类会注入到容器中呢?

    我们都知道实际上@RestController的作用相当于@ResponseBody+@Controller两个注解。我们点进@RestController后,直接进入到@Controller注解中查看。

    @Target({ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Component
    public @interface Controller {
        @AliasFor(
            annotation = Component.class
        )
        String value() default "";
    }
    

    于是我们看到@Component注解。

    标注了@Component的注解,在spring启动时,都会通过反射机制(全类名)来实例化对象到容器中,后续再通过注入来使用。
    又由于反射机制不做特殊处理,获取不到private方法,所以啊,自然就是null值了

    至于spring在启动时,是怎么创建容器的,怎么初始化的对象的,那就说来话长了,反正我也说不太清楚,不说了。

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页