关于spring的依赖注入问题

关于spring的依赖注入问题

spring 的依赖注入有三种方式:

  1. 属性注入(Field Injection)

    这种注入方式就是在bean的变量上使用注解进行依赖注入@Autowired 的一大使用场景就是属性注入,它的本质其实是通过java反射机制来实现的,所以private成员变量也可以被注入具体对象。

    @Controller
    public class UserController {
     
        @Autowired
        private UserService userService;
     
    }
    
  2. 构造器注入(Constructor Injection)

    将各个必需的依赖全部放在带有注解构造方法的参数中,并在构造方法中完成对应变量的初始化,这种方式,就是基于构造方法的注入。

    @Controller
    public class UserController {
     
        private final UserService userService;
     
        public UserController(UserService userService){
            this.userService = userService;
        }
     
    }
    
  3. set 方法注入(Setter Injection)

Setter Injection也会用到@Autowired注解,但使用方式与Field Injection有所不同,Field Injection是用在成员变量上,而Setter Injection的时候,是用在成员变量的Setter函数上。

@Controller
public class UserController {
 
    private UserService userService;
 
    @Autowired
    public void setUserService(UserService userService){
        this.userService = userService;
    }
}

使用@Resource代替@Autowired
@Resource有2个属性name和type。在spring中name属性定义为bean的名字,type这是bean的类型。如果属性上加@Resource注解那么他的注入流程是

如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常。
如果指定了name,则从上下文中查找名称匹配的bean进行装配,找不到则抛出异常。
如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或是找到多个,都会抛出异常。
如果既没有指定name,又没有指定type,则默认按照byName方式进行装配;如果没有匹配,按照byType进行装配。
@Autowired只根据type进行注入,不会去匹配name。如果涉及到type无法辨别注入对象时,那需要依赖@Qualifier@Primary注解一起来修饰。

使用@RequiredArgsConstructor构造器方式注入
这种形式就是Spring推荐使用的构造器方式注入,此种方式是lombok包下的注解,如果使用此种方式,需要项目中引入lombok,

@RequiredArgsConstructor
public class UserDaoImpl{
	private final User user;
}

以上都是我的思考和查询资料所得,仅作为自我学习的记录

posted @   一个大转盘  阅读(29)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示