快捷搜索:  汽车  科技

autowired在什么条件下可以使用(一文读懂Autowired和Resource的区别)

autowired在什么条件下可以使用(一文读懂Autowired和Resource的区别)@Service publicclassTestAutowired{ @Resource privateInterfaceUserimplUserA; publicvoidtest(){ implUserA.test(); } } 可以指定type@Service publicclassTestAutowired{ @Resource(type=ImplUserA.class) privateInterfaceUserinterfaceUser; publicvoidtest(){ interfaceUser.test(); } } 可以指定name@Service publicclassTestAutowired{ @Resource(name=implUserA) privateInterfaceUserinterfaceUser; publicvoidtest(){ interfac

1、bean注入的注解

@Autowired

@Autowired privateUserServiceuserService;

@resource

@Resouce privateUserServiceuserService; 2、区别

@Autowired

  • Spring注解
  • 默认按照类型注入
  • 如果想按照名称注入,需要结合@Qualifier使用

这种情况一般发生在:一个类,有多个实现类的时候,比如

接口 publicinterfaceInterfaceUser{ voidtest(); } 实现类A @Service publicclassImplUserAimplementsInterfaceUser{ @Override publicvoidtest(){ System.out.println("我是a"); } } 实现类B @Service publicclassImplUserBimplementsInterfaceUser{ @Override publicvoidtest(){ System.out.println("我是b"); } } 此时interfaceUser对应两个实现类,根据类型无法知道要注入的是A还是B, 需要使用Qualifier,指定注入的bean的名称(类名,首字母小写) @Service publicclassTestAutowired{ @Autowired @Qualifier("implUserB") privateInterfaceUserinterfaceUser; publicvoidtest(){ interfaceUser.test(); } }

@Resource

  • JDK支持的注解
  • 默认先按照名称找,名称找不到,会按照类型找
  • 可以指定name,也可以指定type
  • 当你指定name的时候,只会按照名称找,名称找不到就不会再根据类型找

同样的,一个类,两个实现类的时候,看下resouce怎么处理的

这种情况,会报错,先按照name:interfaceUser找,没找到之后,会再根据InterfaceUser类型找,此时会找到两个ImplUserA和ImplUserB,报错

@Service publicclassTestAutowired{ @Resource privateInterfaceUserinterfaceUser; publicvoidtest(){ interfaceUser.test(); } }

怎么解决呢?

  • 可以修改属性名

@Service publicclassTestAutowired{ @Resource privateInterfaceUserimplUserA; publicvoidtest(){ implUserA.test(); } }

  • 可以指定type

@Service publicclassTestAutowired{ @Resource(type=ImplUserA.class) privateInterfaceUserinterfaceUser; publicvoidtest(){ interfaceUser.test(); } }

  • 可以指定name

@Service publicclassTestAutowired{ @Resource(name=implUserA) privateInterfaceUserinterfaceUser; publicvoidtest(){ interfaceUser.test(); } } 3、总结

对比项

@Autowire

@Resource

注解来源

Spring注解

JDK注解(JSR-250标准注解,属于J2EE)

装配方式

优先按类型

优先按名称

属性

required

name、type

作用范围

字段、setter方法、构造器

字段、setter方法

推荐resource

  • resource注解是属于J2EE的,减小了与spring的耦合
  • 用autowire,如果之后新增一个实现类时,要把原有所有autowire的地方进行修改,指定name,不然原有注入的地方会报错用resource,只需给新增的类指定不一样的name即可

关注公众号:臻大虾,分享更多java干货

你的支持是对我不断创作的极大鼓励,咱们下期见。

autowired在什么条件下可以使用(一文读懂Autowired和Resource的区别)(1)

autowired在什么条件下可以使用(一文读懂Autowired和Resource的区别)(2)

猜您喜欢: