纯注解方式的简介
纯注解方式意味着完全不用 XML 配置文件,而是通过 Java 注解(Annotation)实现 IoC 容器的配置和管理。这种方式自 Spring 3.x 开始推荐使用,更加符合 Java 编码习惯,便于维护和理解。
主要注解介绍
Configuration
标记一个类为 Spring 的配置类,代替 XML 配置文件。该类会被 IoC 容器当作配置类加载。
ComponentScan
指定 Spring 扫描组件的基础包路径,从而自动注册符合条件的 Bean。默认扫描当前类所在的包及其子包。
Bean
声明一个普通 Java 对象为 Spring 容器中的 Bean。类似于 XML 文件中的 <bean> 标签,适合第三方类或无法直接修改源码的类。
Component、Service、Repository、Controller
这些注解用于将类注册为 Spring 容器中的 Bean,分别适用于不同层的组件:
- Component:通用组件注解
- Service:业务逻辑层的组件注解
- Repository:持久层的组件注解
- Controller:控制器层的组件注解,处理 Web 请求
Autowired
- 自动注入依赖对象,按照类型(byType)注入
- 可用于构造器、字段、Setter 方法等
Qualifier
- 用于解决依赖注入中的 Bean 名称冲突问题
- 与 Autowired 一起使用,指定具体的 Bean 名称
Primary
当多个候选 Bean 存在时,优先选择被标记为 Primary 的 Bean。
Scope
指定 Bean 的作用域,常见的有:
- singleton(默认值):容器中只创建一个实例
- prototype:每次请求都会创建一个新实例
- request:每个 HTTP 请求都会创建一个实例(Web 应用)
- session:每个 HTTP 会话会创建一个实例(Web 应用)
优点
- 无需 XML 配置:配置更简洁,符合 Java 代码风格
- 类型安全:避免了 XML 的字符串配置方式,提升代码安全性
- IDE 支持更好:重构或搜索时更易操作
- 便于测试:通过注解可轻松创建 Mock 组件进行单元测试
注意事项
- 如果没有启用组件扫描(ComponentScan),则需要手动注册所有 Bean
- 注解需要依赖 Spring 上下文扫描和解析,确保包路径配置正确
- 多个候选 Bean 可能会导致注入冲突,需要配合 Primary 或 Qualifier 解决
纯注解方式实现
改造 XML + 注解的模式,将 XML 中遗留的内容全部迁出,最终移除 XML。
对应的注解:
ComponentScan替代 XML 中的context:component-scanConfiguration表明当前类是一个配置类
配置文件
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<context-param>
<param-name>contextClass</param-name>
<!-- 注解方式 -->
<param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
</context-param>
<context-param>
<param-name>contextConfigLocation</param-name>
<!-- 配置类 -->
<param-value>wzk.SpringConfig</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
jdbc.properties
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://172.16.1.130:3306/wzk-mybatis
jdbc.username=hive
jdbc.password=hive@wzk.icu
SpringConfig 配置类
启动的配置类中,通过注解的方式进行扫描:
@ComponentScan({"wzk"})
@Configuration
@PropertySource({"classpath:jdbc.properties"})
public class SpringConfig {
@Value("${jdbc.driver}")
private String driverClassName;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
@Bean
public DataSource createDataSource() {
DruidDataSource druidDataSource = new DruidDataSource();
druidDataSource.setDriverClassName(driverClassName);
druidDataSource.setUrl(url);
druidDataSource.setUsername(username);
druidDataSource.setPassword(password);
return druidDataSource;
}
}
WzkConnectionUtils 工具类
对于数据库的链接,也交给 Spring 进行管理:
/**
* 当前线程SQL 链接器
* 通过 ThreadLocal 的方式对 connection 进行传递
* @author wzk
* @date 16:43 2024/11/18
**/
@Component
public class WzkConnectionUtils {
private final ThreadLocal<Connection> threadLocal = new ThreadLocal<>();
@Autowired
private DataSource dataSource;
public Connection getCurrentConnection() throws SQLException {
Connection connection = threadLocal.get();
if (null == connection) {
connection = dataSource.getConnection();
threadLocal.set(connection);
}
return connection;
}
}
测试运行
程序测试运行一切正常。