Spring获取bean对象(对象注入)三种方法以及优缺点

1、属性注入

属性注入是通过 @Autowired注解实现的
以下例子,是将Service类注入到Controller
Controller代码实现如下

import com.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

@Controller
public class UserController {
    @Autowired
    public UserService userService;
      public void sayHi(){
        System.out.println("do UserControler sayhi");
        userService.sayHi();
    }
}

在这里插入图片描述

2、setter注入

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

在这里插入图片描述

3、构造方法注入

 private UserService userService;
@Autowired
    public UserController(UserService userService) {
        this.userService = userService;
    }

在这里插入图片描述
可以看出以上方法都可以得出结果,但是他们也有各自的不足之处

属性注入的优缺点

1、功能性问题:无法注入一个不可变的对象(final 修饰的对象)
在这里插入图片描述
2、通用性问题:只能适应于 IoC 容器;如果将属性注入的代码移植到其他非 IoC 的框架中,那么代码就无效了,所以属性注入的通用性不是很好。
3、设计原则问题:更容易违背单一设计原则。因为属性注入比较简单,所以可能会出现滥用的情况,出现违背单一职责原则的概率也越大。

setter注入优缺点

1、不能注入不可变对象(final 修饰的对象);
在这里插入图片描述

2、注入的对象可被修改(因为提供了setter方法,所以很容易就可以修改)
在这里插入图片描述

构造方法注入的优缺点

1、注入不可变对象
在这里插入图片描述
2、注入对象不会被修改
构造方法注入不会像 Setter 注入那样,构造方法在对象创建时只会执行一次,因此它不存在注入对象被随时(调用)修改的情况。
3、可以保证注入对象完全被初始化
4、通用性更好

总结:为什么属性注入和setter注入都不可以注入一个不可变的对象?而构造方法却可以?因为在Java中,被final修饰的对象必须满足以下两个条件中的任意一个

final修饰的对象,要么直接赋值
final修饰的对象必须在构造方法中赋值

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值