@Resource 或者 @Autowire
一、应用放在字段上则注入规则是:
1.先使用字段名字匹配到Bean,查找到bean则注入,如果类型不匹配则此时有异常,注入失败
2.如果字段名字没有匹配到Bean则Spring会尝试采用字段类型匹配,如果找到一个Bean则注入,如果字段类型是接口则又可能会匹配到多个类型,则会抛出匹配到多个bean的异常,注入失败
二、应用到setter上
1.先使用属性名字(参数类型属性 eg:setName 属性名字就是:name)匹配bean,查找到bean则注入,如果类型不匹配则此时有异常,注入失败
2.如果属性名字没有匹配到bean,则Spring会尝试采用属性参数类型匹配,如果找到Bean则注入,如果属性参数类型是接口则有可能会匹配到多个类型,则会抛出匹配到多个bean的异常,注入失败
两者的功能区别除了找的名字不同(其实一样)之外,最大的差别是应用在字段上时,注入时会进行寻找setter方法去注入,而setter方法则不需要找在去找setter方法。这样就提高了效率
但是为了让代码有可看性和可塑性大多数还是要将注解放在字段上
如果将setter方法的修饰符变为private私有的。这个时候如果你把注解放在属性上,这个时候spring框架单单通过属性就不能找到setter方法。
但是把注解放在私有的setter方法上,这个时候sping底层其实是用了反射机制,反射机制可以无视java的规则。可以反射调用私有的方法。
当然我们也不会将setter方法变为私有的…