(3)第一个spring程序

创建一个简单的"Hello World"服务,通过 Spring 容器管理 Bean,并调用其方法。


🧱 技术栈说明

  • Java 8 或以上
  • Maven(构建工具)
  • Spring Framework(核心容器,不涉及 Spring Boot)
  • 使用 注解驱动(Annotation-based)配置,而非 XML

📁 项目结构预览

复制代码
spring-hello-demo/
├── pom.xml
└── src
    └── main
        └── java
            └── com.example.demo
                ├── HelloService.java
                └── Application.java

第一步:创建 Maven 项目并配置 pom.xml

在你的 IDE(如 IntelliJ IDEA 或 Eclipse)中新建一个 Maven 项目,然后编辑 pom.xml

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>  
<project xmlns="http://maven.apache.org/POM/4.0.0"  
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  
    <modelVersion>4.0.0</modelVersion>  
  
    <groupId>com.zhanghan</groupId>  
    <artifactId>spring-01</artifactId>  
    <version>1.0-SNAPSHOT</version>  
    <properties>        <maven.compiler.source>17</maven.compiler.source>  
        <maven.compiler.target>17</maven.compiler.target>  
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  
    </properties>    <dependencies>        <!-- Spring Context(包含核心容器、注解支持等) -->  
        <dependency>  
            <groupId>org.springframework</groupId>  
            <artifactId>spring-context</artifactId>  
            <version>6.1.10</version> <!-- 适配 JDK 17+;若用 JDK 8~11 可选 5.3.x -->        </dependency>  
        <!-- juit 依赖引入 -->  
        <dependency>  
            <groupId>org.junit.jupiter</groupId>  
            <artifactId>junit-jupiter</artifactId>  
            <version>5.10.0</version>  
        </dependency>    </dependencies></project>

💡 如果你用的是 JDK 8~11 ,建议把 Spring 版本换成 <version>5.3.34</version>,兼容性更好。


第二步:编写spring.xml配置类

xml 复制代码
<?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">  
<!--这是spring的配置文件-->  
<!--为什么是spring的?而不是mybais的?    -->  
<!-- 根元素是 <beans> ✓使用了 Spring 的命名空间 ✓包含 <bean> 配置标签 ✓   --><!--   IDEA提供了模板可以直接创建 -->  
<!-- 这个文件名不一定叫spring.xml,可以是其他名字   -->  
<!-- 最好放在类路径resources下,相当于放到了类的根路径,下方便移植   -->  
<!-- 配置bean,这样spring可以帮助我们管理对象   -->  
<!--   bean的两个重要属性 id代表对象的id,class代表对象所属的类,class里要写全类名 -->  
    <bean id="user" class="com.zhanghan.springbean.User">  
</bean>  
</beans>

最好放在类路径resources下,相当于放到了类的根路径,下方便移植


第三步:编写测试类 FirstSpringTest.java

java 复制代码
package com.zhanghan.springbean;  
  
import org.junit.jupiter.api.Test;  
import org.springframework.context.ApplicationContext;  
import org.springframework.context.support.ClassPathXmlApplicationContext;  
  
public class FirstSpringTest {  
    @Test  
    public void test1() {  
        // 1. 获取spring容器对象  
        //ApplicationContext翻译过来为应用上下文,其实就是一个spring容器,里面存放着spring配置文件中的bean  
        //它是一个接口,有很多实现类,这里用的是ClassPathXmlApplicationContext,专门用来从类路径中加载spring配置文件  
        ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");  
        // 2. 获取bean对象  
        User user = (User) context.getBean("user");  
        System.out.println(user);  
    }  
}

✅ 运行结果

运行 Application.main(),控制台输出:

复制代码
已连接到地址为 ''127.0.0.1:60386',传输: '套接字'' 的目标虚拟机
com.zhanghan.springbean.User@291a7e3c
已与地址为 ''127.0.0.1:60386',传输: '套接字'' 的目标虚拟机断开连接

🎉 恭喜!你已经成功运行了第一个 Spring 程序!


🔍 细节刨析(进阶思考)

bean的id可以重复吗?

不可以
怎么解决?

底层到底怎么创建对象?

实际上默认spring通过反射调用类的无参数构造来实例化对象

复制代码
前面在bean标签中我们已经传递过class属性,它底层用class.forName()实现

如是在类中写一个有参构造,则运行时会报错,这提醒我们,要时刻注意写无参构造方法

它把创建好的对象存在什么样的一个数据结构中呢?

复制代码
Map<Stirng,Objectt>
key(id)    value(bean)

所以bean标签中的id存的是key,class存的是value,value只不过是类名的实例化对象

sping配置文件名有要求吗?

没有

sping配置文件可以有多个吗?

可以,ClassPathXmlApplicationContext()的参数可以传递多个

如果sping配置文件在resource目录的一个包下,ClassPathXmlApplicationContext()里的参数怎么写?

以resource目录为根目录往下写比如"xml/beans.xml"

sping配置文件中的类必须是自定义的吗?

不是,只要有无参构造方法即可

getBean()方法的传进去的id不存在会发生什么?

会直接报错,而不是返回一个null

getBean()方法获取的Object转换成原来类的方法

  • 直接强转()
  • 在方法中多传递一个class,指定返回的类

ClassPathXmlApplicationContext是从类路径中加载配置文件,如果没有在类路径当中,又应该如何加载配置文件呢?

没有在类路径中的话,需要使用FileSystemXmlApplicationContext类进行加载配置文件。

这种方式较少用。一般都是将配置文件放到类路径当中,这样可移植性更强。

ApplicationContext的超级父接口BeanFactory。

  • ApplicationContext接口的超级父接口是:BeanFactory(翻译为Bean工厂,就是能够生产Bean对象的一个工厂对象。)
  • BeanFactory是IoC容器的顶级接口。
  • Spring的IoC容器底层实际上使用了:工厂模式。
  • Spring底层的IoC是怎么实现的?XML解析+工厂模式+反射机制

!NOTE\] 注意: 不是在调用getBean(方法的时候创建对象,执行以下代码的时候,就会实例化对象。 new ClassPathXmLApplicationContext("spring6.xm")


相关推荐
IT_陈寒2 分钟前
SpringBoot实战:3个隐藏技巧让你的应用性能飙升50%
前端·人工智能·后端
彭于晏Yan3 分钟前
MQTT消息服务
spring boot·后端·中间件
indexsunny15 分钟前
互联网大厂Java面试实战:从Spring Boot到微服务架构的深度解析
java·spring boot·spring cloud·kafka·prometheus·security·microservices
SuniaWang17 分钟前
《Spring AI + 大模型全栈实战》学习手册系列 ·专题三:《Embedding 模型选型指南:从 MMTEB 排名到实际应用》
人工智能·学习·spring
程序员Sunday31 分钟前
Claude Code 生态爆发:5个必知的新工具
前端·人工智能·后端
ChoSeitaku42 分钟前
NO.2|proto3语法|消息类型|通讯录|文件读取|enum类型
java·服务器·前端
weixin_387534221 小时前
Ownership - Rust Hardcore Head to Toe
开发语言·后端·算法·rust
前端付豪1 小时前
实现一个用户可以有多个会话
前端·后端·llm
庞轩px1 小时前
MinorGC的完整流程与复制算法深度解析
java·jvm·算法·性能优化
zhouping@1 小时前
JAVA学习笔记day06
java·笔记·学习