Spring入门案例--bean基础配置

bean基础配置(id与class)   

对于bean的基础配置,在前面的案例中已经使用过:

1 <bean id="" class=""/>

其中,bean标签的功能、使用方式以及id和class属性的作用,我们通过一张图来描述下

 这其中需要大家重点掌握的是:bean标签的id和class属性的使用

思考:

class属性能不能写接口如BookDao的类全名呢?

答案肯定是不行,因为接口是没办法创建对象的。

前面提过为bean设置id时,id必须唯一,但是如果由于命名习惯而产生了分歧后,该如何解决?

在解决这个问题之前,我们需要准备下开发环境,对于开发环境我们可以有两种解决方案:

使用前面IOC和DI的案例

重新搭建一个新的案例环境,目的是方便大家查阅代码

搭建的内容和前面的案例是一样的,内容如下:

 bean的name属性  

环境准备好后,接下来就可以在这个环境的基础上来学习下bean的别名配置,

首先来看下别名的配置说明:

步骤1:配置别名  

bean之间的别名用name属性,多个别名之间用空格,分割

打开spring的配置文件applicationContext.xml

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

2 <beans xmlns="http://www.springframework.org/schema/beans"

3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

4        xsi:schemaLocation="http://www.springframework.org/schema/beans 

http://www.springframework.org/schema/beans/spring-beans.xsd">

5  

6     <!--name:为bean指定别名,别名可以有多个,使用逗号,分号,空格进行分隔-->

7     <bean id="bookService" name="service service4 bookEbi" 

class="com.itheima.service.impl.BookServiceImpl">

8         <property name="bookDao" ref="bookDao"/>

9     </bean>

10  

11     <!--scope:为bean设置作用范围,可选值为单例singloton,非单例prototype-->

12     <bean id="bookDao" name="dao" class="com.itheima.dao.impl.BookDaoImpl"/>

13 </beans>

说明:Ebi全称Enterprise Business Interface,翻译为企业业务接口

 步骤2:根据名称容器中获取bean对象  

1 public class AppForName {

2     public static void main(String[] args) {

3         ApplicationContext ctx = new 

ClassPathXmlApplicationContext("applicationContext.xml");

4         //此处根据bean标签的id属性和name属性的任意一个值来获取bean对象
5         BookService bookService = (BookService) ctx.getBean("service4");

6         bookService.save();

7     }

8 }

 当然这个ref也能使用name为联系 

步骤3:运行程序  

测试结果为:

 注意事项:

bean依赖注入的ref属性指定bean,必须在容器中存在

 如果不存在,则会报错,如下:

 这个错误大家需要特别关注下:

 获取bean无论是通过id还是name获取,如果无法获取到,将抛出异常
NoSuchBeanDefinitionException

bean作用范围scope配置  

关于bean的作用范围是bean属性配置的一个重点内容。

看到这个作用范围,我们就得思考bean的作用范围是来控制bean哪块内容的?

我们先来看下bean作用范围的配置属性:

验证IOC容器中对象是否为单例  

验证思路  

同一个bean获取两次,将对象打印到控制台,看打印出的地址值是否一致。

具体实现  

创建一个AppForScope的类,在其main方法中来验证

1 public class AppForScope {

2     public static void main(String[] args) {

3         ApplicationContext ctx = new 

4             ClassPathXmlApplicationContext("applicationContext.xml");

5  

6         BookDao bookDao1 = (BookDao) ctx.getBean("bookDao");

7         BookDao bookDao2 = (BookDao) ctx.getBean("bookDao");

8         System.out.println(bookDao1);

9         System.out.println(bookDao2);

10     }

11 }

打印,观察控制台的打印结果

 结论:默认情况下,Spring创建的bean对象都是单例的

获取到结论后,问题就来了,那如果我想创建出来非单例的bean对象,该如何实现呢?

配置bean为非单例  

在Spring配置文件中,配置scope属性来实现bean的非单例创建

在Spring的配置文件中,修改<bean>的scope属性

1 <bean id="bookDao" name="dao" class="com.itheima.dao.impl.BookDaoImpl" 

scope=""/>

将scope设置为singleton

1 <bean id="bookDao" name="dao" class="com.itheima.dao.impl.BookDaoImpl" 

scope="singleton"/>

运行AppForScope,打印看结果

将scope设置为prototype

1 <bean id="bookDao" name="dao" class="com.itheima.dao.impl.BookDaoImpl" 

scope="prototype"/>

运行AppForScope,打印看结果

 将bean的作用域设置为prototype那么就是非单例,也就是俩个不同的地址值 

结论,使用bean的scope属性可以控制bean的创建是否为单例:

  • singleton默认为单例
  • prototype为非单例

scope使用后续思考  

介绍完scope属性以后,我们来思考几个问题:

为什么bean默认为单例?

  • bean为单例的意思是在Spring的IOC容器中只会有该类的一个对象
  • bean对象只有一个就避免了对象的频繁创建与销毁,达到了bean对象的复用,性能高

bean在容器中是单例的,会不会产生线程安全问题?

  • 如果对象是有状态对象,即该对象有成员变量可以用来存储数据的,
  • 因为所有请求线程共用一个bean对象,所以会存在线程安全问题。
  • 如果对象是无状态对象,即该对象没有成员变量没有进行数据存储的,
  • 因方法中的局部变量在方法调用完成后会被销毁,所以不会存在线程安全问题。

哪些bean对象适合交给容器进行管理?

  • 表现层对象
  • 业务层对象
  • 数据层对象
  • 工具对象

哪些bean对象不适合交给容器进行管理?

封装实例的域对象,因为会引发线程安全问题,所以不适合。

bean基础配置小结  

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux应用编程(进程)

一、进程与程序 注册进程终止处理函数 atexit() #include <stdlib.h> int atexit(void (*function)(void));使用该函数需要包含头文件<stdlib.h>。 函数参数和返回值含义如下&#xff1a; function&#xff1a;函数指针&#xff0c;指向注册的函数&#xff0c;此…

leetcode160. 相交链表

给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 注意&#xff0c;函数返回结果后&…

软件测试工程师需要达到什么水平才能顺利拿到 20k 无压力?

最近有粉丝朋友问&#xff1a;软件测试员需要达到什么水平才能顺利拿到 20k 无压力&#xff1f; 这里写一篇文章来详细说说&#xff1a; 目录 扎实的软件测试基础知识&#xff1a;具备自动化测试经验和技能&#xff1a;熟练掌握编程语言&#xff1a;具备性能测试、安全测试、全…

flv怎么无损转换成mp4格式,3大超级方法分享

flv格式是目前在视频分享媒体播放网站上广泛使用的一种视频文件格式&#xff0c;可以在网站窗口中直接播放&#xff0c;这类视频文件还能够有效保护版权。但是有些时候我们可能需要将flv格式的视频转换为其他格式&#xff0c;比如mp4。但是该怎么操作呢&#xff1f; 其实有很多…

【花雕学AI】深度挖掘ChatGPT角色扮演的一个案例—CHARACTER play : 莎士比亚

CHARACTER play : 莎士比亚 : 52岁&#xff0c;男性&#xff0c;剧作家&#xff0c;诗人&#xff0c;喜欢文学&#xff0c;戏剧&#xff0c;爱情 : 1、问他为什么写《罗密欧与朱丽叶》 AI: 你好&#xff0c;我是莎士比亚&#xff0c;一位英国的剧作家和诗人。我很高兴你对我的…

【状态估计】用于描述符 LTI 和 LPV 系统的分析、状态估计和故障检测的算法(Matlab代码实现)

&#x1f4a5; &#x1f4a5; &#x1f49e; &#x1f49e; 欢迎来到本博客 ❤️ ❤️ &#x1f4a5; &#x1f4a5; &#x1f3c6; 博主优势&#xff1a; &#x1f31e; &#x1f31e; &#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 …

一文看懂数据云平台的“可观测性”技术实践

背景 这是一家大型制造集团。为监控及预测工厂设备运行情况&#xff0c;IT部门在数据云平台DataSimba上按天执行数据作业&#xff0c;每24小时对工厂设备的日志数据进行分析&#xff0c;发现能对业务起到很好的辅助作用&#xff0c;效果不错。 “要不升级为每1个小时跑一次&am…

腾讯云轻量级云服务器Centos7防火墙开放8080端口

腾讯云轻量级云服务器Centos7防火墙开放8080端口 一、centos7防火墙打开端口 因为Centos7以上用firewalld代替了iptables,也就是说firewalld开通了8080端口应该就行了 1.查看8080是否已经放开 sudo firewall-cmd --permanent --zonepublic --list-ports2.查看防火墙状态 s…

EMQX vs NanoMQ | 2023 MQTT Broker 对比

引言 EMQX 和 NanoMQ 都是由全球领先的开源物联网数据基础设施软件供应商 EMQ 开发的开源 MQTT Broker。 EMQX 是一个高度可扩展的大规模分布式 MQTT Broker&#xff0c;能够将百万级的物联网设备连接到云端。NanoMQ 则是专为物联网边缘场景设计的轻量级 Broker。 本文中我们…

SpringCloud 项目如何方便 maven 打包以及本地开发

一、背景 springcloud-alibaba &#xff0c;使用 nacos 做配置中心&#xff0c;maven 作为构建工具。为了防止 test 、prod 环境配置文件覆盖问题&#xff0c;使用 mvn -P 命令。 二、项目 pom 文件 1. 利用 resources 标签来指定目录&#xff0c;build > resources 标签&a…

MySQL-CENTOS7下MySQL单实例安装

MySQL单实例安装 1 版本下载2 MySQL安装2.1 创建目录并解压2.2 安装数据库2.3 安装RPM包2.4 启动服务2.5 连接MYSQL 3 MYSQL卸载卸载4 FAQ 1 版本下载 mysql下载 选择对应的版本。我选择的是的8.0.31的版本。 2 MySQL安装 2.1 创建目录并解压 mkdir /mysql mkdir /mysql/s…

OpenAI-ChatGPT最新官方接口《错误代码大全》全网最详细中英文实用指南和教程,助你零基础快速轻松掌握全新技术(九)(附源码)

Error codes 错误码 前言Introduction 导言API errors API 错误401 - Invalid Authentication 401 -验证无效401 - Incorrect API key provided 401 -提供的API密钥不正确401 - You must be a member of an organization to use the API 401 -您必须是组织的成员才能使用API429…

公司招人,面试了50+的候选人,技术实在是太烂了····

前两个月&#xff0c;公司测试岗位面了 50候选人&#xff0c;面试下来发现几类过不了的情况&#xff0c;分享大家防止踩坑&#xff1a; 技术倒是掌握得挺多&#xff0c;但只是皮毛&#xff0c;基础知识却是一塌糊涂。工作多年&#xff0c;从未学习过工作之外的技术栈&#xff…

【项目】视频列表滑动,自动播放

自动播放 期望效果&#xff0c;当滑动列表结束后&#xff0c;屏幕中间的视频自动播放HTML页面data变量实践操作&#xff01;重点来了&#xff01;滚动获得的数据实现效果源码&#xff08;粘贴即可运行&#xff09; 期望效果&#xff0c;当滑动列表结束后&#xff0c;屏幕中间的…

Gartner Magic Quadrant for SD-WAN 2022 (Gartner 魔力象限:软件定义广域网 2022)

Gartner 魔力象限&#xff1a;SD-WAN 2022 请访问原文链接&#xff1a;https://sysin.org/blog/gartner-magic-quadrant-sd-wan-2022/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org Gartner 魔力象限&#xff1a;SD-WAN 2022…

完美解决丨 - [SyntaxError: invalid syntax](#SyntaxError-invalid-syntax)

目录 报错名称 SyntaxError: invalid syntaxNameError: name xx is not definedIndentationError: expected an indented blockAttributeError: xx object has no attribute xxTypeError: xx object is not callableValueError: I/O operation on closed fileOSError: [Errno 2…

记一次mysql cpu 异常升高100%问题排查

此服务器为一个从库&#xff0c;用于数据的导出业务&#xff0c;服务器配置较低&#xff0c;日常的慢sql也比较多。 上午11点左右cpu异常告警&#xff0c;如下图所示&#xff0c; cpu使用率突增到50%&#xff0c;下午2点左右突增到100% &#xff0c;登录服务器top命令查看cpu升…

关于编译的重要概念总结

文章目录 什么是GNU什么是GCC / Ggcc / g编译的四个阶段gcc和g的主要区别 MinGW-w64C语言版本C 98C 11C 14C 17C 20 Makefilecmake 回想初学编程的时候&#xff0c;大部分人都是从C语言开始学起的&#xff0c;除了一些常见的语法和思想&#xff0c;一些基础知识常常被人们忽略&…

记一次从JS到内网的横向案例

前言 前段时间参加了一场攻防演练&#xff0c;使用常规漏洞尝试未果后&#xff0c;想到不少师傅分享过从JS中寻找突破的文章&#xff0c;于是硬着头皮刚起了JS&#xff0c;最终打开了内网入口获取了靶标权限和个人信息。在此分享一下过程。 声明&#xff1a;本次演练中&#xf…

ROS学习第二十四节——rosbag

1 rosbag使用_命令行 需求: ROS 内置的乌龟案例并操作&#xff0c;操作过程中使用 rosbag 录制&#xff0c;录制结束后&#xff0c;实现重放 实现: 1.准备 创建目录保存录制的文件 mkdir ./xxx cd xxx2.开始录制 -a:all&#xff0c;录制所有话题消息 -o:out&#xff0c…