Spring 创建和使用

文章目录

  • [创建 Spring 项目](#创建 Spring 项目)
    • [1. 创建一个Maven项目](#1. 创建一个Maven项目)
    • [2. 添加 Spring 框架支持](#2. 添加 Spring 框架支持)
    • [3. 添加启动类](#3. 添加启动类)
  • [存储 Bean 对象](#存储 Bean 对象)
    • [创建一个 Bean](#创建一个 Bean)
    • [将 Bean 注册到容器](#将 Bean 注册到容器)
  • [获取并使用 Bean 对象](#获取并使用 Bean 对象)
    • [创建 Spring 上下文](#创建 Spring 上下文)
    • [获取指定的 Bean 对象](#获取指定的 Bean 对象)
    • [使用 Bean 对象](#使用 Bean 对象)
  • [getBean() 的用法](#getBean() 的用法)
  • 总结

创建 Spring 项目

1. 创建一个Maven项目

2. 添加 Spring 框架支持

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

xml 复制代码
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.8.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>5.2.8.RELEASE</version>
        </dependency>
    </dependencies>

从上述配置中可以看出,添加的框架有 spring-context:spring 上下⽂,还有 spring-beans:管理对象的模块。

3. 添加启动类

在创建好的项目的java文件夹下创建一个启动类,包含main方法即可:

java 复制代码
public class App {
    public static void main(String[] args) {
        
    }
}

存储 Bean 对象

创建一个 Bean

Bean就是Java中一个普通的对象

java 复制代码
public class User {
    public String sayHello(String name) {
        return name + "Hello World!";
    }
}

将 Bean 注册到容器

  1. 在resources根目录下创建 Spring 配置文件 spring-config.xml,如下:会自动添加配置文件的固定格式
  2. 将 User 对象注册到 Spring 中就可以了
  • id是标识,取对象时使用
  • class是存储bean的位置(包名+类名)
java 复制代码
	<beans>
        <bean id="user" class="com.fyd.User"></bean>
    </beans>

获取并使用 Bean 对象

创建 Spring 上下文

因为对象都交给 Spring 管理了,所以获取对象要从 Spring 中获取,那么就得先得到 Spring 的上下文。

  1. 在启动类中使用ApplicationContext得到 Spring 上下文对象
java 复制代码
ApplicationContext context =
                new ClassPathXmlApplicationContext("spring-config.xml");
  1. 使⽤ BeanFactory 来作为 Spring 的上下⽂
java 复制代码
BeanFactory context =
                new ClassPathXmlApplicationContext("spring-config.xml");
  • 这里的配置文件名一定要和之前创建的配置文件名要一样,如果名称错了,idea不会报错,但程序会报错
  • ApplicationContext 和 BeanFactory 效果是⼀样的,ApplicationContext 属于 BeanFactory 的⼦类
  • ClassPathXmlApplicationContext 属于 ApplicationContext 的⼦类,拥有 ApplicationContext 的所有功能,是通过 xml 的配置来获取所有的 Bean 容器的。

ApplicationContext 与 BeanFactory

  • 继承关系和功能⽅⾯来说:Spring 容器有两个顶级的接⼝:BeanFactory 和 ApplicationContext。其中 BeanFactory 提供了基础的访问容器的能⼒,⽽ ApplicationContext 属于 BeanFactory 的⼦类,它除了继承了 BeanFactory 的所有功能之外,它还拥有独特的特性,还添加了对国际化⽀持、资源访问⽀持、以及事件传播等⽅⾯的⽀持。
  • 从性能⽅⾯来说:ApplicationContext 是⼀次性加载并初始化所有的 Bean 对象,⽽
    BeanFactory 是需要那个才去加载那个,因此更加轻量。

获取指定的 Bean 对象

从 spring 中获取 bean 对象

java 复制代码
User user = (User) context.getBean("user");

使用 Bean 对象

java 复制代码
System.out.println(user.sayHello("Spring"));

getBean() 的用法

getBean() 方法是 Spring 框架中的一个重要方法,用于从 Spring 容器(应用程序上下文)中获取指定名称或类型的 bean 实例。它可以通过 bean 的名称或类型来获取对应的 bean 对象。下面是 getBean() 方法的用法示例:

  1. 通过名称获取 Bean:
java 复制代码
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

// 通过 bean 的名称获取 bean 实例
HelloWorld helloWorld = (HelloWorld) context.getBean("helloWorldBean");

在这个示例中,假设存在一个名为 "helloWorldBean" 的 bean 定义,通过指定名称来获取相应的 bean 实例。

  1. 通过类型获取 Bean:
java 复制代码
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

// 通过 bean 的类型获取 bean 实例
HelloWorld helloWorld = context.getBean(HelloWorld.class);

在这个示例中,假设 HelloWorld 类是一个在 Spring 上下文中定义的 bean,通过指定类型来获取相应的 bean 实例。

注意事项:

  • 如果根据给定名称或类型找不到 bean,getBean() 方法将抛出 NoSuchBeanDefinitionException 异常。
  • 如果存在多个符合条件的 bean(例如,存在多个同一类型的 bean),在没有进一步指定的情况下,getBean() 方法将抛出 NoUniqueBeanDefinitionException 异常。

除了基本用法,getBean() 方法还有其他变体,可以传递参数、指定作用域等。具体的用法取决于你的项目需求和 Spring 配置。在 Spring Boot 中,通常会使用注解来自动装配 bean,而不必显式调用 getBean() 方法。

另外,在现代的 Spring 版本中,建议尽量避免直接使用 getBean() 方法,而是使用自动装配(Autowired)等更便捷的方式来获取 bean。这样可以更好地利用 Spring 框架的依赖注入机制。

总结

  • 操作容器之前,先要有容器,所以先要得到容器。
  • 存对象
    • 创建 Bean(普通类)。
    • 将 Bean 注册(配置)到 spring-confing.xml 中。
  • 取对象
    • 得到 Spring 上下⽂,并读取到 Spring 的配置⽂件。
    • 获取某⼀个 Bean 对象。
    • 使⽤ Bean 对象。
相关推荐
BUG指挥官1 天前
Sa-Token和Spring Security对比
java·后端·spring
geminigoth1 天前
Spring AI Alibaba 入门开发一(备份)
java·人工智能·spring
xbgRS1 天前
spring整合mybaits
java·spring·mybatis
ruleslol1 天前
静态依赖注入 VS 动态依赖查询
spring
墨雨晨曦881 天前
Spring AI总结
java·人工智能·spring
用户3126874877201 天前
Spring Boot 异常处理到底怎么玩的?从 DispatcherServlet 到全局兜底的全链路拆解
spring
不才不才不不才1 天前
Spring 源码系列(17): HandlerMapping 与 HandlerAdapter 两大体系
java·后端·spring
(轻舟已过万重山)1 天前
第40章 Spring AI 实战:企业级 AI 应用架构
人工智能·spring·架构
堕落年代2 天前
Ollama CPU 推理大提示词优化实测报告(细致化数据版)
java·后端·spring
cfm_29142 天前
基于OAuth2.0实现微服务SSO单点登录
后端·spring·微服务·架构