• Spring bean


    目录

    1.作为卖方如何进行注册

    (1)直接将对象的创建过程委托给spring容器

    (2)将一个已经创建好的对象注册

    2. spring怎么实例化对象

    3.通过注解的方式进行bean的注册

    4.新建项目专门学习注解的方式

    5.获取bean的方式

    1.直接调用context.getBean(...),其实使用频率不高,(了解即可)

     2.使用bean 注入的方式使用(Ioc/DI体现的地方)被广泛使用

    总结:


    1.作为卖方如何进行注册

    (1)直接将对象的创建过程委托给spring容器

    (2)将一个已经创建好的对象注册

           a 通过静态方法(工厂方法:生产对象的一种方法)

    通过这个类的下的createPerson这个方法,就可以得到一个对象,这个对象的名字叫 通过工厂注册。

        b.通过实例方法

    通过bean注册进来的一个对象,然后传入一个对象,和方法名


     key是id,value是任意类型的对象。

    买方通过getBean和依赖注入的方式获取bean


    逻辑上作为买方是注册bean的方式,有两种

    2. spring怎么实例化对象

     逻辑上作为卖方是注册bean的方式,有两种

    1.告诉Spring容器哪个类,实例化过程让Sping完成

    2.告诉Spring容器一个方法,实例化过程是我们自己的代码写的

    而Spring是通过java反射机制来做到这一点的

    买方使用时也是两种方式

    1.直接获取 context.getBean(...)

    2.使用注入的方式(这种方式既是卖方也是买方)(要求,被注入的类的实例化过程是spring处理的)

         注入方法:通过构造方法注入

         通过setter方法注入

    3.通过注解的方式进行bean的注册

     

    有了注解,spring进行扫描就知道,这个要被我管理

    4.新建项目专门学习注解的方式

    在ioca这个包下面的都可以扫描到,不在这个包下面的扫描不到 ,写在别的包用注解修饰没有意义


    (1)注解方式注册的必要条件

    (2)要在 XXXApplication  所在的包下面


    会多出来一个bean

    代码如果写为private,也还是可以注册bean,但是还是写public


    1.@Component 是用来修饰类的,被注解修饰的类,全部注册进Spring容器中

    而其实例化的过程也完全交给Spring。

     没有特别的场景,都可以用@Component

    1. @Controller
    2. public class Hello {
    3. public Hello() {
    4. System.out.println("Hello() 被调用");
    5. }
    6. }

      总结:要记住,在idea配置中写出来


    2.直接将对象注册到Spring中的注解

    结果会多了两个bean
    1. @Configuration
    2. public class AppConfig {
    3. @Bean("王淇") //它的名字叫 王淇
    4. public String wangqi(){
    5. return "王小熊";
    6. }
    7. }

    5.获取bean的方式

    1.直接调用context.getBean(...),其实使用频率不高,(了解即可)

    根据id获取

    根据类型获取

    id 和类型都指定也可以

     2.使用bean 注入的方式使用(Ioc/DI体现的地方)被广泛使用

    1. // 需要用到 Hello 类,所以这个类必须有
    2. // 1. 先让 Person 类被注册进 Spring 容器,并且,实例化过程委托给 Spring。—— @Component 修饰 Person 类 :对象的卖方(卖 Person 对象)
    3. // 2. 要求 Hello 类已经被注册到 Spring 容器中了(类注册 or 方法注册都可以):对象的买方(买 Hello 对象)
    4. // 2.1. 直接使用构造方法注入
    5. @Component
    6. public class Person {
    7. @Autowired // 这个注解其实可以不写,但建议写上,主要是让看代码的人,知道我们的 Hello 对象是被注入的
    8. // 如果有多个构造方法,告诉 Spring,实例化 Person 对象时,应该调用哪个
    9. public Person(Hello hello) {
    10. System.out.println("Person(), hello = " + hello);
    11. }
    12. public Person(int x) {
    13. System.out.println("Person()");
    14. }
    15. }

     意思是person类需要被管,Hello要之前就有


    setter方法的注入,必须带注解

    1. // 需要用到 Hello 类
    2. // 1. 先让 Person 类被注册进 Spring 容器,并且,实例化过程委托给 Spring。—— @Component 修饰 Person 类 :对象的卖方(卖 Person 对象)
    3. // 2. 要求 Hello 类已经被注册到 Spring 容器中了(类注册 or 方法注册都可以):对象的买方(买 Hello 对象)
    4. // 2.2. 使用 setter 方法去注入
    5. @Component
    6. public class Person2 {
    7. public Person2() {
    8. System.out.println("Person2() 被调用");
    9. }
    10. @Autowired // 必须带上
    11. public void setHello(Hello hello) {
    12. System.out.println("setHello(), hello = " + hello);
    13. }
    14. }

    属性直接注入

    1. // 需要用到 Hello 类
    2. // 1. 先让 Person 类被注册进 Spring 容器,并且,实例化过程委托给 Spring。—— @Component 修饰 Person 类 :对象的卖方(卖 Person 对象)
    3. // 2. 要求 Hello 类已经被注册到 Spring 容器中了(类注册 or 方法注册都可以):对象的买方(买 Hello 对象)
    4. // 2.2. 使用属性直接注入
    5. @Component
    6. public class Person3 {
    7. @Autowired // hello 属性的值会被 Spring 容器对象注入
    8. private Hello hello; // 通过反射方式,即使是 private,也可以绕开访问限制
    9. public Person3() {
    10. System.out.println("Person2() 被调用");
    11. }
    12. public void printHello() {
    13. System.out.println("printHello(), hello = " + this.hello); //这里没有赋值,但是值会被注入进来
    14. }
    15. }

    定义的属性没有赋值,但是自己就有


    坑点:属性注入要注意顺序(很危险,建议不要使用)

    1. // setter 注入 / 属性直接注入上
    2. @Component
    3. public class 注入时的一个坑 {
    4. @Autowired // 进行了属性注入
    5. private Hello hello;
    6. public 注入时的一个坑() {
    7. // 不是注入了么,为什么 hello 还是 null 呢,为什么没有注入成功?
    8. // 因为构造方法先执行,然后进行注入(属性注入/setter注入)
    9. // 所以,构造方法执行的时候,注入还没有发生,所以还是 null
    10. // 这也是为什么建议使用构造方法注入
    11. System.out.println("注入时的一个坑(), hello = " + this.hello); // 这里的 hello 打印什么? null 还是 非null
    12. }
    13. }

    也可以配合bean来注入,是一种方法注入

    1. @Bean // 这里的 Hello hello 由 Spirng 注入
    2. // 因为 createPerson 被 Spring 调用,它可以填写我们指定的需要的参数
    3. public Person createPerson(@Autowired Hello hello) {
    4. System.out.println("createPerson(), hello = " + hello);
    5. return new Person(hello);
    6. }

    总结:

    是收手动完成的,调用spring是不行的


    每个bean只会有一份,都是单例的

     

     

     

  • 相关阅读:
    js 给对象写 JSON.stringify 的方法
    Python 自定义函数的基本步骤
    关于pycharm打开时一直加载中的解决办法
    [极致用户体验] 在微信大字号模式下,网页样式乱了怎么办?
    HTML:认识HTML与基本语法的学习
    便利贴--45{uniapp 组件picker 的封装,对于数据的传输和处理 -- 基于之后会发布的from自定义封装}
    【Python 零基础入门】Numpy 常用函数 通用函数 & 保存加载
    nacos-springboot搭建
    【算法】算法设计与分析 课程笔记 第一章&第二章
    Mybatis学习笔记2 增删改查及核心配置文件详解
  • 原文地址:https://blog.csdn.net/wxx200008/article/details/125994924