Controller中的请求方法,private和publi
背景
最近,在公司CodeReview会上,我给众多同事布置了家庭作业。Controller中的请求方法,通常我们都是public的,如果是private的、protected的行不行,为什么?
后来一个同事比较认真,第二天早上测试后发现报错了,给我反馈说private方法的内部注入的service为null,修改成public后就不会为null。为什么会产生这个问题呢?这个同事没有回答出来,今天我抽空调试了一下源码,给大家总结一下,分享给大家!首先简单模拟一下环境publicinterfaceTestService{StringgetTestString();}Service(testService)publicclassTestServiceImplimplementsTestService{OverridepublicStringgetTestString(){return业余草;}}RestControllerpublicclassMainController{AutowiredprivateTestServiceservice;RequestMapping(testA)publicStringtestA(){returnservice。getTestString();}RequestMapping(testB)privateStringtestB(){returnservice。getTestString();}}
testA是pulibc,testB是pirvate,测试结果均能返回业余草字符串
测试和公司环境还有一个不太同的就是公司项目中有Aop切面处理访问日志的,还要添加一个Aop。AspectComponentpublicclassWebLogAspect{privatefinalLoggerloggerLoggerFactory。getLogger(WebLogAspect。class);Pointcut(execution(publiccom。spring。controller。。。(。。)))publicvoidcontrollerLog(){}Before(controllerLog())publicvoidlogBeforeController(JoinPointjoinPoint){RequestAttributesrequestAttributesRequestContextHolder。getRequestAttributes();HttpServletRequestrequest((ServletRequestAttributes)requestAttributes)。getRequest();logger。info(URL:request。getRequestURL()。toString());logger。info(HTTPMETHOD:request。getMethod());logger。info(IP:request。getRemoteAddr());}}
添加了一个Aop后测试:testA返回业余草字符串testB访问报错,service注入失败,为null
为什么使用Aop会导致private修饰的方法注入失败,查询了许多资料,网上有人说到org。springframework。aop。support。AopUtils中的代码使用的是Method〔〕methodsclazz。getMethods(),即是只能拿到public方法。但是我使用的版本2。1。4。RELEASE中已经使用Method〔〕methodsReflectionUtils。getAllDeclaredMethods(clazz);这就有点迷惑了。
会不会是切点注解中的修饰符匹配不到呢?将切点中的修饰符从public修改成private。Pointcut(execution(privatecom。spring。controller。。。(。。)))publicvoidcontrollerLog(){}
测试结果:testA返回业余草字符串testB访问报错,service注入失败,为null
还是不行(就挺秃然的)。
哎,想偷懒还不行,只能我一行一行调试代码了。目前结论方法中没有用Autowired或者Resource注入的对象。有无Aop,任意修饰符都可以正常访问并且返回结果方法中使用了Autowired或者Resource注入的对象
没有Aop切面的情况下,public,protected,private都能正常的映射
在有Aop切面的情况下,public,protected可以正常映射,但是使用private会报空指针异常,注入对象为null。
最后经过我的一番折腾与调试之后,发现:
使用了aop,也就是使用动态代理,你的SpringBoot版本为2。1。4release,底层默认调用的是cglib作为动态代理。
其本质是:调用某个类的方法时,实际上是先为该类生成一个子类,然后再在子类中通过反射等,达到方法拦截的目的。对于子类,其父类中,private修饰的方法,子类如果与父类不在同一包下,是没有访问的权限的,此场景下,cglib生成的子类,不会和父类在同一包下,也就是private修饰的方法,不能进行动态代理,所以会报空指针异常。
V观财报东北证券被立案!未勤勉尽责,涉人造钻石大王45亿定增项目中新经纬2月6日电6日晚间,东北证券发布公告称,当日收到中国证监会立案告知书(证监立案字0392023014号),因公司在执行豫金刚石2016年非公开发行股票项目中,涉嫌保荐持续督
新疆巴州有机奶背后的竞争密码2月3日,新疆瑞源乳业有限公司(以下简称瑞源乳业)子公司新疆凯瑞可食品科技有限公司生产车间内,隔着厚厚的钢化玻璃,中控室几位工作人员目不转睛地盯着屏幕上的数据仔细查看。一条生产线正
潍坊滨海央子街道聚焦责严实准抓牢党务工作者工作大众网海报新闻记者刘建永通讯员王静李海桤潍坊报道为聚焦新时代党建工作新形势新任务,进一步提高基层党务工作者履职能力,提升党支部标准化规范化水平,2月1日下午,街道组织召开党务工作者
老街书楼文学里念故乡我记事时候的安徽六安洪集老街,基本上是一个遗址了。但是,老家的长辈言之凿凿地说,洪集原来是一个大商埠,传说中的娥眉州呢。几十年后回忆洪集老街,确实能看到往昔繁荣的蛛丝马
百姓看联播动漫堵住隐形变异培训的后门元宵节已过,学校即将开学。为了减轻孩子们过重的校外培训负担,咱们省刚出台了进一步规范学科类隐形变异培训的实施方案,要在明年6月底前全面清除隐形变异培训。我们知道,为了给中小学生松绑
投200家获得20多次面试,小伙跨专业求职这番折腾很值得视频加载中现代快报讯半年前,内蒙古大学的应届毕业生张驰还没有想过,自己会来到千里之外的江苏南通开启一段新的人生旅程。毕业后,他没有从事自己就读的土木工程专业,而是选择了更感兴趣的软
蓝天救援队在土耳其地震重灾区开展救援中安在线中安新闻客户端讯2月9日,全国多地蓝天救援队队员平安抵达土耳其伊斯坦布尔,预计15天的地震救援工作正式展开。安徽新媒体集团记者程昊作为救援队员一同出征,负责无人机搜索任务。
公交司机帮学生付车费,收到暖心纸条下次带吃的给您现代快报讯(记者李子璇)近日,淮安一名中学生坐错公交后没有额外钱回家,公交司机替她付了车费还暖心安慰。车到站后,学生将一张小纸条塞到了司机的手中,字迹工整地写着叔叔,麻烦您了,下次
今年科技流行语将会是什么?法国回声报网站1月5日一篇报道预测了2023年技术与媒体行业的年度词汇。报道说,2023年,技术和媒体界将谈论什么?2022年,业内人士常常把非同质化代币(NFT)相关市场技术行业
热评丨抢人大赛年年有,今年为何尤其快刚开年,不少地方就拿出百米冲刺的拼劲儿,抢人大赛轰轰烈烈展开。现场招聘活动密集举办,不少企业还主动前往劳动力输出地逆向招工,专车专列包机成为各地吸引务工人员复工返岗的标配。其中,人
蜀汉后期为什么说蜀中无大将,廖化作先锋?我是读史评观,专注于历史研究。点击上方关注,了解更多历史知识,作者每天发布一篇历史文章。蜀汉政权早期,文有诸葛亮庞统法正马良等人,武有关羽张飞黄忠赵云诸将,可谓人才济济。然而到了蜀