这个注解的英文直译是“自动装配”,“自动注入”
它就像一根水管一样,两端接上水桶,然后就可以把一个桶里面的水自动注入到另一个桶中。
这两端的桶,可以是 类成员变量/方法/构造函数
中间流的水,可以是 数组/集合/Map/父类属性
如果查询结果刚好为一个,就将该bean装配给@Autowired指定的数据
如果查询的结果不止一个,那么@Autowired会根据名称来查找(首字母小写)。
如果查询的结果为空,那么会抛出异常。解决方法是,@AutoWired(required=false)
因为Java变量的初始化顺序为: 静态变量或静态语句块–>实例变量或初始化语句块–>构造方法–>@Autowired
如果在加在变量/方法上面,那么下面这段代码就会报错
@Autowired private User user; private String school; public UserAccountServiceImpl(){ this.school = user.getSchool(); }因为先会执行构造方法,而这个时候还没有注入,所以get不出来,会报空指针错误。
相反,如果加在构造器上面就不会报错。如下:
private User user; private String school; @Autowired public UserAccountServiceImpl(User user){ this.user = user; this.school = user.getSchool(); }这个注解是用来辅助@AutoWired注解来使用的。 用于当@AutoWired在注入父类属性时有两个或以上实现类时,指定要用哪个。
👆上面在@AutoWired注解里面说了,当实现类有多个的时候,它会自动去找和它名称相同的实现类(首字母小写),但如果我们不想这样,就可以加一个@Qualifer注解来指定具体要注入哪一个实现类。
举例如下⬇️:
//父级接口 public interface IMenuService { /** * 获取所有菜单列表 * * @return List<MenuEntity> */ public List<MenuEntity> getAllMenuList(); } //实现类1 @Service("menuService1") public class MenuServiceImpl implements IMenuService { @Autowired private MenuMapper mapper; /** * 获取所有菜单 */ @Override public List<MenuEntity> getAllMenuList() { MenuEntityExample example = new MenuEntityExample(); long start = System.currentTimeMillis(); example.setDistinct(false); List<MenuEntity> allMneuList = mapper.selectByExample(example); } //实现类2 @Service("menuService2") public class MenuServiceImpl implements IMenuService { /** * 获取所有菜单 */ @Override public List<MenuEntity> getAllMenuList() { return null; }现在如果想要注入实现类1的话,应该这样⬇️
@Autowired @Qualifier("menuService1") private IMenuService menuService;想要 注入实现类2的话,应该这样⬇️
@Autowired @Qualifier("menuService2") private IMenuService menuService;这个注解的作用和@AutoWired一致, 只不过@AutoWired是ByType的,而@Resource是ByName的 @AutoWired首先按类型查找,同类型的有多个时,才按照首字母小写来匹配 @Resource首先按照名称查找,没有对应名称时,才按照类型匹配