栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【Spring】@Autowired和@Resource

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【Spring】@Autowired和@Resource

Spring常用的注入方式

一、@AutoWired (一)属性注入

(1)违背单一职责原则
类和依赖容器强耦合,不能在容器外使用

(2)出现两个相同的类型bean

(二)构造方法注入


方法二:Lombok 注解@RequiredArgsConstructor

@RestController  
@RequiredArgsConstructor //Lombok提供
public class AppointmentNumberConfigurationController {
    
    final AppointmentNumberConfigurationService numberConfigurationService; //必须声明的变量为final
}
(三)set 方法注入

二、按名注入

如果一定要使用属性注入, 可以使用 @Resource 代替 @Autowired 注解

//方式一
 	@Autowired
    @Qualifier("user1") //指定一个bean的名称
    private IUser user;
    
 //方式二
     @Resource("user2") 
     private IUser user;

@Resource装配顺序:

① 指定name+type,则从Spring上下文找到唯一匹配的bean进行装配,找不到则抛异常。
② 指定name,则从上下文中查找名称匹配的bean进行装配,找不到则抛出异常。
③ 指定type,则从上下文中找到类似匹配的唯一bean进行装配,【找不到/找到多个】抛出异常。
④ 不指定name和type,先byName;没有匹配,则回退为一个byType

三、@AutoWired装载失败

装载流程

(1)类上未加注解

public class UserService {

    @Autowired
    private IUser user;

    public void test() {
        user.say();
    }
}
(1)装载失败

类初始化:静态变量或静态语句块 –> 实例变量或初始化语句块 –> 构造方法 -> @Autowired

下面类的初始化失败

@Autowired
private Person person;
 
private String company;
 
public UserServiceImpl(){
    this.company = person.getCompany(); //注入的person为null
}
(2)注入Filter或Listener

springmvc的启动是在DisptachServlet里面做的,而它是在listener和filter之后执行。如果我们想在listener和filter里面@Autowired某个bean,肯定是不行的,因为filter初始化的时候,此时bean还没有初始化,无法自动装配。

(3) 注解未被@ComponentScan扫描 四、对比
@Autowired@Resource
byType,可能重名byName
Spring 内置javax.annotation.Resource(JSR-250)
只包含一个参数:required
构造器、方法、参数、成员变量和注解类、成员变量和方法
五、参考资料

知乎-@Autowired和@Resource的区别是什么?
为什么Spring和IDEA都不推荐使用 @Autowired

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1027343.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号