@Autowired和@Resource的区别、@RequiredArgsConstructor和final

@Autowired和@Resource的区别、@RequiredArgsConstructor和final
文章目录Autowired的用法Resource的使用RequiredArgsConstructor和final其他实际例子其他spring注入的对象可千万别用new创建对象啊Autowired和Resource都是用来注入对象的。最大的区别Autowired默认按照类型byType注入。Resource默认按照名称byName注入。当然还有细节的东西。Autowired的用法Autowired只按照类型byType注入如果我们想按照名称byName来装配可以和Qualifier一起使用。默认按照类型来注入AutowiredprivateUserDaouserDao;加上Qualifier按照名称来注入。Autowired Qualifier(userDao) private UserDao userDao;Autowired要求依赖对象必须存在如果不存在会报错。如果允许null值可以设置它的required属性为false。如果UserDao这个Bean不存在那么会报错。AutowiredprivateUserDaouserDao;设置requiredfalse之后为空也不报错。Autowired(requiredfalse)privateUserDaouserDao;Resource的使用Resource有两个重要的属性name和type。使用name表示按照名称byName注入。使用type表示按照类型byType注入。都不设置的话默认按照名称byName注入。RequiredArgsConstructor和final之前一直有一个疑问final修饰的Service并没有Autowired注解为什么可以注入呢?其实这是spring4.3及以上版本的一个机制如果类只有一个构造方法spring会自动使用这个构造器完成依赖注入不需要标注Autowired。而RequiredArgsConstructor只会生成唯一一个构造器参数就是所有final修饰的属性刚好契合这个规则。也就是说RequiredArgsConstructorfinal是这个机制最典型的一种情况。用法类上加上RequiredArgsConstructor注解注入对象就可以直接用final了。spring4.3 对应boot1.4.x及boot1.5.x目前企业用到的框架基本都达到或高于这个版本所以这么用没任何问题。其他实际例子所以当使用Resource时这种写法会报错privateProductDaoproductDao;privateProductMxDaoproductZcDao;// 这2个名称不一样会提示productZcDao 不能作为 ProductMxDao 类型注入。如果是Autowired则不会报错。其他spring注入的对象可千万别用new创建对象啊虽然是常识这个错误很容易犯。工具类的代码这里必须要加入到spring否则httpDomain值嵌入不进来ComponentpublicclassUrlUtils{value(${httpDomain})privateStringhttpDomain;}调用的代码newUrlUtils().getHttpDomain();搞了半天发现为null。 为null就对了new的对象没有经过spring的管理httpDomain肯定为null啊。正确的代码AutowiredprivateUrlUtilsurlUtils;urlUtils.getHttpDomain();// 这样就不为空了