SpringBean管理

2023-11-07

一.什么是SpringBean?

在Spring中将管理对象称为 Bean.Bean是由一个SpringIOC容器实例化,组装和管理的对象.也就是说,Bean并不是由我们程序员编写的,而是在程序运行过程中,由Spring通过反射机制生成的.

SpringBean是Spring框架在运行时管理的对象,我们编写的大多数逻辑代码都会存放在SpringBean中.

二.SpringBean管理的内容

SpringBean的管理包括:

  • 创建一个对象

  • 提供依赖项(例如其他bean,配置属性)

  • 拦截对象方法调用以及提供额外的框架功能

  • 摧毁一个对象

三.SpringBean管理的方式

SpringBean有两种管理方式:

  • 基于XML文件的配置

  • 使用注解

SpringBean属性列表:

  • id: Bean的唯一标识符,Spring容器对Bean的配置,管理都通过该属性进行.

  • name:

    Spring容器通过此属性进行配置和管理,name属性可以为Bean指定多个名称,每个名称之间使用逗号或者分号分开

  • class: 指定Bean的实现类,它必须使用类的全限定名

  • scope: 用于设定Bean示例的作用域,其属性值如下:

    • singleton: 单例的.即只创建一个对象,在Spring启动时就会创建好.

    • prototype: 原型的.每次都会创建一个对象,在获取时才会创建.

  • constructor-arg: <Bean>元素的子元素.可以使用此元素传入构造参数进行实例化

  • property: <Bean>元素的子元素.用于调用Bean实例中的setter()方法完成属性赋值,从而完成依赖注入.

    • name属性指定Bean实例中的相应属性名

    • ref属性及value属性用于指定参数值

  • ref: <constructor-arg>,<property>等元素的属性或子元素,可以用于指定Bean工厂中某个Bean’实例的引用

  • value: <constructor-arg>,<property>等元素的属性或子元素,可以用于直接给定一个常量值

  • list: 用于封装List或数组属性的依赖注入

  • set: 用于封装Set类型属性的依赖注入

  • map: 用于封装Map类型的依赖注入

  • entry:

    元素的子元素,用于设置一个键值对,其key属性指定字符串类型的键值.ref属性或value属性直接指定其值.也可以通过ref或者value子元素指定其值.

1.使用XML文件

  • 使用xml文件进行SpringBean管理的方式很直观,但是较为麻烦我们在学习初期使用此种方式进行配置,在后期开发中建议使用注解的方式进行管理

    • 代码实现:

      <?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">
       ​
           <!--把需要Spring管理的对象进行配置-->
           <bean id="admin" class="com.ffyc.springdemo.model.Admin" scope="singleton">
       ​
               <!--通过get,set方法注入-->
               <property name="id" value="1"></property>
               <property name="name" value="飞飞"></property>
       ​
               <!--通过构造方法注入-->
               <constructor-arg name="id" value="2"></constructor-arg>
               <constructor-arg name="name" value="狗熊"></constructor-arg>
           </bean>
       </beans>
    • 注:

      • 我们在使用<property>标签进行配置时,类中必须要有get个set方法.因为<property>标签是通过类中的set方式创建对象的

      • 在使用<constructor-arg>标签时,类中可以没有get,set 方法,但是必须要有构造方法.因为此方式是通过构造方法创建对象的

2.使用注解实现

在使用注解实现Bean管理之前,我们首先要进行配置,否则Spring无法帮我们找到对应的文件

Spring注解属性列表:

注解 说明
@Component 使用在类上,用于实例化Bean
@Service 使用在service层上,用于实例化Bean
@Repository 使用在dao层上,用于实例化Bean
@Autowired 使用在字段或setter上,用于根据类型依赖注入;使用在字段上就不需要再写setter
@Qualifier 结合@Autowired一起使用,用于根据名称进行依赖注入
@Resource 相当于@Autowired+@Qualifier,按照名称进行依赖注入
@Value 注入普通属性
@Scope 标注Bean的作用范围

什么是依赖注入:

依赖注入,是IOC的一个方面,可以理解为不用我们自己创建对象,而是只需要描述它如何被创建,spring会帮我们创建,依赖外部的注入

使用注解前的配置:

1.导入注解所需的jar包: Spring的注解功能封装在aop包中,我们只需要导入Spring aop jar包即可,由于新版Spring jar包自动导入,此处我们无需再手动导入 2.在配置文件中开启扫描注解:

 <!--开启Spring注解扫描-->
     <context:component-scan base-package="com.ffyc.springdemo"></context:component-scan>

3.创建注解对象:

3.1 给实体类添加注解

 @Component(value = "admin")
 @Scope(value = "singleton")
 public class Admin {
 ​
 }

3.2 dao层

package com.ffyc.springdemo.dao;
 ​
 ​
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.stereotype.Repository;
 ​
 @Repository
 public class AdminDao {
 ​
     @Autowired
     JdbcTemplate jdbcTemplate;
 ​
     public void saveAdmin(){
         System.out.println("保存管理员");
 }
 ​

3.3 service层

package com.ffyc.springdemo.service;
 ​
 import com.ffyc.springdemo.dao.AdminDao;
 import com.ffyc.springdemo.model.Admin;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 ​
 @Service
 public class AdminService {
 ​
     @Autowired
     AdminDao adminDao;
 ​
     public void saveAdmin(){
          adminDao.saveAdmin();
     }
     
 }

测试类:

 package com.ffyc.springdemo.test;
 ​
 import com.ffyc.springdemo.service.AdminService;
 import org.junit.jupiter.api.Test;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.support.ClassPathXmlApplicationContext;
 ​
 public class Test1 {
 ​
     @Test
     public  void test() {
 ​
         ApplicationContext app = new ClassPathXmlApplicationContext("spring.xml");
         AdminService adminService = app.getBean("adminService", AdminService.class);
         adminService.saveAdmin();
     }
 }
 ​

操作结果:

 

我们可以看到使用注解的方式可以很轻松的替代原来需要在配置文件中进行的大量配置的功能.因此在后续的开发中我们也将使用注解的方式进行.但是使用注解也会有缺点,我们在下篇博客中进行分析.

四.SpringBean的生命周期

Spring中所说的bean对象,与我们new的对象是不同的,Spring中所说的bean对象是指Spring框架所创建管理的我们的对象.

从宏观上来说,bean对象的实现可以分为5个阶段:

  1. 实例化实例化 Instantiation 通过反射机制以及工厂创建出来的原始对象

  2. 属性赋值 Populate

  3. 初始化 Initialization 完成对初始对象的各种赋值,完成后就把bean对象放入容器中

  4. 将 bean 对象放入到容器中,使用

  5. 销毁 Destruction

五.Spring中的bean是线程安全的吗?

servlet对象是线程安全的吗?

不是,因为servlet对象只创建一个,多个请求访问的是同一个servlet对象,因此它不是线程安全的

Spring中的bean是否是线程安全的,需要看bean的作用于scope:

  • 如果为Singleton表示是单例的,即不是线程安全的,会使用ThreadLocal为每个请求创建一个变量副本进行操作

  • 如果为Prototype表示为原型额,是线程安全的,因为每到来一个请求就会为其创建一个bean.

bean又可以分为两种:

有状态bean和无状态bean

  • 有状态bean就是有数据存储功能,例如包含成员变量

  • 无状态bean就是没有数据存储功能,例如service层和dao层,只是方法调用.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringBean管理 的相关文章

  • Spring MVC 应用程序可以是多线程的,即使它的 servlet 不是吗?

    当您谈论 Spring 应用程序是多线程时 您是否一定是指该应用程序中定义的 servlet 是否是多线程的 或者即使应用程序中的 servlet 不是多线程 Spring 应用程序也可以配置为多线程吗 不再支持单线程 servlet 它们
  • CXF 客户端异常:{XXX} 的拦截器已引发异常,现在展开

    我遇到以下 CXF 异常 warning Interceptor for http example com wsdl esc 2011 12 12 AmazonEC2 http example com wsdl esc 2011 12 12
  • Hazelcast Jet 变更数据捕获

    我在我的应用程序中使用 Hazelcast 更改数据捕获 CDC 我使用 CDC 的原因是 如果使用 jdbc 或其他替代功能将数据加载到缓存中 会花费大量时间 所以CDC将在数据库和 Hazelcast Jet 之间进行数据同步 Stre
  • Java GUI,根据actionListener更改面板

    我在两个不同的面板中添加了两个按钮 如果单击第一个按钮 则需要转到下一个面板 其中包含第二个按钮 但是当我单击第一个按钮时 该按钮没有被替换 Java GUI import java awt event ActionEvent import
  • 椭圆与椭圆如何相交?

    我用的是JAVA Ellipse2D s1 new Ellipse2D Float 0 0 100 100 System out println s1 intersects 99 30 100 100 应该返回 false 但它返回 tru
  • Mac OSX 上使用 Java 7 的透明 JFrame/JWindow

    我们有一个屏幕共享小程序 它打开 Swing JFrame 并使用 Robot 类捕获空框架后面的屏幕 用户可以单击框架并与小程序后面的任何内容进行交互 这在 Windows 上运行良好 并且用于 Apple 的 Java 版本 但对于 M
  • 查找前 N 个五边形数

    我必须找到第一个N pentagonal numbers 1 从 1 100 并每行显示 10 个 我必须使用getPentagonalNumber int n 方法也是如此 显然这就是它存在的原因 到目前为止 这是我的代码 package
  • 如何更改使用 Google ReCaptcha 版本 2 时的错误消息?

    当为 Google ReCaptcha 版本 2 选择多张照片时 会显示以下错误消息 需要多个正确的解决方案 请解决更多 如何将错误消息更改为我网站上的自定义消息 这是图像 我认为不可能在服务器端 在谷歌 进行 这可以在客户端通过利用 js
  • Android Studio安装JDK错误

    In Android Studio I am facing bellow error 当我按下时会显示此弹出窗口Alt Enter对于缺少的类 符号 当我点击 setup SDK 时 它显示两个选项 1 8 Java版本 1 8 0 60
  • 公交车公共交通算法

    我正在开发一个可以查找公交路线的离线 C 应用程序 我可以提取时间表 巴士 路线数据 我正在寻找适用于基本数据的最简单的解决方案 可以使用什么算法来查找从巴士站 A 到巴士站 B 的路线 是否有适用于 C Java 的开源解决方案 数据库的
  • Spring 4 MVC 和 Websockets - 没有合适的默认 RequestUpgradeStrategy

    我需要 Websockets 在我的应用程序中进行实时更新 所以我找到了这个例子并一步一步地做到了here http raymondhlee wordpress com 2014 01 19 using spring 4 websocket
  • 选择活动时运行时崩溃

    首先我想说我几乎没有 Android 经验 这是我在 Android 中的第一个项目 而且我的老师不太擅长教学 所以我对任何过度的无知表示歉意 在进一步讨论之前先解释一下 我的应用程序的目标本质上是能够记录您在某些活动上花费了多少时间 记录
  • 如果使用 Maven,是否应该忽略 VCS 中 Eclipse 特定的文件?

    我知道为什么不将 Eclipse IDE 特定的文件提交到像 Git 我实际上正在使用的 这样的 VCS 中 这就是我使用 Maven 并让它为您生成这些文件的原因之一not将它们置于版本控制之下 但我想知道 是否应该在 gitignore
  • 使用用户名和密码登录 LinkedIn 失败

    LinkedIn使用oauth登录其api 服务器中无法登录api 我尝试使用http请求登录linkedin并获取oauth verifier 但我得到了这样的回应 很抱歉 出现了问题 你的申请 请确保您 启用cookie并重试 或点击此
  • 为什么我得到:没有有效的 JFX 运行时

    我有一个使用 java 1 6 编译并使用 jnlp webstart 运行的现有应用程序 如果我使用 JRE 1 6 从客户端运行此应用程序 一切都会很好 但是 当我使用 java JDK 7 编译代码并使用 JRE 1 7 67 运行客
  • spring 中的事件监听器被调用两次

    我在我的 Web 应用程序中遇到了 Spring 事件监听器的问题 任何立即帮助将不胜感激 如果我有循环依赖 事件监听器会注册并调用两次 我有服务类 它在另一个方法上有 transaction 注释 Service PBSTaskServi
  • 尝试 Catch 性能 Java

    当捕获异常而不是进行检查时 try catch 需要多长时间 以纳秒为单位 假设消息具有用于查找的 HashMap 类型性能 try timestamp message getLongField MessageField TIMESTAMP
  • Mac 上的 JavaFX WebView 字体问题

    有些网站显示乱码而不是正确的文本 它只发生在 Mac 上 For example with GMapsFX 可能与 OS X 10 11 或 10 12 有关 我用Java 1 8 0 121测试了它 此问题有任何修复或解决方法吗 就我而言
  • 如何在android中使用Room Persistence ORM工具实现created_at和updated_at列

    我该如何实施created at and updated at在Android中使用Room Persistence ORM工具的列 可以在创建或更新表中的行时自动更新时间戳 我研究了很多网站 但仍然没有找到任何可以处理的结果middlew
  • 应用服务器如何注入私有字段?

    我看到这个问题 注入私有 包或公共字段或提供 setter https stackoverflow com questions 2021716 inject into private package or public field or p

随机推荐

  • springMVC ResponseBody 返回汉字乱码解决方案

    本文查考借鉴 http blog yimik com archives 899 js里通过ajax调用springmvc 后台返回的中文字符串乱码 通过搜索找解决方 大都让配置StringHttpMessageConverter这个bean
  • 本地JAR打镜像,并启动

    1 准备好jar 和Dockerfile文件 2 使用命令打镜像 docker build t wstest 3 查看镜像 4 由于服务是两个端口 使用以下命令 5 优化怎么随着docker的开启而启动 docker run restart
  • Maltrail恶意流量检测系统

    Maltrail恶意流量检测系统 项目介绍 项目GitHub地址 项目架构 项目数据集 运行方式 订阅源扩展 数据采集模块提取 项目介绍 maltrail是一款轻量级的恶意流量检测系统 其工作原理是通过采集网络中各个开源黑样本 包括IP 域
  • python操作sql

    from pymysql import connect def main 创建connection连接 conn connect host localhost port 3306 user root password 123456 data
  • 深入浅出UML类图(一)

    在UML 2 0的13种图形中 类图是使用频率最高的UML图之一 Martin Fowler在其著作 UML Distilled A Brief Guide to the Standard Object Modeling Language
  • Redis中key-value实现

    实现字典的方法有很多种 最简单的就是使用链表或数组 但是这种方式只适用于元素个数不多的情况下 要兼顾高效和简单性 可以使用哈希表 如果追求更为稳定的性能特征 并且希望高效地实现排序操作的话 则可以使用更为复杂的平衡树 在众多可能的实现中 R
  • JAVA8新特性--集合遍历之forEach

    java中的集合有两种形式Collection
  • 5.2 activiti任务监听器TaskListener

    1 任务监听器定义 任务监听器用于在特定的任务相关事件发生时 执行自定义的Java逻辑或表达式 2 监听器监听的事件 String EVENTNAME CREATE create 创建 当任务已经创建 并且所有任务参数都已经设置时触发 St
  • Basic Level 1090 危险品装箱 (25分)

    题目 集装箱运输货物时 我们必须特别小心 不能把不相容的货物装在一只箱子里 比如氧化剂绝对不能跟易燃液体同箱 否则很容易造成爆炸 本题给定一张不相容物品的清单 需要你检查每一张集装箱货品清单 判断它们是否能装在同一只箱子里 输入格式 输入第
  • Linux期末复习总结

    目录 Linux 系统的结构 shell Linux用户类型及其用户主目录 shell提示符 输入输出重定向 标准输入 输出设备 Linux文件的类型 Linux 的目录结构 基本操作命令 链接命令 ln 链接的特点 tar命令举例 vi
  • 求一批整数中出现最多的各位数字

    描述 给定一批整数 分析每个整数的每一位数字 求出现次数最多的各 位数字 例如给定3个整数1234 2345 3456 其中出现最多次数的数字是3和4 均出现了3次 输入 输入在第1行中给出正整数N 1000 在第二行中给出N个不超过整型范
  • QT QLinearGradient (颜色渐变---应用控件背景渐变)

    示例 frame gt setStyleSheet background color qlineargradient spread pad x1 0 y1 0 x2 1 y2 0 stop 0 030303 stop 0 5 030303
  • 多线程及多进程的选择

    我的理解是进程是指在系统中正在运行的一个应用程序 程序一旦运行就是进程 或者更专业化来说 进程是指程序执行时的一个实例 线程是进程的一个实体 进程 资源分配的最小单位 线程 程序执行的最小单位 线程进程的区别体现在几个方面 0 因为进程拥有
  • 【手撕代码系列】JS手写实现bind方法

    公众号 Code程序人生 分享前端所见所闻 在JavaScript中 bind方法允许我们绑定函数的上下文并返回一个新的函数 在这篇文章中 我们将手写实现bind方法 以更好地了解它的内部工作原理 bind方法的语法 bind方法的语法如下
  • 整数转化为罗马数字

    1 问题描述 罗马数字包含以下七种字符 I V X L C D 和 M 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如 罗马数字 2 写做 II 即为两个并列的 1 12 写做 XII 即为 X
  • 多线程互斥锁 pthread_mutex 的使用及初始化问题

    一 互斥锁pthread mutex的使用 1 初始化锁 有两种方法初始化互斥锁 静态方式和动态方式 静态方式 pthread mutex t mutex lock PTHREAD MUTEX INITIALIZER 在LinuxThrea
  • 软件测试流程/需求分析之软件需求概述

    今天重点从四个方面来和大家对需求阶段需求分析做一个讲解 阅读测试文档 参与需求评审 测试需求分析 提取功能点 去做这些对应的事情之前 我们要先了解到底什么是需求 需求评审我们要从哪些点去评审 我们要去提取功能点要怎么样去进行提取 回忆测试流
  • 使用ffmpeg将mkv,rmvb转换成mp4

    cmd输入ffmpeg version 检查ffmpeg安装版本 1 进入mkv rmvb所在的文件夹 2 转换mkv ffmpeg i inputname mkv c v copy c a copy outputname mp4 转换rm
  • 几种优化算法(求最优解)

    几种优化算法 先简单备注下 今后接触到再看 参考资料 http blog sina com cn s blog 6a1bf1310101hhta html
  • SpringBean管理

    一 什么是SpringBean 在Spring中将管理对象称为 Bean Bean是由一个SpringIOC容器实例化 组装和管理的对象 也就是说 Bean并不是由我们程序员编写的 而是在程序运行过程中 由Spring通过反射机制生成的 S