参考博客: @Autowried和@Resource区别

参考博客:SpringBoot依赖注入

Autowired

  • 默认注入方式byType根据类型匹配;
  • 当多个实现时,则通过byName注入;
  • 通过配合@Qualifier注解显式指定name,指明具体使用的实现类;

Resource

  • 默认通过byName注入,没有匹配则通过byType注入;

重要属性 nametype

nametype用来显式指定byNamebyType方式注入

对应4种情况

//1. 默认方式:byName
@Resource
private UserService userService;

//2. 指定byName
@Resource(name="userService")
private UserService userService;

//3. 指定byType
@Resource(type="UserService.class")
private UserService userService;

//4. 指定byName和byType
@Resource(name="userService",type="UserService.class")
private UserService userService;

报错情况

  • 未指定name属性、未指定type属性:
    • 默认通过byName,若匹配失败者通过byType方式注入
  • 指定name属性:
    • 将变量名在IOC容器中id进行匹配,匹配失败则报错
  • 指定type属性:
    • 将类型在IOC容器中进行匹配,匹配不到或匹配多个则报错
  • 指定name属性和type属性:
    • 在IOC容器中匹配,名字和类型同时匹配则成功,否则失败

Qualifier和Autowired

Qualifier和Autowired配合使用,指定bean的名称

Service、Controller、Respository

标记类是Service层类,Controller层类,数据存储层的类,spring扫描注解配置时,会标记这些类要生成bean。

Component

是一种泛指,标记类是组件,spring扫描注解配置时,会标记这些类要生成bean。

附录备注

SpringBoot的包未被扫描到问题解决

  1. 确认Application的入口类在目录位置最顶层,扫描规则从上往下。(主入口类:org.xx.com; 其他类: org.xx.com.dao/controller/model/...
  2. 在springBoot的启动入口类上使用注解@ComponentScan注解,配置需要扫描的包。(例如:@ComponentScan(basePackages={"org.xx.com.conf"})

不能对static静态变量注入

从配置文件*.yml获取参数给变量赋值


@Value("${xxx.xxx}")
public void setDemo( String strs ){
this.demo = strs;
}
public static String demo;