Java面试Spring的失败集(一)

问题一: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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农阿福

看明白的同学,别忘请阿福喝奶茶

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值