Java-31 深入浅出 Spring - IoC 基础 启动IoC XML与注解结合的方式 配置改造 applicationContext.xml

ops/2024/12/21 15:05:45/

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

大数据篇正在更新!https://blog.csdn.net/w776341482/category_12713819.html

在这里插入图片描述

目前已经更新到了:

  • MyBatis(已更完)
  • Spring(正在更新…)

在这里插入图片描述

XML与注解结合的方式

需要注意:

  • 实际企业开发中,纯 XML 模式已经很少使用了
  • 引入注解功能,不需要引入额外的 Jar
  • XML+注解结合模式,XML 文件依然存在,所以,Spring IoC 容器仍然是从加载 XML 开始。
  • 哪些 Bean 定义需要写到 XML 中,哪些 Bean 的定义使用注解

简单来说,第三方的 Jar 中的 Bean 定义在 XML 中,自己开发的 Bean 使用注解的方式。

XML中标签与注解的对应

在这里插入图片描述

DI 依赖注入的注解实现方式

推荐使用 Autowired,该注解是 Spring 提供的注解,采取的策略为【按照类型注入】:

java">public class WzkTransferServiceImpl {@Autowiredprivate WzkAccountDao wzkAccountDao;
}

如上代码所示,这样装配回去 Spring 容器中找到类型为 AccountDao 的类,然后将其注入进来。这样会产生一个问题,当一个类型有多个 Bean 的值的时候,会造成无法选择具体注入哪一个的情况,这个时候我们需要配合着使用 Qualifier 注解。
Quailier 会告诉 Spring 用哪个对象来注入:

java">public class WzkTransferServiceImpl {@Autowired@Qualifier(name="jdbcWzkAccountDaoImpl") private WzkAccountDao wzkAccountDao;
}

当然,我们也可以使用 JDK 提供的 Resource 注解,该注解默认按照【byName】自动注入:

java">public class WzkTransferService {@Resource private AccountDao accountDao;@Resource(name="studentDao") private StudentDao studentDao;@Resource(type="TeacherDao") private TeacherDao teacherDao;@Resource(name="manDao",type="ManDao") private ManDao manDao;}

这里需要注意:

  • 如果同时指定了 name 和 type,则从 Spring 上下文中寻找唯一匹配的 Bean进行装配。
  • 如果指定了 name,则从上下文中查找名称(id)匹配的 bena 进行装配,找不到则抛出异常
  • 如果指定了 type,则从上下文找到类似的匹配的唯一bean进行装配,找不到或是找到多个,都会抛出异常
  • 如果既没有指定 name,又没有的指定 type,则自动按照 byName 方式进行装配

我们需要注意的是:
Resource 在 JDK11 中已经移除了,如果要使用的话,需要单独引入 Jar 包:

<dependency><groupId>javax.annotation</groupId><artifactId>javax.annotation-api</artifactId><version>1.3.2</version>
</dependency>

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
"></beans>

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

我们之前是自己写的 beans.xml,我们现在希望借助 Spring 的情况下,一步一步改造我们之前自己手动控制 Bean 的方式。

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>contextConfigLocation</param-name><param-value>classpath:applicationContext.xml</param-value></context-param><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>
</web-app>

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

配置改造

接下来我们将刚才的 纯 XML 的模式的代码,改造成 注解 + XML 的方式,解放出一定的 XML 来。
比如在 纯 XML 模式下,我们写的:

<!-- 配置 Bean --><bean id="wzkTransferService" class="wzk.service.impl.WzkTransferServiceImpl"><constructor-arg name="wzkAccountDao" ref="wzkAccountDao"></constructor-arg></bean>

这个目的是让 Spring 接管我们的 Bean,而此时,我们可以将这一系列的 Bean 配置都移除出去,使用注解的方式来满足我们的 Bean 管理。
此时,我们将 Bean 的 XML 配置移除,并在需要交由 Spring 管理的 Bean 上加入注解、加入DI 的管理。
但是此时,Spring 是不知道哪些对象要处理的,所以我们需要告诉 Spring 哪些需要进行扫描:

<context:annotation-config/>
<context:component-scan base-package="wzk"/>

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

JdbcWzkAccountDaoImpl

这里加入注解和 ID 的管理方式,部分如下:

java">@Component
public class JdbcWzkAccountDaoImpl implements WzkAccountDao {@Autowiredprivate WzkConnectionUtils wzkConnectionUtils;//    public void setWzkConnectionUtils(WzkConnectionUtils wzkConnectionUtils) {
//        this.wzkConnectionUtils = wzkConnectionUtils;
//    }

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

WzkTransferServiceImpl

java">@Component
public class WzkTransferServiceImpl implements WzkTransferService {@Autowiredprivate WzkAccountDao wzkAccountDao;

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

WzkServlet(重要!!!)

这里需要注意,按理来说,我们应该在 WzkServlet 上也写 Compont 和 Autowired 来注入我们的 WzkTransferService,但是实际上呢,Component 和 Servlet 注解是冲突的。

  • WebServlet 是 Servlet 的注解,交由给 Tomcat 管理。
  • Component 是 Spring 的注解,交由给 Spring 管理。

此时要求我们不能在这里使用 Component注解,我们需要用 WebApplicationContext 来进行处理:

java">@WebServlet(name="wzkServlet", urlPatterns = "/wzkServlet")
public class WzkServlet extends HttpServlet {private WzkTransferService wzkTransferService;@Overridepublic void init() throws ServletException {ApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(getServletContext());this.wzkTransferService = context.getBean(WzkTransferService.class);}@Overrideprotected void doGet(javax.servlet.http.HttpServletRequest req, javax.servlet.http.HttpServletResponse resp) throws javax.servlet.ServletException, IOException {try {wzkTransferService.transfer("1", "2", 100);} catch (Exception e) {e.printStackTrace();System.out.println("=== transfer error ====");}resp.setContentType("application/json;charset=utf-8");resp.getWriter().print("=== WzkServlet doGet ===");}}

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

工具类

比如用到的一些工具,我们有依赖关系,所以也交给 Spring 进行管理,这里就不一一写了,大家用到了自己注入即可。

java">@Component
public class WzkConnectionUtils {private final ThreadLocal<Connection> threadLocal = new ThreadLocal<>();

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


http://www.ppmy.cn/ops/143786.html

相关文章

Mongodb 集群搭建

Mongodb 集群搭建 一、简介 mongodb 集群有三种方式&#xff1a;Master slave 主从模式、Replica Set 副本集模式、Sharding 分片集模式 Master slave 主从模式&#xff1a;主节点写入&#xff0c;数据同步到 Slave 节点&#xff0c;Slave 节点提供数据查询&#xff0c;最大…

uniapp入门 01创建项目模版

0安装 hbuilder x 标准版 1.创建模版工程 2.创建官方 案例工程 index.uvuewen 文件解析 <!-- 模版 标签 --> <template><view></view></template><!-- 脚本 --> <script>export default {data() {return {}},onLoad() {},methods:…

【C++】sophus : sim3.hpp 描述了在 3D 空间中的缩放、旋转和平移 (十九)

sim3.hpp 文件定义了与 Sim(3) 群相关的类和操作。Sim(3) 群描述了在 3D 空间中的缩放、旋转和平移。以下是对该文件主要内容的总结&#xff1a; 主要类和命名空间 命名空间 Sophus Sophus 命名空间包含了与 Sim(3) 群相关的所有类和函数定义。 类模板 Sim3Base Sim3Base 是一个…

企业如何通过TDSQL实现高效数据库迁移与性能优化

目录 一. TDSQL概述 二 Oracle到TDSQL迁移 三. MySQL到TDSQL迁移 四. 总结与建议 TDSQL&#xff08;Tencent Distributed SQL&#xff09;是腾讯云推出的分布式数据库服务&#xff0c;提供了高可用、高扩展性的数据存储解决方案&#xff0c;适用于大规模应用场景。TDSQL支持…

《探索QT 5.14.1:功能、特性与应用全解析》

《探索QT 5.14.1&#xff1a;功能、特性与应用全解析》 一、QT 5.14.1&#xff1a;强大的跨平台开发利器二、QT 5.14.1 的核心功能与特性&#xff08;一&#xff09;丰富的控件库&#xff08;二&#xff09;高效的信号槽机制&#xff08;三&#xff09;卓越的性能表现&#xff…

win11 C盘出现感叹号解决方法

出现感叹号&#xff0c;原因是对C盘进行了BitLocker驱动器加密操作。如果想去除感叹号&#xff0c;对C盘进行BitLocker解密即可。 步骤如下&#xff1a; 1.点击Windows搜索框 2.搜索框内输入 系统 3.按下回车&#xff0c;进入系统界面 4.点击隐私和安全性 点击BitLocker驱…

【Graylog】索引别名deflector的异常处理和索引分片数限制解除

索引别名deflector的异常处理 官方推荐处理步骤 Stop all Graylog nodes (OPTIONAL) If you want to keep the already ingested messages, reindex them into the Elasticsearch index with the greatest number, e. g. graylog_23 if you want to fix the deflector graylo…

GPT核心原理

目录 1. GPT1.1 概述1.2 GPT的动机 2. 模型结构3. GPT训练过程3.1 无监督的预训练3.2 有监督的Fine-Tuning3.3 其它任务 4. GPT特点优点缺点 1. GPT 1.1 概述 2018 年 6 月&#xff0c;OpenAI 发表论文介绍了自己的语言模型 GPT&#xff0c;GPT 是“Generative Pre-Training”…