详见这里。文中最开始的private和public写反了。而且有些地方感觉也写反了。
起这个标题主要是为了方便搜索匹配关键词。以下是我的理解。
1. 对于属性
以controller举例,使用@Autowired等注解导入的service,用private还是public都没有区别,可以不写(写上去也不起作用)。
2. 对于方法
2.1 一般情况
对于基本使用,controller里面的方法,使用private和public也没有区别。
2.2 特殊情况
如果使用了aop,对public方法也无影响,但是private修饰的方法,调用不到切面的操作,并且导入的service等对象为null(只影响private方法,通过debug可以观察到调用其他的public方法时这些service对象并不是null)。
2.3 原因
jdk代理或者cglib代理,生成的代理对象都是不包含private方法的,因此调用private方法时是调用真实对象的方法:
- 调用真实对象不会进入切面,即不会执行切面定义的一些预处理和后处理操作;
- 真实对象不进入spring容器管理,所以导入的service都是null(我的理解,存疑)。 调用public或者protected方法会调用代理对象对应的方法。代理对象是spring管理的bean,里面注入service等其他bean。