【Spring学习之更简单的读取和存储Bean对象】属性注入,set注入,构造方法注入

前言:
💞💞今天我们依然是学习Spring,这里我们会更加了解Spring的知识,知道Spring是怎么更加简单的读取和存储Bean对象的。也会让大家对Spring更加了解。
💟💟前路漫漫,希望大家坚持下去,不忘初心,成为一名优秀的程序员

个人主页⭐: 书生♡
gitee主页🙋‍♂:奋斗的小白
博客领域💥:java编程 ,前端,算法,强训题目
写作风格💞:超前知识点,干货,思路讲解,通俗易懂
支持博主💖:关注⭐,点赞、收藏⭐、留言💬

在这里插入图片描述
我们之前的博客讲述了如何通过注解(类注解和方法注解)简单的读取和存储Bean对象
类注解和方法注解的博客地址 :博客链接

1.获取 Bean 对象

获取 bean 对象也叫做对象装配,是把对象取出来放到某个类中,有时候也叫对象注⼊
现实工作中一般是将,将 Service 类注⼊到 Controller 类中。

我们获取Bean有三种方法,分别是属性注入,set注入,构造方法注入,下面为大家挨个分享一下。

1.1 属性注入

属性注入我们也是通过注解实现的,通过@Autowired来实现的
通过这个@Autowired注解,我们就可以将Service类注入到Controller类中。

@Service
public class StudentService {

    public void hello()
    {
        System.out.println("Hi,Service。");
    }
}

@Controller
public class StudentController {

    //获取 Bean 对象=>属性注入
    @Autowired
    private StudentService studentService;
    public  void hello()
    {
        studentService.hello();
    }
}

public static void main(String[] args) {

        //1.获取Spring对象(上下文)

        ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml");
        //2.取出bean对象

        StudentController student =context.getBean("studentController",StudentController.class);
        student.hello();
    }

在这里插入图片描述

属性注入优点:
1.实现简单

属性注入缺点:
1.不能注入不可变的对象(对象被final修饰的)
2.只适用于Ioc容器
3.更容易违背单一设计原则(针对的是类)

在这里插入图片描述

1.2 set注入

Setter 注⼊和属性的 Setter ⽅法实现类似,只不过在设置 set ⽅法的时候需要加上 @Autowired 注

 //获取 Bean 对象=>set注入
   
    private StudentService studentService;
    @Autowired
    public void setStudentService(StudentService studentService) {
        this.studentService = studentService;
    }

    public  void hello()
    {

        studentService.hello();
    }

在这里插入图片描述

set注入优点:
1.更加符合单一设计原则。针对对象方法级别。

set注入缺点:
1.不能注入不可变对象;
2.注入对象可被修改。(set方法是普通set方法,可以被重复调用,在被调用时就存在修改的风险。)

1.3 构造方法注入

构造⽅法注⼊是 Spring 推荐的注⼊⽅式

构造⽅法注⼊是在类的构造⽅法中实现注⼊

//构造⽅法注⼊

    private  StudentService studentService;
    @Autowired
    public StudentController(StudentService studentService, UserComponent userComponent) {
        this.studentService = studentService;
        this.userComponent = userComponent;
    }

    public  void hello()
    {

        studentService.hello();
    }

如果只有⼀个构造⽅法,那么 @Autowired 注解可以省略

构造方法注入优点:
1.可以注入一个不可变的对象。
2.注入的对象不会被修改。
 2.1加了final修饰符。
  2.2构造方法是随着类加载只执行一次的(不像set有可能执行多次被修改的分享)。
3.注入的对象会被完全初始化。(使用构造方法带来的优点)
4.通用性更好。

构造方法注入缺点:
1.没有属性注入实现简单。

2.@Resource:另⼀种注⼊关键字

在进⾏类注⼊时,除了可以使⽤ @Autowired 关键字之外,我们还可以使⽤ @Resource 进⾏注⼊

@Resource
    private Student student;
    public  void hello()
    {

        System.out.println(student.toString());
    }

3. @Autowired 和 @Resource 的区别

相同点:
1.都是用来实现依赖注入的。

不同点:
1.功能支持不同:@Autowired支持属性注入、setter注入、构造方法注入;@Resource支持属性、setter注入,但不支持构造方法注入。
2.出身不同:@Autowired来自Spring框架;而@Resource来自于JDK。
3.参数支持不同:@Resource支持更多的参数设置比如name参数;而@Autowired只支持required 参数。

在这里插入图片描述

4.同⼀类型多个 @Bean 报错

看这么一个代码

@Controller
public class UserBean {

    @Bean
    public User user1()
    {
        User user=new User();
        user.setId(1);
        user.setName("张三");
        user.setPassword("123");
        return  user;
    }
    @Bean
    public User user2()
    {
        User user=new User();
        user.setId(1);
        user.setName("张三");
        user.setPassword("123");
        return  user;
    }
}


@Controller
public class UserController {

    @Autowired
    private User user;

    public void getUser()
    {
        System.out.println("user:"+user);
        User user2=user;
        user2.setName("lisi");
        System.out.println("user:"+user2);
    }
}

看代码是没有问题的,但是运行会发现出现错误
在这里插入图片描述

报错的原因是,⾮唯⼀的 Bean 对象。

解决同⼀个类型,多个 bean 的解决⽅案有以下两个:
使⽤ @Resource(name=“user1”) 定义。
使⽤ @Qualifier 注解定义名称。

在这里插入图片描述
在这里插入图片描述

5. 总结

  1. 将对象存储到 Spring 中:
    1.1. 使⽤类注解:@Controller、@Service、@Repository、@Configuration、@Component
    1.2. 使⽤⽅法注解:@Bean【注意事项:必须配合类注解⼀起使⽤】
  1. Bean 的命名规则:
    ⾸字⺟和第⼆个字⺟都⾮⼤写,⾸字⺟⼩写来获取 Bean,如果⾸字⺟和第⼆个 字⺟都是⼤写,那么直接使⽤原 Bean 名来获取 Bean。
  1. 从 Spring 中获取对象:
    1.属性注⼊
    2.Setter 注⼊
    3.构造函数注⼊(推荐)
  1. 注⼊的关键字有:
    1.@Autowired
    2.@Resource
  1. @Autowired 和 @Resource 区别:
    1.出身不同;
    2.使⽤时设置参数不同 @Resource ⽀持更多的参 数,⽐如 name。
  1. 解决同⼀类型多个 Bean 的报错:
    1.使⽤ @Resource(name=“”)
    2.使⽤ @Qualifier(“”)