1177 字
3 分钟
Spring 入门

Spring 官方文档

架构#

Spring框架架构

image-20260120034553522

Spring软件架构 Spring应用系统结构.drawio

IOC容器#

控制反转(Inversion of Control)

是一种编程思想,用于给程序降低耦合,所有对象均由IOC容器 创建管理,程序员不需要再new对象了

20160506104006901

创建容器#

主要通过org.springframework.context.ApplicationContext 接口

代表现代Spring IoC容器,容器负责实例化、配置和组装bean

层级关系#

BeanFactory 顶层接口 懒加载
├── ListableBeanFactory
│ └── ApplicationContext
├── HierarchicalBeanFactory
│ └── ApplicationContext
ApplicationContext 核心接口 立即加载
└── ConfigurableApplicationContext
└── AbstractApplicationContext
├── ClassPathXmlApplicationContext xml创建使用
├── FileSystemXmlApplicationContext
└── AnnotationConfigApplicationContext 注解创建使用(主要)

XML创建

// 类路径
ApplicationContext ctx = new ClassPathXmlApplicationContext("文件名.xml");
// 文件路径
ApplicationContext ctx = new FileSystemXmlApplicationContext("文件名.xml");
// 加载多个配置文件
ApplicationContext ctx = new ClassPathXmlApplicationContext("文件1","文件2");

Java注解创建

// java注解配置
ApplicationContext ctx = new AnnotationConfigApplicationContext(配置类名.class);

Bean#

将一个类托管给Spring IOC管理,一个类对应一个bean,IOC管理的就是Bean

创建#

  • 默认单例模式
  • Spring基于构造方法去实例化Bean,调用的是类的无参构造方法
<!--Bean概览-->
<bean
id="唯一标识名" id
name="别名1,别名2" 多个别名
alias="别名" 一个别名
class="com.oddpalmer.dao.UserDaoImpl" 类型
scope="singleton" 实例数量
init-method="init" 生命周期初始化方法
destroy-method="destroy" 生命周期销毁方法
autowire="byType" 自动装配类型
factory-method="getInstance" 工厂方法
factory-bean="...factory.UserDaoFactory" 实例工厂bean
lazy-init="true" 控制bean延迟加载
/>

获取#

/* 创建容器 */
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
/* 从容器中获取Bean实例 */
// 1.通过名称 需要强转
UserDao useDao = (UserDao) ctx.getBean("userDao");
// 2.通过类型 Bean实例需要唯一
UserDao useDao = ctx.getBean(UserDao.class);
// 3.通过名称和类型
UserDao useDao = ctx.getBean("userDao",UserDao.class);
// 4.注解简化注入,无需getBean

生命周期#

1.初始化容器 (启动)
2.创建对象(内存分配)
3.执行构造方法 (这其实是“创建对象”的核心动作)
4.执行属性注入(set操作,依赖注入的核心)
5.执行Bean初始化方法
6.Bean就绪,执行业务操作 (使用阶段)
7.关闭容器
8.执行Bean销毁方法(包括@PreDestroy destroy-method等)

import导入#

不同的类 被 托管在不同的beans中,beansxml配置文件中

  • 一般用于团队开发,将多个 xml文件 合并为1个
  • 使用时,用合并之后的xml文件
applicationContext.xml
<beans>
<import resource="bean1"/>
<import resource="bean2"/>
<import resource="bean2"/>
</beans>
<!-- 最后在ClassPathXmlApplicationContext使用该.xml文件即可-->

官方模板

<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
https://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>

命名空间#

None 没写捏,看到教程用了一遍后续没用了,应该不重要


依赖注入#

依赖注入(Dependency Injection,DI)是一种解耦思想,通过反射实现。

将对象的依赖关系从内部创建改为外部注入。

解决组件间紧耦合问题,通过IoC容器管理依赖,便于替换依赖、单元测试和配置管理。

主要分为两种,构造器注入和setter注入。spring创建bean对象主要通过无参构造方法;如果通过setter注入,就会调用默认的无参构造方法,所以有些依赖可能为空值;如果通过有参构造注入,就不会为空值,找不到参数直接报错

引用类型用 ref、基本类型用 value

假设有Java pojo如下

public class People {
private Cat cat;
private String name;
public People(Cat cat, String name) {
this.cat = cat;
this.name = name;
}
public void setCat(Cat cat) {
this.cat = cat;
}
public void setName(String name) {
this.name = name;
}
}

XML方式#

构造器注入#

<!--按形参顺序-->
<bean id="people" class="com.example.People">
<constructor-arg index="0" ref="cat"/>
<constructor-arg index="1" value="Oddpalmer"/>
</bean>
<!--按形参类型-->
<bean id="people" class="com.example.People">
<constructor-arg type="com.example.Cat" ref="cat"/>
<constructor-arg type="java.lang.String" value="Oddplamer"/>
</bean>
<bean id="people" class="com.example.People">
<constructor-arg name="cat" ref="cat"/>
<constructor-arg name="name" value="Oddpalmer"/>
</bean>

Setter 注入#

propertyname必须与setter方法去掉"set"后的 首字母小写单词匹配

<bean id="beanOne" class="x.y.ThingOne">
<property name="thingTwo" ref="beanTwo"/>
<property name="name" value="example"/>
</bean>
<!--集合框架属于特殊的setter注入-->
<property name="list">
<list><value>a</value></list>
</property>
<property name="set">
<set><value>a</value></set>
</property>
<property name="map">
<map><entry key="k" value="v"/></map>
</property>
<property name="properties">
<props><prop key="k">v</prop></props>
</property>

自动装配#

自动装配(Autowire),容器自动将依赖的 Bean 注入到当前 Bean 中,无需在 XML 中显式配置 <property><constructor-arg>

byName

必须有对应的 setter 方法、精确匹配,不易冲突

<!-- XML配置 -->
<beans>
<!-- 自动装配:根据属性名 userDao 找同名bean -->
<bean id="userService" class="com.example.UserService" autowire="byName"/>
<!-- 注意:bean id 必须与属性名完全一致 -->
<bean id="userDao" class="com.example.UserDao"/>
<bean id="orderDao" class="com.example.OrderDao"/>
</beans>

工作原理

  • Spring 看到 userServiceuserDao 属性
  • 在容器中查找 id=“userDao” 的 Bean
  • 在容器中查找 id=“orderDao” 的 Bean
  • 自动调用 setUserDao()setOrderDao() 并注入

byType

  • 规则:根据属性类型匹配、同类型多个 Bean 会冲突、简洁但需确保类型唯一

constructor

  • 规则:按构造器参数类型自动装配

注意事项

  • 显式配置优先:显式配置会覆盖自动装配
  • 冲突处理byType 需确保类型唯一

流程#

  1. 创建关于XML文件的容器
  2. 配置<Beans/>
  3. 获取bean

注解方式#

组件扫描加载Bean#

哪个类要通过Spring IOC自动创建Bean,就对哪个类扫描

XML配置

<context:component-scan base-package="类名"/>

纯注解

  • @Configuration 标识这是一个Spring配置类,会被Spring容器扫描并处理
  • **@ComponentScan**用于设定扫描路径,此注解只能添加一次,多个数据请用数组格式
@Configuration
@ComponentScan("com.example.dao")
public class AppConfig {
}
@Configuration
@ComponentScan({"com.example.dao","com.example.service"})
public class AppConfig1 {
}

注解声明Bean#

  • **@Component**将1个 Java 类标识为 Spring 容器管理的 Bean,默认id为 类名首字母小写,也可以自己定义
@Component("UserDao")
public class UserDaoImpl implements UserDao{
}
@Component
public class UserServiceImpl implements UserService

配置类#

主应用配置类

  • 替代传统的 applicationContext.xml
  • 作为Spring应用的配置入口
  • 整合各个模块的配置
@Configuration // 标识这是一个Spring配置类,会被Spring容器扫描并处理
@Import({DatabaseConfig.class, SecurityConfig.class}) // 导入其他配置类
@ComponentScan("com.example.service") // 扫描指定包下的@Component、@Service、@Repository等注解
@PropertySource("classpath:app.properties") // 加载属性文件
public class AppConfig {
// 主配置类
@Bean
public GlobalConfig globalConfig() {
return new GlobalConfig();
}
}
@Configuration
public class DatabaseConfig {
@Bean
public DataSource dataSource() {
// 数据库配置
}
}

常用注解#

Bean相关#

@Service@Repository … 都是基于@Component,方便开发人员理解而使用,本质功能无区别

@Component 在普通类上定义的Bean @Service 业务层Bean @Repository 数据访问层Bean @Controller 表现层Bean @RestController REST控制器(包含@Controller和@ResponseBody)

@Bean 在配置类上定义的Bean, Spring 将方法返回值注册为Bean @Scope 定义Bean作用域 @PostConstruct 生命周期 构造之后执行的方法 @PreDestroy 声明周期 容器关闭前执行的方法

配置相关#

@Configuration 设置当前类为配置类

@ComponentScan 组件扫描

@PropertySource 读取配置的属性文件

依赖注入#

@Autowired 默认按类型自动装配(最常用) @Qualifier 按名称指定具体Bean @Value 注入基本数据类型,SpEL表达式

第三方Bean管理#

@Bean 配置类上定义的Bean 将方法返回值注册为Spring Bean

@Import 加载其他配置类

比较#

功能XML配置注解配置
定义beanbean标签 id属性 class属性@Component @Controller @Service @Repository @ComponentScan
设置依赖注入setter、constructor、autowire@Autowired @Qualifier @Value
配置第三方beanbean标签 静态工厂、实例工厂、FactoryBean@Bean
作用范围scope属性@Scope
生命周期标准接口、init-method、destroy-method@PostConstruct @PreDestroy
分享

如果这篇文章对你有帮助,欢迎分享给更多人!

Spring 入门
https://mizuki.mysqil.com/posts/spring入门/
作者
Oddpalmer
发布于
2026-01-22
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时