樓主一直習慣使用public,偶爾手誤也可能使用private,但是發覺也沒啥區別,都能調用service層,注入bean。
后來做一個新項目時,發覺自己以前的寫的部分功能報錯,當時有點懵逼,,找了半天都沒發現哪里寫錯了,代碼啥的都確定無錯(這種時候最蛋疼,因為報錯不太准確),以前寫好的啥都沒改,突然報錯,經過蛋疼的排除,發現service層的注入都是null,但是還是一臉懵逼,我一直以為無區別,感覺自己的代碼無錯,經過長時間找尋(我感覺自己快要崩潰了),然后發現自己另一個類有相似的方法,就用的實體類不要樣當然還有一個用public一個用private,經過測試才發現用public的方法,調用controller里面注入類才能注入。但是為什么會這樣呢?為什么以前好好的,突然不可以了呢?
原因分析:
容器掃描bean生成代理類的時候,public和protected方法可以被正常代理,而private方法的不會被代理,屬性的注入也是在代理類中完成,所以public/protected方法獲取的注入屬性是完成注入的屬性,private方法獲取的是未完成注入時的屬性,所以是null。
原來是我們老大在項目加AOP,加了AOP以后會有影響,如果controller層方法需要調用注入的bean或者service層,那么只能使用public。