使用@Autowired注解完成属性依赖注入时,写在属性上与写在set方法上的区别

         @Autowired 注解可以对成员变量、构造方法、方法进行标注,来完成自动装配工作;放在成员变量上,也可以放在成员变量的set()方法上,也可以放在任意方法上表示自动执行当前方法,如果方法有参数,会在IOC容器中自动寻找同类型参数为其传值。

         需要明确的是:@Autowired 是根据类型进行自动装配的,如果需要按名称进行装配,则需要配合@Qualifier使用;

         当@Autowired 注解放在成员变量上时,不需要写成员变量的getter、setter方法;如下代码所示:

@Service("repairService")
public class RepairServiceImpl implements RepairServiceI {
	@Autowired
	private MenuDaoI menuDao;
	
	private UserDaoI userDao;
	public UserDaoI getUserDao() {
		return userDao;
	}
	@Autowired
	public void setUserDao(UserDaoI userDao) {
		this.userDao = userDao;
	}

}

       当使用@Autowired 注解时,不写对应getter、setter方法,Spring会通过Java的“反射机制”来实现属性的依赖注入:

       Java允许用户关闭【属性】或者【方法】的【访问权限】;也就是说,本来你的属性或者方法声明了【private】,在访问类中的这个private标识的某个属性时,Java首先会进行一个【安全检查】,确认以下你要访问的这个属性的访问权限是什么,如果是【public】,那么就直接访问;如果是【private】,则不能访问该类中的私有属性。

       按照正常的操作是这样的,但是Java还提供了一个方法,能够让你关闭属性或者方法的【访问控制权限】,比如即使声明了某个属性是private的,但是仍然还是可以通过【类.属性】的方式直接访问这个私有属性。这就是反射框架中:

   

        对此方法的介绍如下,官方文档说明:

          重点是,从官方文档可以看出,我们所有的【构造器】、【属性】、【方法】原来都是 【AccessibleObject 】类的子类!!!那么我们的【属性】能够更改【访问控制权限】,是不是在它的父类【AccessibleObject】中有实现了逻辑呢?官方文档中对 setAccessible(boolean flag) 方法的作用介绍如下:

Set the accessible flag for this object to the indicated boolean value. A value of true indicates that the reflected object should suppress Java language access checking when it is used. A value of false indicates that the reflected object should enforce Java language access checks.

其意思是说,将此对象的【可访问标识】设置为用户指定的值 ( true或者false)。如果该对象的【可访问标识】被设置成了【true】,那么该对象在使用时将不会进行【访问控制权限】的安全性检查;相反,如果被设置成了【false】,则在访问该对象时,应当要求Java强制对其对象的【访问控制权限】进行检查。

       原来Spring会将我们用 @Autowired 注解标识过的属性/成员变量的【访问控制检查】关闭掉,即对每个属性进行了【setAccessible(true)】的设置,导致这些属性即使我们设定了【private】权限,Spring却仍然能够不通过 getter 和 setter 方法来访问这些属性,达到一定的目的。对于开发者来说,就不用写 setter 和getter 方法了。

至此,想起某个项目视频教程中的老师有讲到使用 @Autowired 注解实现依赖注入的以上两种实现方式的区别:当将 @Autowired 注解直接写在成员变量上时,即使设定该成员变量的访问权限为private,那么也会自动将其改变成public;而将 @Autowired 注解写在成员变量的 setter 方法上则不会出现此问题。所以不建议使用前者!!!

  • 8
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
回答: @Autowired 是一个注解,它可以对类成员变量、方法及构造函数进行标注,让 Spring 完成 bean 自动装配的工作。\[1\]使用 @Autowired 注解可以实现依赖注入,即自动将需要的对象注入到目标对象中。默认情况下,@Autowired 是按照类去匹配进行装配的,可以配合 @Qualifier 注解指定按照名称去装配 bean。\[1\]在方法使用 @Autowired 注解,Spring 会自动运行该方法完成相应的注入操作。\[2\]在使用 @Autowired 注解,可以有多种方式,包括成员属性字段使用 @Autowiredset 方法使用 @Autowired、构造方法使用 @Autowired。\[3\]通过使用 @Autowired 注解,可以简化代码,提高开发效率。 #### 引用[.reference_title] - *1* *3* [Spring中@Autowired 注解作用是什么?具体怎么使用?](https://blog.csdn.net/MaNong125/article/details/122628775)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Autowired注解起什么作用呢?](https://blog.csdn.net/qq_25073223/article/details/125726114)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值