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>
        

二、在配置文件中配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>
        
      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>
        
  • 启动Spring容器

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

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

      这两种方式获取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);
        
      • 只传id值(根据id值在spring容器中查找对象,获取到的bean是一个Object对象,需要强转成想要的类型,没有这个id或者有多个id就会报错)

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

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

        此时如果容器中有两个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获取的方法不能有参数

你可能感兴趣的:(spring,java,后端)