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

news/2024/12/23 3:19:58 标签: java, spring, springboot, mybatis, 大数据

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

大数据篇正在更新!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 {
    @Autowired
    private 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/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
        https://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 {

    @Autowired
    private WzkConnectionUtils wzkConnectionUtils;

//    public void setWzkConnectionUtils(WzkConnectionUtils wzkConnectionUtils) {
//        this.wzkConnectionUtils = wzkConnectionUtils;
//    }

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

WzkTransferServiceImpl

java">@Component
public class WzkTransferServiceImpl implements WzkTransferService {

    @Autowired
    private 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;

    @Override
    public void init() throws ServletException {
        ApplicationContext context = WebApplicationContextUtils
                .getWebApplicationContext(getServletContext());
        this.wzkTransferService = context.getBean(WzkTransferService.class);

    }

    @Override
    protected 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.niftyadmin.cn/n/5796266.html

相关文章

[react] <NavLink>自带激活属性

NavLink v6.28.0 | React Router 点谁谁就带上类名 当然类名也是可以自定义 <NavLinkto{item.link}className{({ isActive }) > (isActive ? 测试 : )}>{item.title}</NavLink> 有什么用?他会监听你的路由,刷新的话也会带上激活效果

C++进阶-1-单继承、多继承、虚继承

C单继承详解 1. 基础概念 继承是面向对象编程中的一个核心概念&#xff0c;允许一个类&#xff08;子类或派生类&#xff09;继承另一个类&#xff08;父类或基类&#xff09;的属性和方法。单继承意味着一个类只能直接继承一个父类。这种简单的结构在许多情况下是足够的&…

数据结构_赫夫曼树(基于例题)

赫夫曼树的构建与编码 哈夫曼树类 属性有权值&#xff0c;父母值&#xff0c;左孩子值和右孩子值&#xff0c;实现的方法有构造哈夫曼树和哈夫曼编码 class HuNode { public:int weight, parent, lch, rch;void create_Tree(HuNode* HT, int n);void create_Code(HuNode* HT…

linux作 samba 服务端,linux windows文件互传,免账号密码

一 ubuntu 安装 sudo apt install samba二 修改samba 配置文件 1 路径 ls -l /etc/samba/smb.conf2 修改文件 a&#xff1a;配置成 匿名用户&#xff0c;无需输入账号 b&#xff1a;注意配置可读写且文件可创建可删除 [global] workgroup SAMBA security user passdb back…

初识面向对象晨考day09

1.类和对象什么关系 类是对象的抽象 对象是类的具体 2.什么是属性和方法 一类事物共有的特征&#xff0c;使用属性描述 一类事物共有的行为&#xff0c;使用方法描述 3.普通方法的定义格式 public 返回值类型 方法名(参数列表){} 4.什么是形参&#xff0c;什么是实参 形参是方法…

解锁未来:深入探索去中心化应用程序(DApps)的潜力与挑战

引言 近年来&#xff0c;随着区块链技术的迅猛发展&#xff0c;去中心化应用程序&#xff08;DApps&#xff09;逐渐成为业界关注的焦点。那么&#xff0c;什么是DApps&#xff1f;它们如何工作&#xff1f;又能为我们的生活和工作带来哪些影响和改变&#xff1f;本文将深入探…

完全二叉树的权值(蓝桥杯2019年试题G)

给定一棵包含N个节点的完全二叉树&#xff0c;树上的每个节点都有一个权值&#xff0c;按从上到小、从左到右的顺序依次是A1、A2……An,&#xff08;1&#xff0c;2&#xff0c;n为下标。&#xff09;如下图所示。 现在&#xff0c;小明要把相同深度的节点的权值加到一起&#…

详细介绍如何使用rapidjson读取json文件

本文主要详细介绍如何使用rapidjson库来实现.json文件的读取&#xff0c;分为相关基础介绍、结合简单示例进行基础介绍、结合复杂示例进行详细的函数实现介绍等三部分。 一、相关基础 1、Json文件中的{} 和 [] 在 JSON 文件中&#xff0c;{} 和 [] 分别表示不同的数据结构&…