Spring中常用注解及其作用(二)

tech2022-08-07  146

9.@AutoWired

这个注解的英文直译是“自动装配”,“自动注入”

它就像一根水管一样,两端接上水桶,然后就可以把一个桶里面的水自动注入到另一个桶中。

这两端的桶,可以是 类成员变量/方法/构造函数

中间流的水,可以是 数组/集合/Map/父类属性

一般使用场景:

@Service public class UserService { @Autowired //定义一个变量来接收注入过来的类 private UserRepository userRepository; public void save(){ //然后就可以通过点来调用这个类里面的方法 userRepository.save(); } }

注意事项:

@Autowired是ByType的,在使用时首先在容器中查询对应类型的bean

如果查询结果刚好为一个,就将该bean装配给@Autowired指定的数据

如果查询的结果不止一个,那么@Autowired会根据名称来查找(首字母小写)。

如果查询的结果为空,那么会抛出异常。解决方法是,@AutoWired(required=false)

@AutoWired加在变量/方法上面与加在构造器上面有什么区别?

答:加在构造器上面更保险一些。

因为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(); }

10.Qualifer

这个注解是用来辅助@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;

11.@Resource

这个注解的作用和@AutoWired一致, 只不过@AutoWired是ByType的,而@Resource是ByName的 @AutoWired首先按类型查找,同类型的有多个时,才按照首字母小写来匹配 @Resource首先按照名称查找,没有对应名称时,才按照类型匹配

最新回复(0)