Java-32 深入浅出 Spring - IoC 基础 启动IoC 纯注解方式 SpringConfig web.xml

server/2024/12/23 19:10:35/

点一下关注吧!!!非常感谢!!持续更新!!!

大数据篇正在更新!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;}
}

对应的截图如下所示:
在这里插入图片描述

测试运行

细节就不过多展示了,我这边测试了,程序一切正常。
在这里插入图片描述


http://www.ppmy.cn/server/152561.html

相关文章

【贪心算法】贪心算法六

贪心算法六 1.坏了的计算器2.合并区间3.无重叠区间4.用最少数量的箭引爆气球 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1f603; 1.坏了的计算器 …

网上球鞋竞拍系统|Java|SSM|VUE| 前后端分离

【技术栈】 1⃣️&#xff1a;架构: B/S、MVC 2⃣️&#xff1a;系统环境&#xff1a;Windowsh/Mac 3⃣️&#xff1a;开发环境&#xff1a;IDEA、JDK1.8、Maven、Mysql5.7 4⃣️&#xff1a;技术栈&#xff1a;Java、Mysql、SSM、Mybatis-Plus、VUE、jquery,html 5⃣️数据库可…

C# 趋势图:洞察其发展轨迹与未来走向

一、语言特性演进趋势 &#xff08;一&#xff09;性能提升 即时编译优化&#xff1a; 在当今的软件开发领域中&#xff0c;C# 编译器对于即时编译&#xff08;JIT&#xff09;技术的探索与发展从未停止脚步。随着技术的不断演进&#xff0c;其在代码分析和优化策略方面愈发显…

5G -- 5G网络架构

5G组网场景 从4G到5G的网络演进&#xff1a; 1、UE -> 4G基站 -> 4G核心网 * 部署初中期&#xff0c;利用存量网络&#xff0c;引入5G基站&#xff0c;4G与5G基站并存 2、UE -> (4G基站、5G基站) -> 4G核心网 * 部署中后期&#xff0c;引入5G核心网&am…

Elasticsearch:什么是查询语言?

查询语言定义 查询语言包括数据库查询语言 (database query language - DQL)&#xff0c;是一种用于查询和从数据库检索信息的专用计算机语言。它充当用户和数据库之间的接口&#xff0c;使用户能够管理来自数据库管理系统 (database management system - DBMS) 的数据。 最广…

mybatis 的动态sql 和缓存

动态SQL 可以根据具体的参数条件&#xff0c;来对SQL语句进行动态拼接。 比如在以前的开发中&#xff0c;由于不确定查询参数是否存在&#xff0c;许多人会使用类似于where 1 1 来作为前缀&#xff0c;然后后面用AND 拼接要查询的参数&#xff0c;这样&#xff0c;就算要查询…

windows C#-使用构造函数

实例化类或结构时&#xff0c;将会调用其构造函数。 构造函数与该类或结构具有相同名称&#xff0c;并且通常初始化新对象的数据成员。 在下面的示例中&#xff0c;通过使用简单构造函数定义了一个名为 Taxi 的类。 然后使用 new 运算符对该类进行实例化。 在为新对象分配内存…

数据库的三范式是什么?

第一范式&#xff08;1NF&#xff09; 每列的原子性&#xff0c;表中的每一个字段都是不可分割的&#xff0c;同一列中不能有多个值。第一范式是对关系模式的基本要求&#xff0c;不满足第一范式的数据库不是关系型数据库。 ・不满足第一范式的示例&#xff1a; 学生编号 学生…