19.基于XML的自动装配

news2024/11/27 11:54:31

基于XML的自动装配

自动装配:

根据指定的策略,在IOC容器中匹配某一个bean,自动为指定的bean中所依赖的类类型或接口类型属性赋值

使用bean标签的autowire属性设置自动装配效果(默认为no和defalse不进行装配——bean中的属性不会自动匹配某个bean为属性赋值)

  • byType:根据类型匹配IOC容器中的某个兼容类型的bean,为属性自动赋值
  • byName:将自动装配的属性的属性名作为bean的id在IOC容器中匹配相对应的bean进行赋值

配置场景

控制层

UserController.java

package com.atguigu.threeLayer.controller;

import com.atguigu.threeLayer.service.UserService;

public class UserController {
    //在controller里面创建service对象,再通过service中创建dao类并调用其中的方法
    //之前的硬编码方式就是通过:private UserService userService = new UserServiceImpl()
    //这样写死的方式不利于更新维护,也不利于添加新的功能(扩展新的实现类)
    //现在只需要设置好get和set方法就可以以bean的方式将UserController交给IOC容器进行管理,通过依赖注入的方式进行赋值
    private UserService userService;

    public UserService getUserService() {
        return userService;
    }

    public void setUserService(UserService userService) {
        this.userService = userService;
    }

    //场景模拟:通过调用userService中的saveUser()方法保存用户信息
    public void saveUser(){
        userService.saveUser();
    }
}

业务层

UserService.java

package com.atguigu.threeLayer.service;

public interface UserService {
    /**
     * 保存用户信息
     */
    void saveUser();
}

UserServiceImpl.java

package com.atguigu.threeLayer.service.impl;

import com.atguigu.threeLayer.dao.UserDao;
import com.atguigu.threeLayer.service.UserService;

public class UserServiceImpl implements UserService {

    private UserDao userDao;

    public UserDao getUserDao() {
        return userDao;
    }

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    //userService通过调用userDao中的方法实现数据库的保存操作
    @Override
    public void saveUser() {
        userDao.saveUser();
    }
}

数据层

UserDao.java

package com.atguigu.threeLayer.dao;

public interface UserDao {
    /**
     * 实现数据库的保存操作
     */
    void saveUser();
}

UserDaoImpl.java

package com.atguigu.threeLayer.service.impl;

import com.atguigu.threeLayer.dao.UserDao;
import com.atguigu.threeLayer.service.UserService;

public class UserServiceImpl implements UserService {

    private UserDao userDao;

    public UserDao getUserDao() {
        return userDao;
    }

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    //userService通过调用userDao中的方法实现数据库的保存操作
    @Override
    public void saveUser() {
        userDao.saveUser();
    }
}

文件一览

IOC容器进行管理

创建spring-autowire-xml.xml

    <!--通过XML的方式自动装配-->

    <!--将前面的bean交给IOC容器进行管理-->
    <bean id="UserController" class="com.atguigu.threeLayer.controller.UserController">
        <!--手动配置关系-->
        <property name="userService" ref="UserServiceImpl"></property>
    </bean>

    <bean id="UserServiceImpl" class="com.atguigu.threeLayer.service.impl.UserServiceImpl">
        <!--手动配置关系-->
        <property name="userDao" ref="UserDaoImpl"></property>
    </bean>
    
    <bean id="UserDaoImpl" class="com.atguigu.threeLayer.dao.impl.UserDaoImpl">

    </bean>

进行测试

创建AutowireTest.java

    @Test
    public void testAutowireByXML(){
        ApplicationContext ioc = new ClassPathXmlApplicationContext("spring-autowire-xml.xml");
        UserController userController = ioc.getBean(UserController.class);
        userController.saveUser();
    }
//运行结果:保存成功

byType自动装配

  • 自动装配方式:byType
    • byType:根据类型匹配IOC容器中的某个兼容类型的bean,为属性自动赋值

若在IOC中,没有任何一个兼容类型的bean能够为属性赋值,则该属性不装配,即值为默认值 null

若在IOC中,有多个兼容类型的bean能够为属性赋值,则抛出异常 NoUniqueBeanDefinitionException

spring-autowire-xml.xml

	<!--通过byType方式自动赋值:property中属性的类型与IOC容器中的某个bean相匹配-->
    <bean id="UserController" class="com.atguigu.threeLayer.controller.UserController" autowire="byType">
    </bean>

    <bean id="UserServiceImpl" class="com.atguigu.threeLayer.service.impl.UserServiceImpl" autowire="byType">
    </bean>

	<bean id="UserDaoImpl" class="com.atguigu.threeLayer.dao.impl.UserDaoImpl">

    </bean>

byName自动装配

  • 自动装配方式:byName
    • byName:将自动装配的属性的属性名作为bean的id在IOC容器中匹配相对应的bean进行赋值

只有当类型匹配的bean有多个时,此时可以使用byName实现自动专配(这种情况很少见)

spring-autowire-xml.xml

    <!--通过byName方式自动赋值:property中属性的名称与IOC容器中的某个bean的id匹配-->
    <bean id="UserController" class="com.atguigu.threeLayer.controller.UserController" autowire="byName">
    </bean>

    <bean id="userService" class="com.atguigu.threeLayer.service.impl.UserServiceImpl" autowire="byName">
    </bean>
    
    <bean id="userDao" class="com.atguigu.threeLayer.dao.impl.UserDaoImpl">

    </bean>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/759816.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Nodejs的字节操作(Buffer)

Hi I’m Shendi Nodejs的字节操作&#xff08;Buffer&#xff09; 字节操作是一个编程语言中必不可少的&#xff0c;而在NodeJs中也可以很方便的进行字节操作。 Buffer类 在 js 中没有二进制数据类型&#xff0c;但在一些情况下必须使用到二进制数据类型&#xff0c;比如网络通…

ModaHub魔搭社区:AI原生云向量数据库Zilliz Cloud与 OpenAI 集成搭建相似性搜索系统

目录 准备工作 检索图书 本文将讨论如何使用 OpenAI 的 Embedding API 与 Zilliz Cloud 搭建相似性搜索系统。 在本篇中你将看到如何使用 OpenAI 的 Embedding API 和 Zilliz Cloud 完成图书检索。当前,很多的图书检索方案,包括公共图书馆里使用的那些方案,都是使用关键词…

简单认识MySQL数据库事务

文章目录 一、MySQL事务的概念1、简介2、事务的ACID特点1.原子性&#xff08;Atomicity&#xff09;2.一致性&#xff08;Consistency&#xff09;3.隔离性&#xff08;lsolation&#xff09;4.持久性&#xff08;Durability) 3、并发访问表的一致性问题和事务的隔离级别1.并发…

C# Modbus通信从入门到精通(6)——Modbus RTU(0x04功能码)

1、04(0x04)读输入寄存器 使用该功能码能从远程地址中读取1到125个输入寄存器的值,每个输入寄存器都占两个字节,读取的输入寄存器数量由主站读取时指定。 2、发送报文格式 更详细的格式如下: 从站地址+功能码+起始地址高位+起始地址低位+寄存器数量高位+寄存器数量低位+…

备战求战 | 笔试强训6

目录 一、选择题 二、编程题 三、选择题题解 四、编程题题解 一、选择题 1、十进制变量i的值为100&#xff0c;那么八进制的变量i的值为&#xff08;&#xff09; A. 146 B. 148 C. 144 D. 142 2、执行下面语句后的输出为 int I1; if(I<0)printf("****\n") …

全志F1C200S嵌入式驱动开发(串口驱动)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 对于uboot、kernel和rootfs来说,他们的串口输出一般都是uart0。一般这么做,是没有问题的。只不过我们自己买的这块f1c200s电路板,设计者把uart转ttl的接口,改接到了uart1上面。…

自定义注解+AOP完成公共字段填充

在开发中&#xff0c;我们的实体类经常会有几个公共的字段&#xff0c;如下图的创建时间&#xff0c;修改时间就为各个类共有的字段&#xff1a; 目前项目中处理这些字段都是在每一个业务方法中进行赋值操作,如下: 如果都按照上述的操作方式来处理这些公共字段, 需要在每一个业…

中级课程——信息收集(完结)

文章目录 概要whois备案号警告CDN历史解析查询子域名查询后台目录指纹C段&#xff0c;旁站真实IP与CDN端口证书其他资产社工漏洞情报实操案例 概要 whois 备案号 警告 CDN历史解析查询 子域名查询 工具推荐 或者找在线工具 后台目录 指纹 C段&#xff0c;旁站 真实IP与CDN 端…

无符号数和数据类型转换

无符号数 字符类型的无符号值&#xff1a; 所有的数据底层都是采用二进制来保存&#xff0c;而第一位用于保存符号位&#xff0c;当不考虑符号位时&#xff0c;所有的数都按照数值进行保存 #include <stdio.h>int main() {unsigned char a -65;printf("%u"…

JVM结构-堆

堆不是一种数据结构&#xff08;什么结构都可以存放在堆中&#xff09;堆内存的大小是可以调节的。类加载器读取了类文件后&#xff0c;需要把类、方法、常变量放到堆内存中&#xff0c;保存所有引用类型的真实信息JVM堆被同一个JVM实例中的所有Java线程共享JVM堆通常由某种自动…

Redis的过期策略以及内存淘汰机制

目录 一、过期策略1.1、定时删除1.1.1、过期1.1.2、过期的 key 集合1.1.3、定时扫描策略1.1.4、 Redis 中所有的 key 在同一时间过期了&#xff0c;会出现怎样的结果1.1.5、从库的过期策略 1.2、惰性删除1.3、定时删除和惰性删除的总结 二、缓存淘汰算法2.1、缓存淘汰算法概述2…

mysql 备份

mysql 备份 1. 备份的类型2.备份的类容3. 备份工具1&#xff1a;MySQL自带的备份工具2&#xff1a;文件系统备份工具3&#xff1a;其他工具 4:备份的策略1. 直接拷贝数据库文件2. mysqldump备份数据库3. mydumper备份数据库4.lvm快照从物理角度实现几乎热备的完全备份&#xff…

【Dart】006-类的定义和使用

【Dart】006-类的定义和使用 文章目录 【Dart】006-类的定义和使用一、类的定义1、概述2、简单定义与实例化代码示例运行结果 3、成员方法代码示例运行结果箭头函数写法 4、get 与 set 关键字概述代码示例运行结果 二、类的构造方法1、特点2、完整版的构造方法简化版完整版 3、…

关于K8s的Pod的详解(一)

关于K8s的Pod的详解&#xff08;一&#xff09; Pod和API server的通信加快Pod启动更改Pod的资源Pod 的持久卷的单个访问模式Pod 拓扑分布约束Pod 拓扑分布中的最小域数 Pod 作为k8s创建&#xff0c;调度&#xff0c;管理的基本单位。由上级的Controller对Node上安装的Kubelet发…

最全整理,Pytest自动化测试框架-用例参数/忽略用例/失败重试(实战)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 测试用例参数化 …

一零六四、世界杯数据可视化分析(阿里云天池赛)

目录 赛制官方链接 活动背景 活动时间&#xff1a;即日起-12月31日17点 数据说明 世界杯成绩信息表&#xff1a;WorldCupsSummary 世界杯比赛比分汇总表&#xff1a;WorldCupMatches.csv 世界杯球员信息表&#xff1a;WorldCupPlayers.csv 代码实现 赛制官方链接 世界杯…

LitePal数据库的可视化

依赖 implementation com.amitshekhar.android:debug-db:1.0.0 输入adb forward tcp:8080 tcp:8080 run项目然后浏览器输入 localhost:8080 (保证手机和电脑出于相同wifi下) 效果 点击表格中的数据还可以进行数据的编辑和删除操作

x86架构ubuntu22下运行NDS模拟器DeSmuME

0. 环境 i7 ubuntu22 1. 获取源码 浏览器打开https://github.com/TASEmulators/desmume/releases&#xff0c;下载源码压缩包。 解压 tar -zvxf desmume-release_0_9_13.tar.gz cd desmume-release_0_9_13 2. 源码编译 2.1 build GTK2 or SDL2 frontend with autotools 配置…

【缺陷报告】缺陷报告怎样写会好一些?

目录 标题 描述或总结 影响 前置条件 重现步骤 结果 优先级 重现频率   附件 变通方案&#xff08;Workaround&#xff09; 发生原因分析&#xff08;Root Cause Analysis&#xff09; 环境配置 &#x1f381;更多干货 标题 1. 首先要做一个“标题党”&#xff…

NB!漏洞精准检测与深度利用框架

关注【Hack分享吧】公众号&#xff0c;回复关键字【230526】获取下载链接 工具介绍 这是一款高危漏洞精准检测与深度利用框架&#xff0c;采用框架与插件分离的模式&#xff0c;只做一件事情&#xff1a;精准狙击高危漏洞&#xff0c;适合专业打点人士。 目标探测 精密检测 深…