• 【Spring】Spring的创建和使用手术刀剖析



    在这里插入图片描述


    前言

    Spring是一个包含了众多工具方法的Ioc容器,它包含以下两个最基本的功能:

    1. 将对象存储到容器中
    2. 从容器中将对象取出来

    一、如何创建Spring项目

    Spring项目的创建与Servlet类似,分为以下3步:

    1. 创建一个普通Maven项目
    2. 添加Spring框架支持,spring-context、spring-beans
    3. 添加启动类并添加main方法(主要用来测试)。

    1.创建Maven项目

    在这里插入图片描述

    创建成功的效果:

    在这里插入图片描述


    2.添加 Spring 框架支持

    在项⽬的 pom.xml 中添加 Spring 框架的支持,xml 配置如下:

    <dependencies>
       <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.3.RELEASE</version>
        </dependency>
      
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>5.2.3.RELEASE</version>
        </dependency>
    </dependencies>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    可以看到,这里添加的框架有 spring-context:spring 上下⽂,还有 spring-beans:管理对象的模块。

    在这里插入图片描述


    3. 添加启动类main

    在创建好的项⽬ java ⽂件夹下创建⼀个启动类main:

    在这里插入图片描述
    可以试着运行打印一下:

    在这里插入图片描述
    可以看到,是没有问题的。


    二、存储Bean对象

    存储Bean分为以下2步或者3步:

    1. 如果是第一次添加,则需要先在spring项目中添加配置文件,如果非第一次,则此步骤省略
    2. 创建一个Bean对象
    3. 在配置文件中将需要保存到spring中的Bean对象进行注册

    1.添加spring配置文件

    第一次使用的时候需要添加配置文件。步骤如下:
    (1) 在 resources 的根⽬录下创建一个xml文件,这里我们起名字要规范一点,这个resource一般保存的是我们的静态文件。
    在这里插入图片描述

    (2)把下面的配置文件复制到里面,Spring 配置⽂件的固定格式为以下内容(以下内容⽆需记忆,只需要保存到⾃⼰可以找到的地⽅就可以了,因为它是固定不变的)

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
    </beans>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述


    2.创建Bean

    这里所谓的创建Bean ,其实就是创建一个 Java 的普通类。只不过权限是由 spring 所持有,千万不要被名字唬到。
    在这里插入图片描述
    然后先写一个方法,等下用来测试:
    在这里插入图片描述


    3.将Bean注册到容器中

    我们需要在配置文件中,将需要保存到 spring中的 bean 对象进行注册。

    在我们刚刚创建的xml文件里面添加下面内容

        <bean id="user" class="com.beans.UserBean"></bean>
    
    • 1

    这里的 id 可以理解为一个别名,我们给刚刚创建的这个UserBean类,起了一个叫“user"的别名
    而这个class则是它的存储路径,我们待会通过这个路径来进行找这个”user“。
    因此,我们这里的user取名要规范,便于一看就知道是那个的别名。(起外号要形象)


    三、获取并使用 Bean 对象

    在这里也可以分为3步:

    1. 得到spring上下文对象
    2. 通过上下文对象提供的方法获取我们需要使用的Bean对象
    3. 使用Bean对象

    1.得到spring上下文对象

    //1.得到上下文对象
            ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
       
    
    • 1
    • 2
    • 3

    这个步骤需要注意的是()里面改的内容需要与我们之前创建xml文件名是一致的。

    在这里插入图片描述


    2.获取指定的Bean对象

    //2.通过上下文对象提供的方法,获取我们自己需要使用的bean对象
            UserBean user = (UserBean) context.getBean("user");//需要强转
          
    
    • 1
    • 2
    • 3

    这里面最后一个括号的内容是我们上面起的别名:

    在这里插入图片描述


    3.使用Bean对象

    //3.调用对象里面的方法
            user.sayHi("aaa");
     
    
    • 1
    • 2
    • 3

    4.整体代码与效果

    public class test {
        public static void main(String[] args) {
            //1.得到上下文对象
            ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
            //2.通过上下文对象提供的方法,获取我们自己需要使用的bean对象
            UserBean user = (UserBean) context.getBean("user");//需要强转
            //3.调用对象里面的方法
            user.sayHi("aaa");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    效果:

    在这里插入图片描述

    这里我们没有new就获取到了一个对象。


    5.获取Bean对象的另一种方法

    除了 ApplicationContext 之外,我们还可以使⽤ BeanFactory 来作为 Spring 的上下⽂。如下:

     public static void main(String[] args) {
    //        //1.得到上下文对象
    //        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
    //        //2.通过上下文对象提供的方法,获取我们自己需要使用的bean对象
    //        UserBean user = (UserBean) context.getBean("user");//需要强转
    //        //3.调用对象里面的方法
    //        user.sayHi("aaa");
    
            //1.使用BeanFactory方法来获取上下文对象
            BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("spring-config.xml"));
            //2.获取Bean
            UserBean userBean = (UserBean) beanFactory.getBean("user");
            //3.使用Bean
            userBean.sayHi("aaa");
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    6.getBean的更多用法

    getBean() ⽅法有很多种重载⽅法,我们也可以使⽤其他⽅式来获取 Bean 对象,如下:

    (1)使用bean name获取bean

    UserBean userBean = (UserBean) beanFactory.getBean("user");
    
    
    • 1
    • 2

    (2)根据bean type 获取bean

    UserBean userBean = (UserBean) beanFactory.getBean("UserBean.class");
    
    • 1

    这种方式写法简单,但容易出问题,当同一个类型被注入到spring中多次的时候,就会报错。如下:

    当我们有多个bean对象的时候:
    在这里插入图片描述
    这里去获取bean对象就会报错,因为spring要求,获取对象是必须是唯一的,而恰恰这里不唯一。

    在这里插入图片描述

    (3)根据bean name 和类型获取bean

    UserBean userBean = beanFactory.getBean("user",UserBean.class);
    
    • 1

    四、经典面试题

    1.ApplicationContext 与 BeanFactory 的区别

    相同点:

    1. 都提供了getBean方法

    不同点:

    1. 从继承关系和功能⽅⾯来说,ApplicationContext属于BeanFactory的子类。BeanFactory 只提供了基础访问Bean的方法,而ApplicationContext除了拥有BeanFactory的所有功能之外,还提供了更的方法实现,比如对国际化的支持、资源访问的支持、以及事件和传播等方面的支持。
    2. 从性能方面来说二者是不同,BeanFactory 是按需加载Bean,因此更轻量,ApplicationContext是饿汉方式,在创建时会将所有的Bean都加载起来,以备以后使用。

    五、总结

    1. 操作容器之前,先要有容器,所以先要得到容器。
      a.创建项目
      b.添加 Spring 框架支持,引入 spring-context 和 spring-beans 依赖
      c.创建一个启动类 和 main方法
    2. 存对象
      a. 创建 Bean(普通类)。
      b. 将 Bean 注册(配置)到 spring-confing.xml 中。
    3. 取对象
      a. 得到 Spring 上下⽂,并读取到 Spring 的配置⽂件。
      b. 获取某⼀个 Bean 对象。
      c. 使⽤ Bean 对象

    在这里插入图片描述


    完!

  • 相关阅读:
    代码随想录 Day26 贪心 01 全集 LeetCode455 分发饼干 LeetCodeT346摆动序列 LeetCdoe T53 最大子数组和
    【Linux从入门到放弃】Linux权限详解
    猫吃什么罐头好?2023质量口碑好的猫罐头推荐!
    VMware Ubuntu虚拟机忘记密码
    MATLAB环境下基于离散小波变换的体外血管图像处理
    07-定位布局
    系列七、栈 & 堆
    PHREEQC建模及典型案例解析与高阶拓展应用【反向“编译”、“玩转”后处理技术、GibbsStudio和PhreePlo方法】
    torch.meshgrid() 函数理解
    批量清理Unity项目Library目录 降低项目空闲占用空间
  • 原文地址:https://blog.csdn.net/weixin_46913665/article/details/125729802