点一下关注吧!!!非常感谢!!持续更新!!!
大数据篇正在更新!https://blog.csdn.net/w776341482/category_12713819.html
目前已经更新到了:
- MyBatis(已更完)
- Spring(正在更新…)
纯注解方式的简介
纯注解方式意味着完全不用 XML 配置文件,而是通过 Java 注解(Annotation)实现 IoC 容器的配置和管理。这种方式自 Spring 3.x 开始推荐使用,更加符合 Java 编码习惯,便于维护和理解。
主要注解介绍
Configuration
标记一个类为 Spring 的配置类,代替 XML 配置文件。
该类会被 IoC 容器当作配置类加载。
ComponentScan
指定 Spring 扫描组件的基础包路径,从而自动注册符合条件的 Bean。
默认扫描当前类所在的包及其子包。
Bean
声明一个普通 Java 对象为 Spring 容器中的 Bean。
类似于 XML 文件中的 标签,适合第三方类或无法直接修改源码的类。
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-scan
- Configuration 表明当前类是一个配置类
配置文件
applicationContext.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:aop="http://www.springframework.org/schema/aop"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttps://www.springframework.org/schema/aop/spring-aop.xsd
"><context:annotation-config/><context:component-scan base-package="wzk"/>
</beans>
现在,我们将移除 annotation-config 和 component-scan ,将这些也通过 Java 的类和注解来实现。
对应的截图如下所示:
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
启动的配置类中,这里通过注解的方式进行扫描。
java">@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;@Beanpublic DataSource createDataSource() {DruidDataSource druidDataSource = new DruidDataSource();druidDataSource.setDriverClassName(driverClassName);druidDataSource.setUrl(url);druidDataSource.setUsername(username);druidDataSource.setPassword(password);return druidDataSource;}}
对应的截图如下所示:
WzkConnectionUtils
这里对于数据库的链接,也交给 Spring 进行管理了。
java">/*** 当前线程SQL 链接器* 通过 ThreadLocal 的方式 对 connection 进行传递* @author wzk* @date 16:43 2024/11/18
**/
@Component
public class WzkConnectionUtils {private final ThreadLocal<Connection> threadLocal = new ThreadLocal<>();@Autowiredprivate DataSource dataSource;public Connection getCurrentConnection() throws SQLException {Connection connection = threadLocal.get();if (null == connection) {connection = dataSource.getConnection();threadLocal.set(connection);}return connection;}
}
对应的截图如下所示:
测试运行
细节就不过多展示了,我这边测试了,程序一切正常。