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 对象。
相关推荐
hello_ejb334 分钟前
聊聊Spring AI的MilvusVectorStore
java·人工智能·spring
兰亭序咖啡1 小时前
学透Spring Boot — 010. 单元测试和Spring Test
spring boot·spring·单元测试
圈圈编码2 小时前
WebSocket
java·网络·spring boot·websocket·网络协议·spring
szuaudi2 小时前
SpringMVC实现text/event-stream(SSE)
java·spring
movie__movie2 小时前
Spring AI MCP 客户端实战:轻松连接高德地图等工具
数据库·人工智能·spring
阿杜杜不是阿木木2 小时前
使用ollama部署本地大模型(没有GPU也可以),实现IDEA和VS Code的git commit自动生成
linux·git·vscode·ai·intellij-idea·ollama
DKPT3 小时前
Eclipse,MyEclipse,IDEA,Vscode这些编译器和JDK的相爱相杀
java·eclipse·编辑器·intellij-idea·myeclipse
非ban必选1 天前
spring-ai-alibaba第七章阿里dashscope集成RedisChatMemory实现对话记忆
java·后端·spring
A旧城以西1 天前
数据结构(JAVA)单向,双向链表
java·开发语言·数据结构·学习·链表·intellij-idea·idea
hello_ejb31 天前
聊聊Spring AI的RetrievalAugmentationAdvisor
人工智能·spring·restful