Spring项目的创建以及存取和使用Bean


Spring项目的创建

  1. 先创建一个maven 项目

    在这里插入图片描述

  2. 添加spring 框架支持(spring- context / spring -beans)
    在pom.xml内:

    <dependencies>
        <!--注入spring-context -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.3.RELEASE</version>
        </dependency>
    <!--        注入spring-beans -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>5.2.3.RELEASE</version>
        </dependency>
    
    </dependencies>
    
  3. 创建一个启动项并添加main

    请添加图片描述


将对象添加到spring-config.xml的bean中.

  1. 添加spring 配置文件 (第一次添加bean的时需要进行的操作)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Lsf7NEpd-1682313373435)(assets/image-20230421163209892.png)]

    PS: spring配置文件就是要放在resources 目录中, 专门用来存放静态配置文件的文件夹.

    <?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>
    
  2. 创建Bean对象

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lKzzKQ1C-1682313373436)(assets/image-20230421163745362.png)]

  3. 将Bean对象添加到config文件中

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GIWPmKLt-1682313373436)(assets/image-20230421163508456.png)]


从Spring中取出Bean对象,并使用

第一种方法 : 上下文对象

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;

/**
 * @Date 2023/4/21 12:21
 */
public class App {
    public static void main(String[] args) {
//        System.out.println("你好 Spring!");
//        // new 一个 spring 上下文对象 指向配置文件spring-config.xml
        ApplicationContext context =
                new ClassPathXmlApplicationContext("spring-config.xml");
//        // 从上下文对象中获取bean  s就是Id名 , 然后传出来的是Object对象, 因此要向下转型;
//        User user = (User) context.getBean("user");
        User user = context.getBean("user",User.class);
        user.sayHi("张三");
    }
}

  1. 先获得spring 上下文对象

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rRXU3RE3-1682313373437)(assets/image-20230421164055392.png)]

  2. 再通过上下文对象提供的方法获取到咱们自己需要使用的Bean对象

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MyY0riuo-1682313373437)(assets/image-20230421164104610.png)]

  3. 使用bean对象

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZEHwzLf3-1682313373437)(assets/image-20230421164116694.png)]

    在这里插入图片描述

第二种方法:Bean工厂:

public static void main(String[] args) {
    // 1. 创建工厂
    BeanFactory factory =
            new XmlBeanFactory(new ClassPathResource("spring-config.xml"));
    // 2. 获取bean
    User user = (User) factory.getBean("user");
    // 3. 使用Bean
    user.sayHi("张三");
}
  1. 获取bean工厂对象

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3X8aLGE6-1682313373438)(assets/image-20230421164733990.png)]

  2. 获取Bean

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NPXNydPQ-1682313373439)(assets/image-20230421164739186.png)]

  3. 使用Bean

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yocqQaVg-1682313373439)(assets/image-20230421164116694.png)]

在这里插入图片描述

ApplicationContext 和 BeanFactory的区别:

相同点:

​ 都可以实现从容器中获取Bean, 都提供了getBean

不同点:

  • ApplicationContext 是 BeanFactory的子类

    BeanFactory只提供了基础访问Bean的方法,而ApplicationContext除了拥有BeanFactory的所用功能之外, 还提供了更多的方法实现, 比如对国际化的支持,资源访问的支持, 以及事件和传播等方面的支持.

  • 从性能方面来说 Beanfactory 是按需加载Bean (懒加载) , AppiactionContext 是饿汉方式, 在创建时会将所有的Bean 都加载起来, 以备以后使用,从而提升了效率, 但是启动时增加了系统资源

    如何证明这一观点?

    提供两个类,都存储进Spring内部:

    查看 创建 ApplicationContext 和 BeanFactory 会不会创造实例对象.

Article类:
在这里插入图片描述

User类:
在这里插入图片描述

只创建上下文对象查看类是否被初始化了
在这里插入图片描述

运行结果如下:

在这里插入图片描述

可以看到, 取出Bean对象的情况下, 已经创建好了,构造了所有的Bean实例对象

而BeanFactory结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9881QZuw-1682313373440)(assets/image-20230421165735452.png)]

并没有创建一个实例对象

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5D3Zo054-1682313373440)(assets/image-20230421165740216-1682067461653-1.png)]


getBean更多用法:

  1. 使用 bean name 来获取 bean

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wP2gh0O9-1682313373442)(assets/image-20230421165950407.png)]

  2. 根据 bean type 来获取bean

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bZThlln6-1682313373442)(assets/image-20230421170158204.png)]

    这样其实是 有一个致命缺陷 : 就是当一个类 id名有多个的时候, 程序会报错:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6vlHJYxY-1682313373443)(assets/image-20230421170253966.png)]

    这里给user类 添加了两个Bean 的id,此时再去获取对象会报错

    查看控制台:

请添加图片描述

就是因为通过User.class 找到了两个不同id的Bean对象

  1. 根据bean name 和 类型 获取 bean

在这里插入图片描述

​ 此时就不会再报错了:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OlVNq8P9-1682313373444)(assets/image-20230421170958491.png)]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值