理解 注解@Resource @Override

@Resource和@Autowired注解都是用来实现依赖注入的。只是@Autowired按byType自动注入,而@Resource默认按 byName自动注入。
  @Resource有两个重要的属性,分是name和type。
  Spring将name属性解析为bean的名字(最需要重新理解的就是这个bean名字),而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。
  @Resource依赖注入时查找bean的规则:(以用在field上为例)
  1. 既不指定name属性,也不指定type属性,则自动按byName方式进行查找。如果没有找到符合的bean,则回退为一个原始类型进行进行查找,如果找到就注入。
  此时的name是变量名。
错误 示例:
@Resource
private String bucketName;
@Resource
private String styleName;
此时的name值是配置bean里的name属性指定的值,而不是id的值


<bean id="styleName " class="java.lang.String">
    <constructor-arg value="${oos.styleName}"/>
</bean>
这里为什么要重新理解,是因为之前我一直认为对应的是配置文件的id属性的值,直到在配置上面两个String类型的bean的时候,居然会报错,如下:

No qualifying bean of type [java.lang.String] is defined: expected single matching bean but found 2: bucketName,styleName
这是因为spring会去找bean元素里name属性值和变量名一致的bean,但是因为都没有指定name属性,所以找不到然后就按照原始类型String去查找,结果一下找到了两个,所以就报错。

@Override注解
Java SE5新增加@Override注解,它并不是关键字,但是可以把它当作关键字使用。当你想要覆写(重写)某个方法时,可以选择添加这个注解,在你不留心重载而并非覆写了该方法时,编译器就会生成一条错误信息。
重载:重载的时候,方法名要一样,但是参数类型或个数不一样,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准。
覆写(重写):若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法。

举例(引自海涛zht666):在重写父类的onCreate时,在方法前面加上@Override 系统可以帮你检查方法的正确性。
@Override
public void onCreate(Bundle savedInstanceState)
{…….}
这种写法是正确的,如果你写成:
@Override
public void oncreate(Bundle savedInstanceState)
{…….}
编译器会报如下错误:The method oncreate(Bundle) of type HelloWorld must override or implement a supertype method,以确保你正确重写onCreate方法(因为oncreate应该为onCreate)。而如果你不加@Override,则编译器将不会检测出错误,而是会认为你为子类定义了一个新方法:oncreate

猜你喜欢

转载自blog.csdn.net/qq_41608180/article/details/82216924