spring的注入(set注入、构造器注入)

news2024/12/24 8:25:51

目录

一、介绍

1.set注入和构造器注入是什么?

2.通俗的理解

3.set注入和构造器注入的核心原理

4.set注入和构造器注入的类型 

5.set注入的外部bean和内部bean

二、set注入和构造器注入例子步骤(引用数据类型)

(一)set注入

1.创建一个Dog类

2.创建一个Cat类

3.Dog类和Cat类统一交给spring管理 

4.Test测试的java包里面创建一个包一个测试类去测试运行

5.运行结果(Cat类被注入了Dog类的方法)

(二)构造器注入

1.创建一个Dog类

2.创建一个Cat类

3.Dog类和Cat类统一交给spring管理 

4.Test测试的java包里面创建一个包一个测试类去测试运行

5.运行结果(Cat类被注入了Dog类的方法)

二、set注入和构造器注入例子步骤 (简单数据类型)

(一)set注入 

1.创建一个User类。里面带有名字和年龄属性,快捷键生成set方法和toString方法

2.创建一个spring的xml文件里面配置bean和注入属性具体的值

3. Test测试的java包里面创建一个包一个测试类去测试运行

4.运行结果

 (二)构造器注入

1.创建一个User类。快捷键生成构造器方法和toString方法 

2.创建一个spring的xml文件里面配置bean和注入属性具体的值

3. Test测试的java包里面创建一个包一个测试类去测试运行

4.运行结果 


一、介绍

1.set注入和构造器注入是什么?

spring的控制反转(IOC)与依赖注入实现方式(DI)_云边的快乐猫的博客-CSDN博客

2.通俗的理解

已知:当前的spring框架不需要自己创建对象了。这些对象都交给spring的bean容器去管理。

那么想要这些对象想要关联起来或者传值进去怎么办呢?

那就要用到注入。 例如一个Cat猫类对象想要使用Dog狗类中的方法。那么怎么办呢?

按照以前没有使用spring的思路就是:在Cat类中去实例化Dog类,然后调用Dog类的方法

用spring后:那就是在统一托管对象的spring容器里面去调用就好了。Cat类直接在spring容器里面调用Dog的方法就可以了

3.set注入和构造器注入的核心原理

(1)set注入的核心原理

 通过反射机制调用set方法给属性赋值,让两个对象之间产生关系

(2)构造器注入的核心原理

通过调用构造方法来给属性赋值

4.set注入和构造器注入的类型 

set注入有两种类型:引用类型、简单类型

构造器有两种类型:引用类型、简单类型

引用类型和简单类型区别:java数据类型(8个基本数据类型+3个引用数据类型)与数据类型转换知识点_java三种引用数据类型_云边的快乐猫的博客-CSDN博客

5.set注入的外部bean和内部bean

(1)外部bean:在spring的自定义xml配置bean文件中配置的bean含有ref引用的就是外部bean

(2)内部bean:在spring的自定义xml配置bean文件中配置的property标签再内嵌一个bean(不含id)

二、set注入和构造器注入例子步骤(引用数据类型)

(一)set注入

实验目标创建一个Dog类,一个Cat类,交给spring中心托管。然后把Dog类的方法注入到Cat类里面,让Cat类去调用。本项目用的是maven项目

这里面有创建maven项目的方法

快速入门使用spring详细步骤(介绍、导入依赖、第一个简单程序)_云边的快乐猫的博客-CSDN博客

1.创建一个Dog类

package com.spring6.bean;

public class Dog {
    //1.新建一个方法
    public void DogEat(){
        System.out.println("这是狗的方法");
    }
}

2.创建一个Cat类

 ps:被注入的Cat类里面要先写入要注入目标的私有对象.类.方法。然后生成一个set方法

然后类本身创建一个方法,去调用这个注入的对象方法

package com.spring6.bean;

public class Cat {
//一、要注入Cat里面的方法
    //1.Dog私有方法
    private Dog DogEat;
    //2.生成一个set方法
    public void setDog(Dog dog) {
        this.DogEat = dog;
    }

//二、写Cat自己的方法
    public void cat(){
        //3.调用注入狗的方法
        DogEat.DogEat();
    }
}

3.Dog类和Cat类统一交给spring管理 

步骤:在resources里面创建一个配置xml文件。然后写入Dog和Cat这两个类的spring管理方式。

注入类:Dog。被注入类:Cat。就像Cat类里面被针管容器注入Dog类的方法

ps:不理解创建这个xml文件的可以看👇这篇文章

快速入门使用spring详细步骤(介绍、导入依赖、第一个简单程序)_云边的快乐猫的博客-CSDN博客

<?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.xsd">

    <!--1.配置Dog的XML文件 id:自定义。class:类的全限名-->
    <bean id="DogBean" class="com.spring6.bean.Dog"/>

    <!--2..配置cat的XML文件  ps:被注入的类里面要添加注入的-->
    <bean id="catBean" class="com.spring6.bean.Cat">
    <!--name这里填的是:注入里面set方法去除set后,并首字母改为小写的单词。ref翻译为引用的意思 ref后面指定的是注入的id-->
        <property name="dog" ref="DogBean"/>
    </bean>
</beans>

4.Test测试的java包里面创建一个包一个测试类去测试运行

package com.spring6.text;

import com.spring6.bean.Cat;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class springTText {
    @Test
    public void TT(){
        //1.半固定写法,扫描spring的xml文件(不固定的是要扫描的是哪个xml文件)
        ApplicationContext applicationContext =new ClassPathXmlApplicationContext("spring.xml");
        //2.半固定写法,获取spring里面要进行运行的类(不固定的是括号里面的,name为:要运行类的id,后面跟着的是要运行的类.class)
        Cat catBean = applicationContext.getBean("catBean", Cat.class);
        //3.上面自定义名.要运行类的方法
        catBean.cat();
    }
}

5.运行结果(Cat类被注入了Dog类的方法)

(二)构造器注入

实验目标创建一个Dog类,一个Cat类,交给spring中心托管。然后把Dog类的方法注入到Cat类里面,让Cat类去调用。 目标和set一样,用的方式不一样而已

1.创建一个Dog类

package com.spring6.bean;

public class Dog {
    //1.新建一个方法
    public void DogEat(){
        System.out.println("这是狗的方法");
    }
}

2.创建一个Cat类

 ps:被注入的Cat类里面要先写入要注入目标的私有对象.类.方法。然后生成一个构造方法

然后类本身创建一个方法,去调用这个注入的对象方法

3.Dog类和Cat类统一交给spring管理 

步骤:在resources里面创建一个配置xml文件。然后写入Dog和Cat这两个类的spring管理方式。

注入类:Dog。被注入类:Cat。就像Cat类里面被针管容器注入Dog类的方法

ps:区别就是注入的这里这个可以自动扫描,也可以用name,也可以用序列号

<?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.xsd">

    <!--1.配置Dog的XML文件 id:自定义。class:类的全限名-->
    <bean id="DogBean" class="com.spring6.bean.Dog"/>

    <!--2..配置cat的XML文件  ps:被注入Cat类里面要添加注入的Dog-->
    <bean id="catBean" class="com.spring6.bean.Cat">
    <!--constructor-arg这个会自动扫描。ref翻译为引用的意思 ref后面指定的是注入Dog的id-->
        <constructor-arg ref="DogBean"/>
    </bean>
</beans>

4.Test测试的java包里面创建一个包一个测试类去测试运行

ps:这个和set注入的第4步一样

package com.spring6.text;

import com.spring6.bean.Cat;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class springTText {
    @Test
    public void TT(){
        //1.半固定写法,扫描spring的xml文件(不固定的是要扫描的是哪个xml文件)
        ApplicationContext applicationContext =new ClassPathXmlApplicationContext("spring.xml");
        //2.半固定写法,获取spring里面要进行运行的类(不固定的是括号里面的,name为:要运行类的id,后面跟着的是要运行的类.class)
        Cat catBean = applicationContext.getBean("catBean", Cat.class);
        //3.上面自定义名.要运行类的方法
        catBean.cat();
    }
}

5.运行结果(Cat类被注入了Dog类的方法)

ps:这个和set注入的第5步一样

 

二、set注入和构造器注入例子步骤 (简单数据类型)

实验目标创建一个User类,属性有名字和年龄。用spring的xml方式注入具体的值  

(一)set注入 

1.创建一个User类。里面带有名字和年龄属性,快捷键生成set方法和toString方法

package com.spring6.bean;

public class User {
    //1.创建类的属性
    private String username;
    private int age;
    //2.快捷键生成set方法

    public void setUsername(String username) {
        this.username = username;
    }

    public void setAge(int age) {
        this.age = age;
    }
    //3.快捷键生成toString方法
    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", age=" + age +
                '}';
    }
}

2.创建一个spring的xml文件里面配置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.xsd">

    <!--1.配置User的XML文件   id:自定义  class:要设置类的全限名-->
    <bean id="userBean" class="com.spring6.bean.User">
    <!--2.用property name:要注入的属性名称  简单类型用value:注入属性的值        -->
        <property name="username" value="张三"/>
        <property name="age" value="18"/>
    </bean>
</beans>

3. Test测试的java包里面创建一个包一个测试类去测试运行

package com.spring6.text;

import com.spring6.bean.User;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class springTText {
    @Test
    public void TT(){
        //1.半固定写法,扫描spring的xml文件(不固定的是要扫描的是哪个xml文件)
        ApplicationContext applicationContext =new ClassPathXmlApplicationContext("spring.xml");
        //2.半固定写法,获取spring里面要进行运行的类(不固定的是括号里面的,name为:要运行类的id,后面跟着的是要运行的类.class)
        User username = applicationContext.getBean("userBean", User.class);
        //3.运行这个方法
        System.out.println(username);
    }
}

4.运行结果

 (二)构造器注入

1.创建一个User类。快捷键生成构造器方法和toString方法 

package com.spring6.bean;

public class User {
    //1.创建类的属性
    private String username;
    private int age;

    public User(String username, int age) {
        this.username = username;
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", age=" + age +
                '}';
    }
}

2.创建一个spring的xml文件里面配置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.xsd">

    <!--1.配置User的XML文件   id:自定义  class:要设置类的全限名-->
    <bean id="userBean" class="com.spring6.bean.User">
    <!--2.constructor-arg:自动扫描属性  value:里面填入要注入属性的具体值 -->
        <constructor-arg  value="李四"/>
        <constructor-arg  value="19"/>
    </bean>
</beans>

3. Test测试的java包里面创建一个包一个测试类去测试运行

package com.spring6.text;

import com.spring6.bean.User;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class springTText {
    @Test
    public void TT(){
        //1.半固定写法,扫描spring的xml文件(不固定的是要扫描的是哪个xml文件)
        ApplicationContext applicationContext =new ClassPathXmlApplicationContext("spring.xml");
        //2.半固定写法,获取spring里面要进行运行的类(不固定的是括号里面的,name为:要运行类的id,后面跟着的是要运行的类.class)
        User username = applicationContext.getBean("userBean", User.class);
        //3.运行这个方法
        System.out.println(username);
    }
}

4.运行结果 

ps:感觉set注入和构造注入就快捷键生成的代码不一样,一个生成set方法,一个生成构造器方法。xml配置里面也有些细微不一样而已,其他的大致一样

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

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

相关文章

Windows安装系列:部署FTP文件服务

1、下载服务端 http://www.serv-u.com.cn/dl/SERVU-Fulltrial-WINDOWS.zip 2、安装ftp服务 2.1、指定位置安装Server-U 2.2、安装最后一步&#xff0c;允许将Server-U添加到防火墙例外列表中 3、配置Server-U的域 3.1、打开Server-U控制台&#xff0c;进入配置向导&#xff…

2022年山东省职业院校技能大赛网络搭建与应用赛项正式赛题

2022年山东省职业院校技能大赛 网络搭建与应用赛项 第二部分 网络搭建与安全部署&服务器配置及应用 竞赛说明&#xff1a; 一、竞赛内容分布 竞赛共分二个模块&#xff0c;其中&#xff1a; 第一模块&#xff1a;网络搭建及安全部署项目 第二模块&#xff1a;服务…

全网详细解读基于java调用ChatGPT的API接口

文章目录1. 文章引言2. 基于java调用API2.1 环境配置2.2 编写代码3. 重要总结3.1 官网链接地址3.2 开发语言的示例链接1. 文章引言 首先&#xff0c;我们需要访问ChatGPT的官网&#xff0c;官网提供了很多调用ChatGPT的API接口的语言示例&#xff0c;比如java&#xff0c;go&a…

C语言学习小结(1)——初认识C语言

一、C语言概念 C语言是一门通用计算机编程语言&#xff0c;广泛应用于底层开发。C语言的设计目标是提供一种能以简易 的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。尽管C语言提供了许多低级处理的功能&#xff0c;但仍然保持着…

第3章-进程同步、互斥与信号量(4)

进程同步、互斥与信号量 0 引言 操作系统的并发进程有些是独立的&#xff0c;有些需要相互协作。独立的进程在系统中执行时不受其他进程的影响&#xff0c;而另一些进程需要与其他进程共享数据&#xff0c;来完成共同的任务&#xff0c;这些进程之间具有协作关系。但我们要保…

2023发卡商城源码,最新自助下单彩虹云商城系统免授权无后门源码

# 彩虹自助下单系统 > PHP版本: > 7.0.1 ____ * 去除所有授权验证 * 支持自定义说说接口 * 去除后台广告与更新 * 可自定义易支付接口 ____ >安装教程: > 1、上传源代码到空间或服务器&#xff0c;并确保权限可读写。 > 2、上传完成后&#xff0c;使用浏览器…

vue-cli3打包上线页面空白接口404

使用vue-cli3创建一个vue3ts的项目输入npm run build 打包后生成dist文件夹 把文件夹上传到服务器此时发现页面一片空白&#xff0c;接口显示404 解决这个问题&#xff0c;需要手动在根目录下配置vue.config.js module.exports {publicPath: ./ }然后重新打包&#xff0c;重新…

mycat安装

查看是否安装jdk java -versionjdk安装方法 mycat下载&#xff1a; Mycat安装包1.6.7.3版本 创建新文件夹 mkdir test_mycat上传jar后移动到对应位置 mv Mycat-server-1.6.7.3-release-20210913163959-linux.tar.gz ./test_mycat/解压 tar zxvf Mycat-server-1.6.7.3-rele…

【成为架构师课程系列】一线架构师:6个经典困惑及其解法

目录 一线架构师:6个经典困惑及其解法 多阶段还是多视图? 内置最佳实践 架构方法论:3个阶段,一个贯穿

经典进程同步与互斥问题(5)

经典进程同步与互斥问题 1 生产者-消费者问题 1.1 问题描述 生产者-消费者问题是指有两组进程共享一个环形的缓冲池。一组进程被称为生产者&#xff0c;另一组进程被称为消费者。缓冲池是由若干个大小相等的缓冲区组成的&#xff0c;每个缓冲区可以容纳一个产品。生产者进程…

学习802.11之MAC帧格式(一篇就够!)

802.11规范的关键在于MAC&#xff08;媒介访问控制层&#xff09;&#xff0c;MAC位于各式物理层之上&#xff0c;控制数据传输。负责核心成帧操作以及与有线骨干网络之间的交互。 802.11 MAC采用载波监听多路访问&#xff08;CSMA&#xff09;机制来控制对传输媒介的访问&…

操作系统闲谈05——内存管理

操作系统闲谈05——内存管理 一、 内存管理的基本方式 01 段式内存管理 将程序按照逻辑关系划分为段&#xff0c;每个段的大小不等&#xff0c;比如从下到上&#xff08;代码段、数据段、bss段、栈、文件映射、堆等等&#xff09;&#xff0c;然后通过地址映射机制转换为实际…

阻抗匹配之反射波形测量

稍微接触过高速信号的朋友&#xff0c;一定对阻抗匹配和信号反射都有所了解&#xff0c;甚至可以按照公式&#xff0c;把反射波形一路推导出来。但是&#xff0c;纸上得来终绝浅&#xff0c;绝知此事要躬行。 今天&#xff0c;我们就来实测一下信号反射波形&#xff0c;测试环…

【MySQL】MyCat分库分表分片规则配置详解与实战(MySQL专栏启动)

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;2022年度博客之星全国TOP3&#xff0c;专注于后端、中间件、计算机底层、架构设计演进与稳定性建工设优化。文章内容兼具广度深度、大厂技术方案&#xff0c;对待技术喜欢推理加验证&#xff0c;就职于知名金融公…

2023年美国大学生数学建模时间、分析及算法代码

美国大学生数学建模——干货2023年美赛比赛日期和时间赛题类型算法代码美赛常见数模问题分类问题判别分析&#xff1a;聚类分析&#xff1a;神经网络分类&#xff1a;优化问题线性规划&#xff1a;非线性规划&#xff1a;整数规划&#xff1a;动态规划&#xff1a;多目标规划&a…

超详细讲解字符串查找函数(保姆级教程!!!)

超详细讲解字符串查找函数&#xff08;保姆级教程&#xff01;&#xff01;&#xff01;&#xff09;字符串查找函数strstr函数strstr函数的使用strstr函数的模拟实现strtok函数strtok函数的使用strtok函数的模拟实现strpbrk函数strpbrk函数的使用strpbrk函数的模拟实现strcspn…

地级市用电、用水、用气数据指标

用电用水量和煤气及液化石油气供应及利用情况可以反映出城市基础设施的建设情况&#xff01;之前我们基于历年的《中国城市统计年鉴》整理了1999—2020年的人口数量数据指标、人口变动数据指标、用地相关数据指标、污染物排放和环境治理相关数据指标、地区生产总值及一二三产构…

【MyBatis】| MyBatis的逆向⼯程

目录 一&#xff1a;MyBatis的逆向⼯程 1. 逆向⼯程配置与⽣成 2. 测试生成的逆向⼯程 一&#xff1a;MyBatis的逆向⼯程 &#xff08;1&#xff09;所谓的逆向⼯程是&#xff1a;根据数据库表逆向⽣成Java的pojo类&#xff0c;SqlMapper.xml⽂件&#xff0c;以及Mapper接⼝…

redis高可用之主从复制

一、前置知识 分布式系统理论基石CAP&#xff1a;consistent-一致性&#xff0c;availability-可用性&#xff0c;partition tolerance-分区容忍性。网络分区&#xff1a;网络断开也叫网络分区&#xff0c;当网络分区发生时&#xff0c;一致性会被破坏&#xff0c;除非牺牲可用…

磁盘管理(8)

磁盘管理 0 引言 速度是影响文件系统性能的主要因素&#xff0c;因此提高磁盘I/O速度的主要途径&#xff1a;选择性能好的磁盘、采用好的磁盘调度算法和设置磁盘高速缓冲区。 1 磁盘的性能 影响磁盘性能的因素&#xff1a; 数据的结构磁盘的类型磁盘访问时间 2 磁盘的结构…