2.4 Spring 工厂类对比
| 工厂类 | 特点 | 适用场景 |
|---|---|---|
| ApplicationContext(ClassPathXmlApplicationContext) | 加载配置文件时立即创建所有单例对象 | 绝大部分业务场景(非懒加载) |
| BeanFactory(XmlBeanFactory) | 获取对象时才创建(懒加载) | 资源敏感场景(如移动端) |
2.5 Bean 的作用域
通过scope属性控制 Bean 的实例范围:
| 作用域 | 说明 | |
|---|---|---|
| singleton(默认) | 单例,Spring 容器中仅存在一个实例 | Service、DAO、工厂类 |
| prototype | 多例,每次获取创建新实例 | Connection、SqlSession |
| request | Web 环境,存入 request 域 | Web 层单次请求 |
| session | Web 环境,存入 session 域 | 用户会话周期 |
| application | Web 环境,存入 ServletContext 域 | 应用全局 |
2.6 Bean 的生命周期
单例 Bean(scope="singleton")
容器启动 → 构造方法(实例化)→ Set 方法(注入)→ init 方法(初始化)→ 容器关闭 → destroy 方法(销毁)
多例 Bean(scope="prototype")
获取对象 → 构造方法(实例化)→ Set 方法(注入)→ init 方法(初始化)→ JVM 垃圾回收 → destroy 方法(销毁)
三、基于注解的 IOC 配置
注解配置与 XML 配置功能一致,更简洁高效,核心步骤如下:
3.1 环境准备
步骤 1 :引入 Spring Context 依赖(同 XML 配置);步骤 2:配置文件开启注解扫描
XML
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
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
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 扫描指定包下的注解 -->
<context:component-scan base-package="com.hg"></context:component-scan>
</beans>
3.2 核心注解
3.2.1 创建对象的注解(替代<bean>标签)
| 注解 | 作用 | 适用层 |
|---|---|---|
| @Component | 通用注解,将类交给 Spring 管理 | 任意层 |
| @Controller | 语义化 @Component | 表现层(Controller) |
| @Service | 语义化 @Component | 业务层(Service) |
| @Repository | 语义化 @Component | 持久层(DAO) |
| @Scope | 指定作用域,如 @Scope ("prototype") | 任意 Bean |
示例:
java
// DAO层
@Repository // 默认id为userDaoImpl,可指定@Repository("userDao")
public class UserDaoImpl implements UserDao {
@Override
public void addUser(){
System.out.println("insert into tb_user......");
}
}
// Service层
@Service // 默认id为userServiceImpl
public class UserServiceImpl implements UserService {
// 注入依赖
@Autowired // 按类型自动注入
private UserDao userDao;
@Override
public void addUser(){
userDao.addUser();
}
}
3.2.2 注入属性的注解(替代<property>标签)
| 注解 | 作用 |
|---|---|
| @Autowired | 按类型自动注入,可省略 Set 方法 |
| @Resource | 按名称注入(@Resource (name="userDaoImpl")) |
| @Value | 注入基本类型 / String,支持读取配置文件(@Value ("${name}")) |
读取配置文件示例:
java
# config.properties
name=张三
age=18
XML
<!-- 加载配置文件 -->
<context:property-placeholder location="config.properties"/>
java
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Value("${name}")
private String name;
@Value("${age}")
private Integer age;
@Override
public void addUser(){
System.out.println(name + "," + age);
userDao.addUser();
}
}
未完待续~~~