Controller中的请求方法,private和public有什么区别?

 

往期热门文章:

1、再见Jenkins!一款更适合国人的自动化部署工具,贼带劲!!
2、MySQL中这14个小玩意,让人眼前一亮!!!
3、Spring 官方证实!大漏洞,JDK 9 及以上均受影响
4、阿里家属快当不下去了
5、C++ 首超 Java!地位不保?

本文来源:业余草

背景

最近,在公司 CodeReview 会上,我给众多同事布置了“家庭作业”。Controller 中的请求方法,通常我们都是 public 的,如果是 private 的、protected 的行不行,为什么?

2eb5fbe450747ec7ca431bcb703586f5.jpeg

后来一个同事比较认真,第二天早上测试后发现报错了,给我反馈说 private 方法的内部注入的 service 为 null,修改成 public 后就不会为 null。为什么会产生这个问题呢?这个同事没有回答出来,今天我抽空调试了一下源码,给大家总结一下,分享给大家!

首先简单模拟一下环境

public interface TestService {String getTestString();
}@Service("testService")
public class TestServiceImpl implements TestService {@Overridepublic String getTestString() {return "业余草";}
}@RestController
public class MainController {@Autowiredprivate TestService service;@RequestMapping("/testA")public String testA(){return service.getTestString();}@RequestMapping("/testB")private String testB(){return service.getTestString();}}

/testA是 pulibc,/testB是 pirvate,测试结果「均能返回"业余草"字符串」

测试和公司环境还有一个不太同的就是公司项目中有 Aop 切面处理访问日志的,还要添加一个 Aop。

@Aspect
@Component
public class WebLogAspect {private final Logger logger = LoggerFactory.getLogger(WebLogAspect.class);@Pointcut("execution(public * com.spring.controller..*.*(..))")public void controllerLog(){}@Before("controllerLog()")public void logBeforeController(JoinPoint joinPoint) {RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();HttpServletRequest request = ((ServletRequestAttributes)requestAttributes).getRequest();logger.info("*************URL : " + request.getRequestURL().toString());logger.info("*************HTTP_METHOD : " + request.getMethod());logger.info("*************IP : " + request.getRemoteAddr());}    
}

添加了一个 Aop 后测试:

/testA返回"业余草"字符串  
/testB访问报错,service注入失败,为null

为什么使用 Aop 会导致 private 修饰的方法注入失败,查询了许多资料,网上有人说到 org.springframework.aop.support.AopUtils中的代码使用的是Method[] methods = clazz.getMethods(),即是只能拿到 public 方法。但是我使用的版本2.1.4.RELEASE中已经使用Method[] methods = ReflectionUtils.getAllDeclaredMethods(clazz);这就有点迷惑了。

会不会是切点注解中的修饰符匹配不到呢?将切点中的修饰符从 public 修改成 private。

@Pointcut("execution(private* com.spring.controller..*.*(..))")public void controllerLog(){}

测试结果:

/testA返回"业余草"字符串  
/testB访问报错,service注入失败,为null

还是不行(就挺秃然的)。

哎,想偷懒还不行,只能我一行一行调试代码了。

目前结论

  1. 方法中没有用@Autowired或者@Resource注入的对象。有无 Aop,任意修饰符都可以正常访问并且返回结果

  2. 方法中使用了@Autowired或者@Resource注入的对象
    没有 Aop 切面的情况下,publicprotectedprivate都能正常的映射
    在有 Aop 切面的情况下,publicprotected可以正常映射,但是使用private会报空指针异常,注入对象为 null。

最后经过我的一番折腾与调试之后,发现:

使用了 aop,也就是使用动态代理,你的 SpringBoot 版本为 2.1.4 release,底层默认调用的是 cglib 作为动态代理。

其本质是:调用某个类的方法时,实际上是先为该类生成一个子类,然后再在子类中通过反射等,达到方法拦截的目的。对于子类,其父类中,private修饰的方法,子类如果与父类不在同一包下,是没有访问的权限的,此场景下,cglib 生成的子类,不会和父类在同一包下,也就是private修饰的方法,不能进行动态代理,所以会报空指针异常。

往期热门文章:
1、IntelliJ IDEA终于支持对Redis 的可视化窗口操作了,真香!
2、ChatGPT能接入微信了!
3、Java 反射慢?它到底慢在哪?
4、当我去了不到 20 人的 IT 公司后。。。
5、GitHub 被超火的 ChatGPT 霸榜!
6、Java使用 try catch会影响性能?
7、Java使用 try catch会影响性能?
8、原来count(*)是接口性能差的真凶!
9、大公司病了,这也太形象了吧!!!
10、全球最大资源站创始人被抓,但网站还会继续活下去

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/63030.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

妙用Java 8中的 Function接口,消灭if...else(非常新颖的写法)

往期热门文章: 1、Controller中的请求方法,private和public有什么区别? 2、再见Jenkins!一款更适合国人的自动化部署工具,贼带劲!! 3、MySQL中这14个小玩意,让人眼前一亮&#xff01…

SpringBoot + MDC 实现全链路调用日志跟踪

往期热门文章: 1、去TM的领导:发烧请病假,不意味着在家睡大觉 2、5年半老程序员被System.out.println() 考懵逼了... 3、妙用Java 8中的 Function接口,消灭if...else(非常新颖的写法) 4、Controller中的请求…

chatgpt赋能python:Python安装Kivy:强大的跨平台应用程序框架

Python安装Kivy: 强大的跨平台应用程序框架 Kivy是一个基于Python的跨平台开源应用程序框架,它可以用于开发多点触摸应用程序,使开发者能够轻松地创建适用于Windows,Mac,Linux,Android和iOS等平台的应用程序。Python作…

chatgpt赋能python:Python与界面绘制

Python与界面绘制 在现代计算机应用程序中,良好的用户界面设计和交互是至关重要的。它可以建立用户对应用程序的信任和舒适感,从而使应用程序更加实用和易于使用。而Python作为一种非常流行的编程语言,也提供了一些强大的工具和库&#xff0…

chatgpt赋能python:Python手机运行:轻巧便捷的编程语言

Python 手机运行:轻巧便捷的编程语言 Python作为一门高效,简单,易学的编程语言,逐渐成为程序员和数据科学家们的首选语言。无论是数据处理,机器学习还是人工智能,Python都具有出色的表现。不仅如此&#x…

chatgpt赋能python:Python调用ADBShell命令:使你的Android开发更高效

Python调用ADB Shell命令:使你的Android开发更高效 如果你是一名Android开发者,你一定会知道ADB(Android Debug Bridge),它是一个可调试Android设备的多用途命令行工具。在许多情况下,ADB是许多Android开发…

Android 百度图像识别(详细步骤+源码)

百度图像识别 运行效果图一、创建平台应用二、创建Android项目三、网络访问框架四、添加请求API接口五、获取鉴权认证Token六、网络图片Url识别七、相册图片识别八、拍照图片识别九、源码 运行效果图 如果你对这个效果图不满意就不用往下看了,那样只会浪费你的时间。…

微信小程序,图像识别源码

目录 前言百度端配置信息小程序中代码:结语智能识图小程序源码下载路径:https://pan.baidu.com/s/1OGE7vhogS7L7nn0JIFPVWw 提取码:8ze9 前言 基于近期的工作内容关系,在查询一些资料的同时,在微信小程序端集成了图像…

图像识别小程序(含源码)【推荐】

目录 前言百度端配置信息小程序中代码:结语智能识图小程序源码下载路径:https://pan.baidu.com/s/1OGE7vhogS7L7nn0JIFPVWw 提取码:8ze9 前言 基于近期的工作内容关系,在查询一些资料的同时,在微信小程序端集成了图像…

(数学实验)Matlab实现猜数小游戏(增加了错误输入的判断)

刚开始做的时候不知道matlab没有自减运算,在网上查了很久资料,都没发现有对猜数游戏加错误输入判断的,经过多次试错,我弄出来了有判断的程序,在这里分享一下。 文章目录 前言一、问题描述二、解题思路 1.for循环2.whil…

使用Python为二年级的学生批量生成数学题

文章目录 一.使用Python为二年级的学生批量生成数学题1.1 背景 二.解决思路及其代码三.排版及其打印四.本文源码 一.使用Python为二年级的学生批量生成数学题 1.1 背景 我妹妹今年上二年级,她的老师今天给他们布置了一项作业: 从今天起到开学&#xff…

Fdog系列(一):思来想去,不如写一个聊天软件,那就从仿QQ注册页面开始吧。

文章目录 一.前言1. 基础布局2. 自动切换图片3. 添加内容4. 自动缩放,控件的显示和隐藏5.响应用户输入操作 所有文章源码已整体打包上传至github,求星星! 一.前言 两年的大学生活马上就要结束了,马上面临实习,突然心…

基于Python的网络拓扑图绘制

最近写论文画了许多图,在这里记录一些。当然,如果仅仅是展示性图片的话也可以使用visio,但是这里我仍然想探究一下如何使用pyhon画出美观的网络拓扑图。 一、画出网络拓扑图 给出邻接矩阵,画出网络的拓扑图: import…

认识网络、几种常用的网络拓扑图

交换协议: VLAN技术:虚拟局域网 STP技术:生成树协议 VRRP技术:虚拟路由冗余协议 VPN:虚拟专用网络 名词解释 路由协议:http、HTTPS、tcp、ip 静态路由配置 OSPF协议 RIP协议 ACL访问控制 什么是网络&…

快速读懂网络拓扑图

快速读懂网络拓扑图 几重常见的网络拓扑总线型拓扑简介优点缺点 环型拓扑简介优点缺点 星型拓扑简介优点缺点 网络层级机构节点结点链路通路 不同的连接线代表什么意思?不同颜色、粗细的直线代表什么意思?闪电线-串行链路 几重常见的网络拓扑 总线型拓扑…

盘点5款常用的网络拓扑图制作工具

网络拓扑能直观明了的展示网络中各网元之间的关系,极大方便运维人员对网络进行优化配置、故障排查等操作。那么这个专业性比较强的拓扑图,要用什么工具把它轻松,简便的画出来呢?现对市场5款主流的拓扑制作软件进行介绍&#xff1a…

网络拓扑图怎么画 详细教程

大数据时代,如何更好地去运营、呈现数据,并从其中发掘出更多信息成为了人们探索的方向。网络拓扑图就是一种非常有用的信息化图表,这种网状关系呈现出来的利器可以使我们把想要传递的信息更加清晰、有逻辑的呈现在别人的眼前。 1. 什么是网络…

网络拓扑图

转载自:https://blog.csdn.net/weixin_40792878/article/details/82555594 什么是拓扑结构?   首先我们来解释一下拓扑的含义,所谓“拓扑”就是把实体抽象成与其大小、形状无关的“点”,而把连接实体的线路抽象成“线”,进而…

【新手】网络拓扑图要这样画

网络拓扑设计分为单核心和双核心两种 1. 单核心网络拓扑设计(如图) (上图写的是路由器连接外网,也可以连接公司别的分支机构,比如现在是上海分公司,也可以用路由器和北京分公司相连,当然要借助…

关于网络拓扑图,你想知道的都在这

这篇文章,我将集中回答以下这四个问题: 网络拓扑图的定义网络拓扑图的分类网络拓扑图的设计规范网络拓扑图的绘制步骤 一、网络拓扑图的定义 在认识网络拓扑图前,我们先来了解下网络拓扑结构。 所谓网络拓扑结构,是指用传输媒…