spring依赖注入需要注意的点


一、spring依赖注入大致要经历六个环节

1、对象是否允许注入校验

@Bean注解中有一个属性:autowireCandidate。该属性的默认值是true,也即是说当前对象默认情况下是允许注入的;如果该属性的值设置为false,那么就表明该对象是不允许注入的,如果此时@Autowired中的required属性没有设置成false,那么此次注入就会报错。

2、对泛型的转换校验

Java中的接口中可能有像是UserInterface<O, S>这样的,当一个对象实现了这类接口的时候(如:UserService implements UserInterface<Age, Agent>),spring就会根据实现类上所写的<Age, Agent>来初始化实例对象。

3、匹配指定名称对象

如果在创建实例对象时加上了@Qualifier(“userService”)这样的注解,那么只需要在需要注入的属性上方加上相同的注解,该属性就只会加载拥有相同注解的的实例对象。

4、判断主要对象注入

当一个类对象含有多个的时候,如果其中某一个对象加上了@Primary注解,那么spring在注入的时候就会默认以加了@Primary注解的对象注入对应的属性中。

5、按顺序注入

当一个类对象含有多个的时候,只要每个对象的头部都加上了@Priority(“xx”)这样的注解,那么spring会默认取数值最小的那个对象注入需要依赖注入的属性中。

6、通过类型、名称筛选注入

经过上述五个过程的过滤后,如果仍旧含有多个对象,那么spring会先按照类型筛选出与需要注入属性类型相同的对象,如果相同的对象还有多个,那么spring会根据属性名成来取出其中某个key值与其相同的对象注入,如果没有key相同的对象,那么spring注入的时候就会报错。

二、通过xml注入和@Autowired注入的不同点

xml的对象标签中会有一个autowire的属性,这个属性默认是no,它还有其他的属性,像是byName、byType和constructor等。

  • 1、从粒度上来说@Autowired的注解是更细的,它可以加在构造方法上、加在注入方法(该方法不限于setXXX形式的方法)上甚至是加在属性上。而xml注入只能加在setXXX形式的方法和构造方法上;
  • 2、筛选逻辑的不同,@Autowired注解都是先byType(通过类型去查找)再byName(通过名字去查找),对于属性、注入方法和构造方法的注入都是如此。xml的byName就只能针对含有setXXX的注入方法的对象生效,且它用于查找的名字并不是入参的名字而是setXXX里面的XXX。它的byType方法也是通过获取set方法中唯一的参数类型来进行查找,如果找到多个就会抛异常。

猜你喜欢

转载自blog.csdn.net/qq_42697271/article/details/120997870
今日推荐