问题一:Spring框架中自动填充注解@Autowired是什么时候装填好对象?
我的思考:刚学Spring框架@Autowired的时候只知道他可以不用Setter注入属性就可以完成属性的自动装填,答案无非就两种:
1.用到该属性的时候装填(X)
2.容器启动的时候就已经装填完毕(✔)
答案:其实当spring容器启动的时候,AutowiredAnnotationBeanPostProcessor 会自动扫描配置文件(beans.xml)所有Bean,一旦有@Autowired注解会与默认的Bean类型匹配,自动注入到对应的地方。
追问:为什么@Autowired可以不需要Getter和Setter方法也可以填充好该对象?
1.一般我们要获取另外一个类的成员变量的时候,如果该变量修饰符是public可以通过实例化该类,然后该类的引用变量 . XXX即可访问,如果修饰符是private不好意思你不能访问。
2.要想访问私有属性还可以通过反射(reflect)的设置访问权限 setAccessible() 方法,详细看下面文档。
原话:AccessibleObject类是Field,Method和Constructor对象的基类。 它提供了将反射对象标记为在使用它时抑制默认Java语言访问控制检查的功能。 当使用Fields,Methods或Constructors来设置或获取字段,调用方法,或创建和初始化新的类实例时,执行访问检查(对于public,默认(包)访问,受保护和私有成员) , 分别。
在反射对象中设置accessible标志允许具有足够权限的复杂应用程序(如Java对象序列化或其他持久性机制)以通常被禁止的方式操纵对象。
默认情况下,反射对象不可访问。
很显然spring的注解@Autowired偷偷给我们设置了setAccessible(true)让属性的访问控制权限给关闭了,最终导致了即使修饰符private也可以不用Getter和Setter获取和设置,从而实现@Autowired的自动装填属性,不需要Getter/Setter方法。
https://blog.youkuaiyun.com/qq_19782019/article/details/85038081