首页 > 其他分享 >(十一)Spring教程——Bean基本配置与依赖注入之属性注入

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

时间:2024-07-22 23:27:13浏览次数:10  
标签:Spring Bean 注入 Car 构造函数 属性

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的配置是没有问题的。

标签:Spring,Bean,注入,Car,构造函数,属性
From: https://blog.csdn.net/andy987650628/article/details/140621524

相关文章

  • SQL注入之waf绕过
    SQL注入之waf绕过(safedog)本地部署apache和safedog后,对sqllab的一个实验payload:?id=1'and1=1--+,发现被拦截了,但是不知道拦截的关键词是什么这里把1=1删了试试发现有报错,再加上1=1但是不加空格试试。报错了,这里可能是识别到and后紧跟空格和字符的模式,并把它过滤掉了pa......
  • 05document转为BeanDefinition并注册过程
    接着之前的文章4继续分析,文章4里的步骤七里xmlReader(XmlBeanDefinitionReader)的registerBeanDefinitions(doc,resource)方法里最终走到调用他的好友documentReader.registerBeanDefinitions(doc,createReaderContext(resource))方法Ⅰ、代码流程一、程序入口位于documentRea......
  • 使用Java和Spring Retry实现重试机制
    使用Java和SpringRetry实现重试机制大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天,我们将探讨如何在Java中使用SpringRetry来实现重试机制。重试机制在处理临时性故障和提高系统稳定性方面非常有用。一、SpringRetry简介SpringRetry是Spring框......
  • 在Spring Boot中实现API网关与路由
    在SpringBoot中实现API网关与路由大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天我们将探讨如何在SpringBoot中实现API网关与路由。API网关是一种用于管理和路由请求的中间层,它可以集中处理认证、路由、负载均衡、缓存等功能。SpringCloudGateway......
  • 使用Java和Spring WebFlux构建响应式微服务
    使用Java和SpringWebFlux构建响应式微服务大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天我们将探讨如何使用Java和SpringWebFlux构建响应式微服务。SpringWebFlux是Spring框架的一部分,专为创建响应式应用程序而设计。在这篇文章中,我们将介绍如何......
  • 基于springboot的水产养殖系统
    博主介绍:java高级开发,从事互联网行业六年,熟悉各种主流语言,精通java、python、php、爬虫、web开发,已经做了多年的设计程序开发,开发过上千套设计程序,没有什么华丽的语言,只有实实在在的写点程序。......
  • java毕业设计-基于springboot+vue的校园二手交易系统,基于java的校园二手交易系统,基于j
    文章目录前言演示视频项目背景项目架构和内容获取(文末获取)具体实现截图前台功能管理后台技术栈具体功能模块设计系统需求分析可行性分析系统测试为什么我?关于我我自己的网站前言博主介绍:✌️码农一枚,专注于大学生项目实战开发、讲解和毕业......
  • 初用IDEA的springboot第五步
    使用日志先配置文件,在resources下新建一个log4j.properties,将以下内容粘贴进去##设置###stdout,log4j.rootLogger=all,D,E,stdout##输出信息到控制台###log4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appe......
  • 基于java+springboot+vue实现的公司日常考勤系统(文末源码+Lw)132
     基于SpringBoot+Vue的实现的公司日常考勤系统(源码+数据库+万字Lun文+流程图+ER图+结构图+开题报告+演示视频+软件包)选题背景及意义:分析企业的考勤管理系统过程可以看到,考勤管理系统中主要要解决的是:1.考勤信息的管理;2.考勤、出勤信息的请假及申请;3.给系统设定用户登录权......
  • Springboot宠物领养商城
    详细运行视频地址宠物领养商城_哔哩哔哩_bilibili1.可注册可登录2.首页-》可浏览热销商品,可查看用户发布的帖子,可查看热门资讯3.宠物商城-》宠物详情,可购买,可加入购物车,可展示评价4.宠物领养-》可查看用户发布的领养的帖子,可留言评论5.平台资讯-》可查看管理员发布的资讯......