• Spring原生api操作之如何在spring配置文件添加Bean对象到Spring容器


    一、创建一个spring项目

    • 为了使用Spring的原生api,首先要创建一个只基于Spring的项目.
      1. 创建maven项目
      2. 引入spring依赖(不要使用6版本以上的,6的最低兼容jdk为jdk17)
      3. 创建spring配置文件
        • 这个配置文件的名称固定,但是必须是xml文件,建议命名为spring-config.xml

        • 这个配置文件必须放在Resource目录下在这里插入图片描述

        • 配置文件的基本内容为

          
          <beans xmlns="http://www.springframework.org/schema/beans"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xmlns:content="http://www.springframework.org/schema/context"
                 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
            
          beans>
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7

    二、在配置文件中配Bean对象

    • 首先要明确的是:

      什么是Bean对象?
      答:Bean对象就是往Spring容器中装入的对象,和一般的类对象没有什么不同,只是因为这些对象的创建使用销毁都有Spring管理,为了区分就把它们叫做Bean对象。

      • 如何添加对象得到Spring容器中?
        1. 在配置文件中配置Bean标签,标签的class属性的值就是Bean对象类的路径,id属性就是bean对象的名称,在读取Bean对象时,需要用到id。

          
          <beans xmlns="http://www.springframework.org/schema/beans"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xmlns:content="http://www.springframework.org/schema/context"
                 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
             
              <bean id="user" class="com.java.demo.enity.User">bean>
          beans>
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
        2. 使用注释(五大类注释和一个方法注释)并添加配置文件

        • @Component,@Controller,@Service,@Repository,@Configuration,这就是五大类注解,只要在类定义的前面加上任何一个注解,这个类对象就会被存入一份到Spring容器中
        • @Bean,这是方法注解,只要在有返回值的方法前面加上这个注解,就可以直接将返回的对象装入Spring容器中,@Bean的方法必须是在类注释下的类里面的方法
        • 要想Spring容器正确识别注释从而获取Bean对象,需要对Spring容器进行配置,base-package的路径就是Spring容器扫描的根路径,Spring会扫描这个路径下的所有类,检查是否有类注释和方法注释。
          
          <beans xmlns="http://www.springframework.org/schema/beans"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xmlns:content="http://www.springframework.org/schema/context"
                 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
              <content:component-scan base-package="com.java.demo">content:component-scan>
          beans>
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
    • 启动Spring容器

      • 经过上面的配置,Spring容器已经被指定了要装入哪些Bean对象,但是不将Spring容器启动,这个配置终究只是一个Spring的蓝图而已。
        此时,需要一个main方法作为程序启动点,并且在main方法内调用Spring容器的启动方法。
        有两个接口可以启动Spring容器,分别是ApplicationContext和BeanFactory,实例化这两个接口就能启动Spring容器,上面的配置文件就是实例化这两个类的参数。

        1. BeanFactory获取Spring容器(老版本,不推荐)
          BeanFactory factory=new XmlBeanFactory(new ClassPathResource("spring-config1.xml"));
          
          • 1
        2. ApplicationContext获取Spring容器(新版本,推荐)
          ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml");
          
          • 1

        这两种方式获取Spring容器都要将配置文件的名字传参。
        每创建一个这个对象,就是启动了一个spring容器,在一个程序中,创建多个对象,每个对象传入不同的配置文件,每个对象都只会根据配置文件去启动不同spring容器,并且每个容器的bean都是独立的,不共享的。
        在这里插入图片描述
        BeanFactory和ApplicationContext的区别是:
        (1)ApplicationContext是一创建对象就立马将spring配置文件中的所有Bean对象全部加载到容器中,BeanFactory是使用到这个Bean对象时,才会加载到容器中。
        (2)ApplicationContext是BeanFactory的子类,它继承了BeanFactory的所有方法,并且还拓展了一些功能。

      • 通过启动后的spring容器来取出Bean对象(三种方式,只传类,只传id值,传类又传id值)

        • 只传类对象(根据类型在容器中查找对应Bean对象,容器中没有这个类型,或者有多个这个类型就会报错)

          context.getBean(BeanLife.class);
          
          • 1
        • 只传id值(根据id值在spring容器中查找对象,获取到的bean是一个Object对象,需要强转成想要的类型,没有这个id或者有多个id就会报错)

          context.getBean("beanLife");
          
          • 1
        • 即传id值又传类对象(根据id值和class对象去查找bean对象)

          context.getBean("beanLife", BeanLife.class);
          
          • 1

          此时如果容器中有两个Bean的id和class都相同,获取到的Bean是优先级低的那个,可以再添加类注解的地方再加上@Order(int)来设置优先级,int越小的,越先被加载进入容器,也就会被覆盖。
          此时问题就来了

        使用注解加入Spring容器的对象的id名是啥?
        答:默认id是类名的大驼峰形式改成小驼峰(类名首字符小写),但是当类名的前两个字母都是大写时,id默认是原类名,方法注释获取的对象,默认id名称就是方法名。并且使用类注释添加Bean对象时,可以再添加的时候设置value属性来设置Bean的名称,在使用方法注释添加Bean对象时,可以使用name属性来设置别名,方法注释的name属性可以设置多个名称,用String数组表示。
          注意:
        1. 当设置了别的名字后,默认的名字就不能用了
        2. 当有两个方法注释获取到的Bean对象的id一样,class也一样时,最后从Spring中获取到的Bean只有其中一个,谁先加载,谁就被覆盖了。可以使用@order(int值)来设置加载优先级,数越小,优先级越高,越快被加载,也就是被覆盖的那个。
        3. @Bean获取的方法不能有参数

  • 相关阅读:
    Java.lang.Class类 isInterface()方法有什么功能呢?
    配置.ssh功能
    【QT配置第三方MQTT协议】
    Linux中Java图片生成中文乱码问题解决
    2023烟台大学计算机考研信息汇总
    【第七篇】- Maven 插件
    自动驾驶-BEV感知综述
    c#设计模式-行为型模式 之 访问者模式
    Python基础篇:面向对象【案例实操】
    【译】ASP.NET Core 6 中的性能改进
  • 原文地址:https://blog.csdn.net/qq_61925446/article/details/132709918