(十一)Spring教程——Bean基本配置与依赖注入之属性注入

news2025/1/9 2:35:57

1.Bean基本配置

        在进行Bean配置的详细讲解之前,先来了解以下Bean配置的基础知识,以快速建立起Bean配置的初步概念。

1.1装配一个Bean

        在Spring容器的配置文件中定义一个简要Bean的配置片段如下所示

        <bean id=”foo” class=”com.smart.Foo”/>

        一般情况下,Spring IoC容器中的一个Bean对应配置文件中的一个<bean>,这种镜像映射关系应该容易理解。其中,id为这个Bean的名称,通过容器的getBean(“foo”)即可获取对应的Bean,在容器中起到定位查找的作用,是外部程序和Spring IoC容器进行交互的桥梁;class属性指定了Bean对应的实现类。

        下面基于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-4.0.xsd

<!--默认命名空间的配置-->

<bean id="car" class="com.smart.simple.Car" />

<bean id="boss" class="com.smart.simple.Boss" />

</beans>

        这段配置信息提供了实例化Car和Boss这两个Bean必须的信息,Spring IoC容器完全可以据此创建这两个Bean的实例。

1.2Bean的命名

        一般情况下,在配置一个Bean时,需要为其指定一个id属性作为Bean的名称。Id在IoC容器中必须是唯一的,而且id的命名需要满足XML对id的命名规范(id是XML规定的特殊属性):必须以字母开始,后面可以是字母、数字、连字符、下划线、句号、冒号等完整结束的符号,逗号和空格这些非完整结束符是非法的。

        在实际情况下,id命名约束并不会给用户带来影响,但如果用户确实希望用一些特殊字符进行Bean命名,则可以使用<bean>的name属性。name属性没有字符上的限制,几乎可以使用任何字符,如?ab、123等。示例如下:

        <bean name=”#car1” class=”com.smart.simple.Car”>

        Id和name都可以指定多个名字,名字之间可用逗号、分号或者空格进行分隔,如下:

        <bean name=”#car1,123,$car” class=”com.smart.simple.Car”>

     这里为Bean定义了3个名称:其一为#car1;其二为123;其三为$car。用户可以使用getBean(“#car1”)、getBean(“123”)、getBean(“$car”)获取IoC容器中的car Bean。

       Spring配置文件不允许出现两个相同id的<bean>,但却可以出现两个相同name的<bean>。如果有多个name相同的<bean>,那么通过getBean(beanName)获取Bean时,将返回后面声明的那个Bean,原因时后面的Bean覆盖了前面同名的Bean。所以为了避免无意间Bean覆盖的隐患,应尽量使用id而非name命名Bean。

        如果id和name两个属性都未指定,如<bean class=”com.smart.simple.Car”/>,那么Spring自动将全限定名作为Bean的名称,这时用户可以通过getBean(“com.smart.simple.Car”)获取car Bean。如果存在多个实现类相同的匿名<bean>,如下:

<bean class=”com.smart.simple.Car”/>

<bean class=”com.smart.simple.Car”/>

<bean class=”com.smart.simple.Car”/>

   第一个Bean通过getBean(“com.smart.simple.Car”)获得;第二个Bean通过getBean(“com.smart.simple.Car#1”)获取;第三个Bean通过getBean(“com.smart.simple.Car#2”)获得,依次类推。

2.依赖注入

        Spring支持两种方式的依赖注入方式,分别是属性注入和构造函数注入。除此之外Spring还支持工厂方法注入方式。在这里,我们将了解到不同依赖注入方式的具体配置方法。

2.1属性注入

        属性注入指通过setXXX()方法注入Bean的属性值或者依赖对象。由于属性注入方式具有可选择性和灵活性高的优点,因此属性注入是实际应用中最常用的注入方式。

2.1.1属性注入实例

        属性注入要求Bean提供一个默认的构造函数,并为需要注入的属性提供对应的Setter方法。Spring先调用Bean的默认构造函数实例化Bean对象,然后通过反射的方式调用Setter方法注入属性值。

        默认构造函数是不带参数的构造函数。Java语言规定,如果类中没有定义任何构造函数,则JVM会自动为其生成一个默认的构造函数;反之,如果类中显式定义了构造函数,则JVM不会为其生成默认的构造函数。

        下面使用一个例子来说明,创建一个Car.java类,该类提供默认构造函数和Setter,该类的代码如下:

package com.example.servlet001.bean;

//默认构造函数和Setter

public class Car {

    private int maxSpeed;

    private  String brand;

    private String price;

    public void setBrand(String brand){

        System.out.println("调用setBrand()设置属性。");

        this.brand=brand;

    }

    public void setMaxSpeed(int maxSpeed){

        this.maxSpeed=maxSpeed;

    }

    public void setPrice(String price){

        this.price=price;

    }

}

        Car类中定义了3个属性,并分别提供了对应的Setter方法。
        以下XML配置是Spring配置文件中对Car进行属性注入的配置。

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

       xmlns:p="http://www.springframework.org/schema/p"

       xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="car1" name="car1" class="com.example.servlet001.bean.Car">

        <property name="maxSpeed"><value>200</value></property>

        <property name="brand"><value>奥迪A6</value></property>

        <property name="price"><value>20000.00</value></property>

    </bean>

</beans>

        上述代码配置了一个Bean,并为该Bean的3个属性提供了属性值。具体来说,Bean的每个属性对应一个<property >标签,name为属性的名称,在Bean实现类中拥有与其对应的Setter方法。

        需要指出的是,Spring只会检查Bean中是否有对应的Setter方法,至于Bean中是否有对应的属性成员变量则不作要求。举个例子,配置文件中<property name=”brand”/>的属性配置项仅要求Car类中拥有setBrand()方法,但Car类不一定有用brand成员变量。

        虽然如此,但在一般情况下,仍然按照约定俗成的方式在Bean中提供同名的属性变量。

2.1.2JavaBean关于属性命名的特殊规范

        Spring配置文件中<property >元素所指定的属性名和Bean实现类的Setter方法满足Sun Java Bean的属性命名规范:xxx的属性对应setXxx()方法。

        一般情况下,Java的属性变量名都以小写字母开头,如maxSpeed、brand等,但也存在特殊的情况。考虑到一些特殊意义的大写英文缩略词(如USA、XML等),Java Bean也允许以大写字母开头的属性变量名,不过必须满足“变量的前两个字母要么全部大写,要么全部小写”的要求,如brand、IDCode、IC、ICCard等属性变量名是合法的,而iC、iCcard、iDCode等属性变量名则是非法的。这个并不广为人知的Java Bean规范条款引发了众多让人困惑的配置问题。

        为了更清楚地理解这个隐晦的问题,我们来看一个具体的实例。

        首先我们在刚才的程序中增加一个入口函数,增加一个Demo1.java类,类的完整代码如下所示

package com.example.servlet001;

public class Demo1 {

    public static void main(String[] args) {

        System.out.println("测试启动");

    }

}

        代码结构如下图所示

        此时我们启动程序,可以看到在控制台成功的打印了“测试启动”。这说明刚才这个Bean的配置是没有问题的。

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

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

相关文章

【VSCode】安装 【ESP-IDF】插件及【ESP32-S3】新建工程和工程配置

一、搭建基础工程 二、基础工程的文件架构解析 三、调试相关工具介绍 1、串口下载2、JTAG 下载与调试 四、工程的文件架构解析 五、基础工程配置 一、搭建基础工程 在 VS Code 中新建 ESP-IDF 基础工程的步骤如下&#xff1a; 1、启动 VS Code 并打开命令面板 按下“Ctrl…

AI+BI结合,数据分析新方向 —— 奥威BI数据可视化引领未来

【AIBI结合&#xff0c;数据分析新方向 —— 奥威BI数据可视化引领未来】 在数字化浪潮汹涌的今天&#xff0c;企业对于数据的洞察力与决策效率的需求日益增长。奥威BI&#xff08;Business Intelligence&#xff09;数据可视化解决方案&#xff0c;以其独特的“AIBI”融合创新…

压缩视频在线免费 怎么免费压缩视频大小 哪个软件可以免费压缩视频

在数字媒体时代&#xff0c;视频文件的体积越来越大&#xff0c;这就需要我们找到高效的方式来压缩视频&#xff0c;以节省存储空间和提升分享速度。本文将为您介绍几款免费的视频压缩软件&#xff0c;帮助您轻松应对视频文件管理难题。 方法一、 安装并打开一款的视频软件。 …

通过iframe嵌套的不同域名的页面之间处理cookie存储失败的问题——js技能提升

最近同事在写mvc的后台管理系统&#xff0c;通过iframe实现不同域名的页面的嵌套。 但是有个问题&#xff0c;就是从父页面打开iframe的子页面时&#xff0c;需要登录子页面&#xff0c;此时需要将子页面登录后的token存储到子页面的cookie中&#xff0c;方便子页面的其他接口…

Python 全栈体系【三阶】(三)

第一章 Django 七、静态文件 1. 概述 静态文件是指在WEB应用中的图像文件、CSS文件、Javascript文件。 2. 静态文件的配置 settings.py中关于静态文件的配置如下&#xff1a; STATICFILES_DIRS [BASE_DIR , static, ]STATIC_URL /static/其中&#xff1a; STATICFILES…

Vue 3 + Vite 项目中安装 Tailwind CSS

官网&#xff1a;安装 - TailwindCSS中文文档 | TailwindCSS中文网 tips&#xff1a;只按照官网的配置可能会导致样式不加载/加载不生效的问题 1、正确安装指令 npm install -D tailwindcss postcss autoprefixer npx tailwindcss init -p 自动生成 ​tailwind.config.js​…

鱼眼摄像头-opencv校准(基于棋盘+畸变表)

一&#xff1a;主要参数说明 1&#xff1a;内参矩阵K 是3*3的矩阵&#xff0c;其类似格式 Knp.array([ [389.2109574522624, 0.0, 630.2525667489842], [0.0, 388.505701978078, 360.7886749292513], [0.0, 0.0, 1.0]]) 2&#xff1a;畸变系数 针对鱼眼相机&#xff1a;…

DVWA靶场超(详细教程)--跨站攻击(XSS+CSRF)

一、XSS 反射型xss 打开dvwa的Reflected Cross Site Scripting (XSS) &#xff08;1&#xff09;low等级 查看页面源码&#xff08;ctrlu&#xff09;该界面有提交按钮和输入框 在输入框随便输入点字符&#xff0c;点击提交 可以看见输入的helloword嵌入到界面中。 View sou…

MybatisPlus的使用与详细讲解

今天我们来讲解一下Mybatis的升级版&#xff0c;就是MybatisPlus. MybatisPlus是如何获取实现CRUD的数据库表信息的&#xff1f; 默认以类名驼峰转下划线作为表名 默认把名为id的字段作为主键 默认把变量名驼峰转下划线作为表的字段名 1.MybatisPlus中比较常见的注解 TableN…

红人点集登录逆向+接口逆向:SHA256算法和Webpack反爬

&#x1f50d; 引言 红人点集采取了一系列加密和限制措施&#xff0c;主要是对于参数加密和登录token加密。今天利用Python与JavaScript逆向工程技术&#xff0c;实现逆向登录然后请求接口获取数据。 &#x1f50d; 思路与步骤详解 &#x1f527; 解密登录接口参数&#xf…

安防视频监控EasyCVR视频汇聚平台修改配置后无法启动的原因排查与解决

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台基于云边端一体化架构&#xff0c;兼容性强、支持多协议接入&#xff0c;包括国标GB/T 28181协议、部标JT808、GA/T 1400协议、RTMP、RTSP/Onvif协议、海康Ehome、海康SDK、大华SDK、华为SDK、宇视SDK、乐橙SDK、萤石云SD…

【Echarts示例】类甘特图的时间线图表

[示例] 类甘特图的时间线图表 const data [{ name: 预备阶段, start: 0, end: 2 },{ name: 战略展开, start: 2, end: 4 },{ name: 指挥所启动, start: 4, end: 6 },{ name: 电子对抗准备, start: 5.5, end: 7 },{ name: 首轮导弹发射, start: 7, end: 8.5 },{ name: 电子对抗…

Spark内核的设计原理

导读&#xff1a; 本期是DataFun深入浅出Apache Spark第一期的分享&#xff0c;主讲老师耿嘉安开场介绍了自己的从业经历&#xff0c;当前就职的数新网络与Spark相关的两款产品赛博数智引擎CyberEngine和赛博数据智能平台CyberData。 本次分享题目为《Spark内核的设计原理》&…

【测开能力提升-fastapi框架】fastapi能力提升 - 中间件与CORS

1. 中间件 1.1 介绍&#xff08;ChatGPT抄的&#xff0c;大致可以理解&#xff09; 一种机制&#xff0c;用于在处理请求和响应之前对其进行拦截、处理或修改。中间件可以在应用程序的请求处理管道中插入自定义逻辑&#xff0c;以实现一些通用的功能&#xff0c;如身份验证、…

系统架构设计师教程 第3章 信息系统基础知识-3.8 典型信息系统架构模型-解读

系统架构设计师教程 第3章 信息系统基础知识-3.8 典型信息系统架构模型-解读 3.8.1 政府信息化与电子政务3.8.1.1 电子政务的概念3.8.1.2 电子政务的内容3.8.1.2.1 政府与政府3.8.1.2.2 政府对企/事业单位3.8.1.2.3 政府对居民3.8.1.2.4 企业对政府3.8.1.2.5 居民对政府 3.8.1…

第一弹:基于ABAP OLE技术实现对服务器文件进行读写操作

前言 最近遇到这样一个需求&#xff0c;需要对BW服务器上的文件进行下载的同时写入每个用户相对应的数据。之前的服务器模版是一个死模版&#xff0c;对于这样的要求&#xff0c;我就想到了OLE技术&#xff0c;那么什么是OLE技术呢&#xff1f; 一、什么是OLE技术&#xff1f…

创建最佳实践创建 XML 站点地图--SEO

您是否正在努力让您的网站被搜索引擎索引&#xff1f;您想提高您网站的搜索引擎知名度吗&#xff1f;如果是&#xff0c;您可能会错过 XML 站点地图的重要性。XML 站点地图在改善您网站的 SEO 方面发挥着至关重要的作用。‍ XML 站点地图是您网站结构的蓝图&#xff0c;可帮助…

基于DPUSmartNic的云原生SDN解决方案

1. 方案背景与挑战 随着云计算&#xff0c;大数据和人工智能等技术的蓬勃发展&#xff0c;数据中心面临着前所未有的数据洪流和计算压力&#xff0c;这对SDN提出了更高的性能和效率要求。自云原生概念被提出以来&#xff0c;Kubernetes为云原生应用的落地提供了一个轻量级&am…

tolua++bug,int64强转double导致值不对

我C传值给lua&#xff0c;接口用的tolua。传过去值不对&#xff0c;我都懵逼了。是C强转问题。

C#中栈和堆以及修饰符

关于堆中字符串的存放 string s1"123" string s2"123" string s1"456" 此时s1输出为456 而s2仍然为123 因为在使用 String str "字符串" 的方式来创建String变量的时候&#xff0c;那么String的值便会存储在String常量池中&#x…