spring——Spring自动装配——示例

news2024/9/22 17:24:43

1. 不使用自动装配(autowire="no")

autowire="no" 表示不使用自动装配,此时我们必须通过 <bean> 元素的 <constructor-arg>和 <property> 元素的 ref 属性维护 Bean 的依赖关系。

2. 按名称自动装配(autowire="byName")

autowire="byName" 表示按属性名称自动装配,XML 文件中 Bean 的 id 或 name 必须与类中的属性名称相同。

3. 按类型自动装配(autowire="byType")

autowire="byType" 表示按类中对象属性数据类型进行自动装配。即使 XML 文件中 Bean 的 id 或 name 与类中的属性名不同,只要 Bean 的 class 属性值与类中的对象属性的类型相同,就可以完成自动装配。

4. 构造函数自动装配(autowire="constructor")

autowire="constructor" 表示按照 Java 类中构造函数进行自动装配。

5. 默认的自动装配模式(autowire="default")

默认采用上一级标签 <beans> 设置的自动装配规则(default-autowire)进行装配,Beans.xml 中的配置内容如下。 

=======================================================================

项目依赖:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>ssw</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.6</version>
        </dependency>
    </dependencies>

</project>

dept类:

package org.example;

public class Dept {
    //部门编号
    private String deptNo;
    //部门名称
    private String deptName;
    public Dept() {
        System.out.println("正在执行 Dept 的无参构造方法>>>>");
    }
    public Dept(String deptNo, String deptName) {
        System.out.println("正在执行 Dept 的有参构造方法>>>>");
        this.deptNo = deptNo;
        this.deptName = deptName;
    }
    public void setDeptNo(String deptNo) {
        System.out.println("正在执行 Dept 的 setDeptNo 方法>>>>");
        this.deptNo = deptNo;
    }
    public void setDeptName(String deptName) {
        System.out.println("正在执行 Dept 的 setDeptName 方法>>>>");
        this.deptName = deptName;
    }
    public String getDeptNo() {
        return deptNo;
    }
    public String getDeptName() {
        return deptName;
    }
    @Override
    public String toString() {
        return "Dept{" +
                "deptNo='" + deptNo + '\'' +
                ", deptName='" + deptName + '\'' +
                '}';
    }
}

employee类:

package org.example;

public class Employee {
    //员工编号
    private String empNo;
    //员工姓名
    private String empName;
    //部门信息
    private Dept dept;
    public Employee() {
        System.out.println("正在执行 Employee 的无参构造方法>>>>");
    }
    public Employee(String empNo, String empName, Dept dept) {
        System.out.println("正在执行 Employee 的有参构造方法>>>>");
        this.empNo = empNo;
        this.empName = empName;
        this.dept = dept;
    }
    public void setEmpNo(String empNo) {
        System.out.println("正在执行 Employee 的 setEmpNo 方法>>>>");
        this.empNo = empNo;
    }
    public void setEmpName(String empName) {
        System.out.println("正在执行 Employee 的 setEmpName 方法>>>>");
        this.empName = empName;
    }
    public void setDept(Dept dept) {
        System.out.println("正在执行 Employee 的 setDept 方法>>>>");
        this.dept = dept;
    }
    public Dept getDept() {
        return dept;
    }
    public String getEmpNo() {
        return empNo;
    }
    public String getEmpName() {
        return empName;
    }
    @Override
    public String toString() {
        return "Employee{" +
                "empNo='" + empNo + '\'' +
                ", empName='" + empName + '\'' +
                ", dept=" + dept +
                '}';
    }
}

bean.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd" default-autowire="constructor">

    <bean id="dept" class="org.example.Dept">
        <property name="deptNo" value="1"></property>
        <property name="deptName" value="技术部"></property>
    </bean>
    <bean id="employee" class="org.example.Employee" autowire="no">
        <property name="empNo" value="002"></property>
        <property name="empName" value="小郭"></property>
        <property name="dept" ref="dept"></property>
    </bean>

</beans>

执行:

package org.example;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main
{
    private static final Log LOGGER = LogFactory.getLog(Main.class);

    public static void main(String[] args)
    {
        ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
        Employee employee = context.getBean("employee", Employee.class);
        System.out.println(employee);

    }

}

执行结果:

========================================================

1. 不使用自动装配(autowire="no")

autowire="no" 表示不使用自动装配,此时我们必须通过 <bean> 元素的 <constructor-arg>和 <property> 元素的 ref 属性维护 Bean 的依赖关系。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd" default-autowire="constructor">

    <bean id="dept" class="org.example.Dept">
        <property name="deptNo" value="1"></property>
        <property name="deptName" value="技术部"></property>
    </bean>
    <bean id="employee" class="org.example.Employee" autowire="no">
        <property name="empNo" value="002"></property>
        <property name="empName" value="小郭"></property>
        <property name="dept" ref="dept"></property>
    </bean>

</beans>

执行结果:

2. 按名称自动装配(autowire="byName")

autowire="byName" 表示按属性名称自动装配,XML 文件中 Bean 的 id 或 name 必须与类中的属性名称相同。

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd" >
    <bean id="dept" class="org.example.Dept">
        <property name="deptNo" value="1"></property>
        <property name="deptName" value="技术部"></property>
    </bean>
    <bean id="employee" class="org.example.Employee" autowire="byName">
        <property name="empNo" value="002"></property>
        <property name="empName" value="小郭"></property>
    </bean>
</beans>

3. 按类型自动装配(autowire="byType")

autowire="byType" 表示按类中对象属性数据类型进行自动装配。即使 XML 文件中 Bean 的 id 或 name 与类中的属性名不同,只要 Bean 的 class 属性值类中的对象属性的类型相同,就可以完成自动装配。

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd" >
    <bean id="dept2" class="org.example.Dept">
        <property name="deptNo" value="1"></property>
        <property name="deptName" value="技术部"></property>
    </bean>
    <bean id="employee" class="org.example.Employee" autowire="byType">
        <property name="empNo" value="002"></property>
        <property name="empName" value="小郭"></property>
    </bean>
</beans>

执行结果:

4. 构造函数自动装配(autowire="constructor")

autowire="constructor" 表示按照 Java 类中构造函数进行自动装配。

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
    <bean id="dept2" class="org.example.Dept">
        <constructor-arg name="deptNo" value="1"></constructor-arg>
        <constructor-arg name="deptName" value="技术部"></constructor-arg>
    </bean>
    <bean id="employee" class="org.example.Employee" autowire="constructor">
        <constructor-arg name="empNo" value="002"></constructor-arg>
        <constructor-arg name="empName" value="小郭"></constructor-arg>
    </bean>
</beans>

 

5. 默认的自动装配模式(autowire="default")

默认采用上一级标签 <beans> 设置的自动装配规则(default-autowire)进行装配,Beans.xml 中的配置内容如下。 

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd" default-autowire="byType">
    <bean id="dept2" class="org.example.Dept">
        <property name="deptNo" value="1"></property>
        <property name="deptName" value="技术部"></property>
    </bean>
    <bean id="employee" class="org.example.Employee" autowire="default">
        <property name="empNo" value="002"></property>
        <property name="empName" value="小郭"></property>
    </bean>
</beans>

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

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

相关文章

【Qt入门第38篇】 网络(八)TCP(二)

导语 在上一节里我们使用TCP服务器发送一个字符串&#xff0c;然后在TCP客户端进行接收。在这一节将重新写一个客户端程序和一个服务器程序&#xff0c;这次实现客户端进行文件的发送&#xff0c;服务器进行文件的接收。有了上一节的基础&#xff0c;这一节的内容就很好理解了…

“为什么同样是跳槽,有些人薪资就能翻两三倍?“Java面试八股文是背错了方向吗?

“为什么同样是跳槽&#xff0c;有些人薪资能翻两三倍&#xff1f;” 最近遇到一个朋友跟我吐槽如上&#xff0c;其实类似这样的问题我也听到过很多次&#xff0c;身边也不乏有认识的同事、朋友们通过跳槽拿下高薪&#xff0c;这里我先说一个我身边真实的例子&#xff1a; 学…

智能家居服务发现实现

服务设备软件架构设计 代码复用 将网络通信框架移植到开发板&#xff0c;之后&#xff0c;可以使用框架中的组件实现 Response Task 和 Service Task。 框架移植注意事项 LWIP 是微型 TCP/IP 协议栈 (并非完整 TCP/IP 协议栈) 支持 socket 接口&#xff0c;但一些功能未实现…

面向对象编程的一个例子——减少代码重复

专注系列化、高质量的R语言教程推文索引 | 联系小编 | 付费合集本篇推文缘起于上篇推文plot3D | 三维数据绘图&#xff08;3&#xff09;&#xff1a;mesh函数、surf3D函数、spheresurf3D函数。学堂君在介绍surf3D()函数时举了两个例子。第一个例子是绘制球形&#xff1a;libra…

contains shards using both inmem and tsi1 indexes. 重构索引 influx

问题&#xff1a; 删除infludx表measurement时出错 参考: 记一次influxdb内存高耗的追踪 - 墨天轮 influxdb删除错误DB contains shards using both inmem and tsi1 indexes._宇宙全能王的博客-CSDN博客_influxdb删除shard Rebuild the TSI index | InfluxDB OSS 1.8 Docume…

【PCB专题】芯片比较大的焊盘,开钢网时都要设计成不同数量的小格吗?

大面积焊盘&#xff08;EPAD&#xff09;必须开栅格或线条孔&#xff0c;避免焊膏印刷时刮薄或焊接时把元件托起&#xff0c;使其他引脚开焊。这种开钢网的方法&#xff0c;多用于QFN封装和无线模块。比如非接芯片、电源芯片、语音功放、Modem芯片等需要加强散热的器件&#xf…

python之标准库使用

目录 一、标准库 二、字符串操作 三、字符串类型 四、 时间操作 五、文件基本方法及操作 文件基本方法 文件操作 一、标准库 Python 标准库非常庞大&#xff0c;所提供的组件涉及范围十分广泛&#xff0c;正如以下内容目录所显示的。这个库包含了 Python中的图标含义 c…

游戏开发44课 性能优化3

2.4 模型 模型特别是带有骨骼动画的模型在性能消耗中占据非常大的比重&#xff0c;它们会显著增加CPU/GPU/内存/显存的负担。所以&#xff0c;模型的优化尤为重要。模型涉及的数据比较多&#xff0c;包含了顶点/索引/材质等&#xff0c;而顶点又可能包含pos/color/uv/normal/t…

【Docker】Docker是什么?Docker从介绍到Linux安装图文详细教程

本期目录1. Docker介绍1.1 Docker解决的问题2. Docker和虚拟机的区别2.1 虚拟机的缺点2.2 Docker的优点2.3 比较3. Docker架构3.1 镜像和容器1&#xff09;镜像2&#xff09;容器3.2 Docker和DockerHub3.3 整体结构及底层通信原理4. 安装Docker4.1 安装条件4.2 卸载旧版本4.3 y…

【Windows环境下载安装MySQL、IDEA连接数据库】

MySQL安装配置一、Windows环境下载安装MySQL1.下载合适的MySQL安装包2.本地安装配置MySQL二、IDEA连接MySQL数据库1.设置数据库连接2.测试连接3.连接结果一、Windows环境下载安装MySQL 1.下载合适的MySQL安装包 官网链接https://www.mysql.com/&#xff0c;选择合适的版本&am…

JVM方法区的内部结构

JVM 中方法区的大致区域浏览图&#xff1a; 《深入理解 Java 虚拟机》书中对方法区&#xff08; Method Area) 存储内容描述如下&#xff1a;它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码缓存等。 类型信息 对每个加载的类型&#xff08;类 cla…

chatGPT 辣么火,你却不会注册

chatGPT 是什么&#xff1f; 一款目前超级火的 AI 对话聊天工具&#xff0c;只是不同于其他的智能聊天机器人那样&#xff0c;他非常的智能。 可以回答你的技术问题、帮你写代码、还能帮你写小说等等&#xff0c;发挥你的想象力&#xff0c;让他干点啥都行。 比如让他帮你用…

Spring循环依赖问题分析

文章目录一、什么是循环依赖&#xff1f;二、Spring内部解决的是那种情况下的循环依赖&#xff1f;三、一级、二级、三级缓存保存的是什么&#xff1f;四、如何使用三级缓存解决循环依赖&#xff1f;五、为什么是三级缓存&#xff0c;二级缓存不行么&#xff1f;六、二级缓存的…

小米AX6S刷OpenWrt,和刷回官网固件

文章目录背景刷成 OpenWrt刷回官网固件Ref简 述: 闲暇&#xff0c;折腾下新购 小米AX6S &#xff0c;刷下 OpenWrt&#xff0c;初次接触记录下。 本文初发于 “偕臧的小站”&#xff0c;同步转载于此。 背景 miwifi_rb03_firmware_3e872_1.0.54.bin [官方 2022.08.24] miwifi_r…

17. 权重衰退(weight_decay)

之前描述了过拟合的问题&#xff0c;现在介绍一些正则化模型的技术。 正则化&#xff1a;凡事可以减少泛化误差而不是减少训练误差的方法&#xff0c;都可以称作正则化方法。 我们总是可以通过去收集更多的训练数据来缓解过拟合。 但这可能成本很高&#xff0c;耗时颇多&#x…

【OpenCV-Python】教程:4-7 BRIEF( Binary Robust Independent Elementary Features)特征

OpenCV Python BRIEF &#xff08; Binary Robust Independent Elementary Features&#xff09; 【目标】 学习 BRIEF 算法理论 【理论】 我们知道SIFT使用128维向量作为描述符。因为它使用的是浮点数&#xff0c;所以需要512字节。类似地&#xff0c;SURF也需要最少256字…

堪称零瑕疵!仅用了365页直接封神,我要吹爆这份RocketMQ笔记

RocketMQ 是阿里巴巴在2012年开源的分布式消息中间件&#xff0c;作为经历过多次阿里巴巴双十一这种“超级工程”的洗礼并有稳定出色表现的国产中间件&#xff0c;以其高性能、低延时和高可靠等特性近年来已经也被越来越多的国内企业使用。 谁使用ApacheRocketMQ&#xff1f; …

【不知道发啥】Win7网页版使用方法

文章目录网站使用方法测试总结&#x1f308;博客主页&#xff1a;Minecraft__Him &#x1f48c;欢迎关注&#x1f389;点赞&#x1f44d;收藏⭐️私信&#x1f4dd;评论 网站 https://win7simu.visnalize.com/ 使用方法 如果是蓝屏那就等一下&#xff0c; 等它跳到这个界面 …

硕士毕业进入阿里三年半,离职申请N+3,到手20多万,跳槽到下家涨薪50%,感谢阿里!...

最近这段时间的负能量帖子太多了&#xff0c;今天说点正能量的事。一位前阿里员工说&#xff1a;硕士3.5年&#xff0c;校招进入阿里供应链后端&#xff0c;月初离职&#xff0c;申请拿了n3&#xff0c;一共给了20多万&#xff0c;跳槽的package涨了50%&#xff0c;感谢阿里&am…

当我和ChatGPT聊Everything as Code

以下是我和ChatGPT的聊天原文。一开始还有点惊喜&#xff0c;震惊。越到后面&#xff0c;越感到失望。网络上大肆宣传ChatGPT要代替人类的文章&#xff0c;我怕是专门炒流量赚钱的吧&#xff1f;我个人觉得&#xff0c;它离代替人类&#xff0c;还远着呢。Everything as Code 的…