Spring学习笔记(三)--Spring中的Bean的管理

一、什么是Bean

Bean是注册到Spring容器中的Java类,控制反转和依赖注入都是通过Bean实现的,任何一个Java类都可以是一个Bean。Bean由Spring进行管理,可以通过xml文件对bean进行配置和管理。

二、BeanFactory接口和ApplicationContext接口

Spring提供了几个BeanFactory接口的实现类,其中最常用的是XmlBeanFactory,它可以读取XML文件并根据XML文件中的配置信息生成BeanFactory接口的实例,BeanFactory接口的实例用于管理Bean。XmlBeanFactory类读取XML文件生成BeanFactory接口实例的具体语法格式:

在测试代码中:

BeanFactory beanFactory=new XmlBeanFactory(new FileSystemResource(”bean.xml”));

ApplicationContext接口建立在BeanFactory接口的基础之上,它丰富了BeanFactory接口的特性,例如,添加了对国际化、资源访问、事件传播等方面的支持。

ApplicationContext接口可以为单例的Bean实行预初始化,并根据<property>元素执行setter方法,单例的Bean可以直接使用,提升了程序获取Bean实例的性能。

ApplicationContext接口的常用实现类:

在测试代码中:

 // 如加载applicationBean1.xml配置
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationBean1.xml");                                 

然后再 通过创建的容器对象获取配置中bean1的实例 

 如: Bean1 bean=(Bean1) applicationContext.getBean("bean1");

三、Bean的两种配置方式

Spring容器支持XML和Properties两种格式的配置文件,在实际开发中,最常用的是XML格式的配置文件XML是标准的数据传输和存储格式,方便查看和操作数据。在Spring中,XML配置文件的根元素是<beans>,<beans>元素包含<bean>子元素,每个<bean>子元素可以定义一个Bean,通过<bean>元素将Bean注册到Spring容器中。

普通的Bean通常只需定义id(或者name)和class两个属性

<bean>元素的常用属性:

元素

描述

<constructor-arg>

使用<constructor-arg>元素可以为Bean的属性指定值。使用构造方法注入时

<property>

<property>元素的作用是调用Bean实例中的setter方法完成属性赋值,从而完成依赖注入。属性setter方法在bean中注入时使用

ref

ref是<property>、<constructor-arg>等元素的属性,可用于指定Bean工厂中某个Bean实例的引用;也可用于指定Bean工厂中某个Bean实例的引用。

value

value是<property>、<constructor-arg>等元素的属性,用于直接指定一个常量值;也可以用于直接指定一个常量值。

<list>

<list>元素是<property>等元素的子元素,用于指定Bean的属性类型为List或数组。

<set>

<set>元素是<property>等元素的子元素,用于指定Bean的属性类型为set。

<map>

<map>元素是<property>等元素的子元素,用于指定Bean的属性类型为Map。

<entry>

<entry>元素是<map>元素的子元素,用于设定一个键值对。<entry>元素的key属性指定字符串类型的键。

四、Bean的实例化: 

在学习静态工厂实例化、实例工厂方式实例化前先了解什么是工厂模式

工厂模式:工厂提供服务(方法),客户只需要满足服务的条件即可,解耦很明显,这里自己的责任自己负责,每一环没有必要关心另一环的逻辑实现。

什么是工厂:(针对接口编程,不针对实现编程):用于封装创建对象的代码,负责处理创建对象的细节的类被称为工厂(Factory)

使用工厂模式的优点:将创建对象的代码集中在一个对象或方法中,避免代码中的重复,便于以后的维护

静态工厂和实例工厂区别:静态工厂指的是工厂的服务是静态的,也就是工厂提供的方法是static的,那么这些方法仅有工厂提供以及管理更新等,跟客户端或者说调用端是没有关系的;实例工厂指的是工厂提供的方法服务室非static的,那么客户端或者调用端是需要自己创建工厂对象然后去调用工厂中的方法或者服务的,那么管理这些方法或者服务相当于是客户端了。所以静态工厂和实例工厂主要是实际参与管理工厂管理者的不同,其次实例工厂设计相对灵活,客户端与工厂都可以参与管理设计,静态工厂相对正式死板

  1.  静态工厂方法:工厂初始化之前,工厂中的类已经被实例化放在工厂容器中直接调用静态方法可以返回Bean的实例
  2.  实例工厂方法:工厂在构造方法初始化时,会将类进行实例化放在工厂中即调用工厂本身,再调用工厂的实例方法来返回bean实例  

构造器实例化(默认)、静态工厂实例化、实例工厂方式实例化。

构造器实例化:

xml配置文件:

 

id唯一,calss指定Bean具体实现类,必须是完整的类名,可以在Bean1.java文件中右击“public class Bean1”中的Bean1,选中Copy Qualifiel Name得到。注意这里用"."分隔。

静态工厂实例化:(比构造器实例化多一个静态工厂类)

xml配置文件:

id唯一,class为工厂方法类,factory-method值为方法名,确定使用了工厂中的哪个方法。

静态工厂类:

 静态方法返回一个Bean2对象。

实例工厂实例化:

xml配置文件:

 两个bean第一个为静态工厂,class为静态工厂类。第二个为bean3,factory-bean属性配置实例工厂,factory-method确定使用工厂中哪个方法。

工厂类:

 返回一个Bean3对象。

三种方法区别:

五、基于XML的两种装配方式(详见Spring学习(二)笔记)

基于XML的装配就是读取XML配置文件中的信息完成依赖注入,Spring容器提供了两种基于XML的装配方式,属性setter方法注入和构造方法注入,我们在Spring学习(二)的笔记中有介绍

注意

属性setter方法注入要求一个Bean必须满足以下两点要求。

        (1)Bean类必须提供一个默认的无参构造方法。

        (2)Bean类必须为需要注入的属性提供对应的setter方法。

使用构造方法注入时,在配置文件里,需要使用<bean>元素的子元素<constructor-arg>来定义构造方法的参数,例如,可以使用其value属性(或子元素)来设置该参数的值。

六、基于注解的装配

装配就是给Spring的对象赋值,注解方式是最常见的方式

1、在pom.xml中添加注解所需要的依赖

<dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>5.2.8.RELEASE</version></dependency>

2、在applicationContext.xml文件中引入Context约束并启动Bean的自动扫描功能。

   <!-- 使用context命名空间,在配置文件中开启相应的注解处理器 --><context:component-scan base-package="com.itheima" />

3、Spring的常用注解

对象创建用到的注解

@Component用于非三层(在pojo类中使用)

@Controller用于web控制层

@Service用于service业务逻辑层

@Repository用于Dao数据访问层

可以跨层使用,混用不会报错但是不符合企业开发的规范

依赖注入用到的注解

@Value给基本属性赋值例如: 

@Value("1")

    private int id;

    @Value("张三")

    private String name;

    @Value("123")

    private String password;

@Resource通过name属性指向bean的唯一标识进行赋值,例如:   

//使用@Resource注解注入UserDao,name的值看@Repository注解的赋值

        写法:@Resource(name="userDao")

                private UserDao userDao;

@Autowired不需要指向任何标识根据类型自动注入进行赋值(自动装配用的最多)

@Qualifier指定要自动装配的对象名称,通常与@Autowired联合使用

在Bean的作用域中使用的注解

@Scope指定Bean实例的作用域(通常有两个属性,单例与多例默认为前者,在pojo类中使用)如:@Scope("singleton")

在Bean的生命周期中常使用的注解

@PostConstruct指定Bean实例完成初始化后调用的方法。

@PreDestroy指定Bean实例销毁前调用的方法。

七、Bean的生命周期

Bean的生命周期是指Bean实例被创建、初始化和销毁的过程。在Bean的两种作用域singleton和prototype中,Spring容器对Bean的生命周期的管理是不同的。在singleton作用域中,Spring容器可以管理Bean的生命周期,控制着Bean的创建、初始化和销毁。在prototype作用域中,Spring容器只负责创建Bean实例,不会管理其生命周期。

两个时间节点:Bean实例初始化后和Bean实例销毁前

监控两个节点的方式:一种是使用XML配置文件,一种是使用注解,我们学习基于注解的方式

在pojo类中:

 @PostConstruct

    public void init(){System.out.println("Bean的初始化完成,调用init()方法"); }

    @PreDestroy

    public void destroy(){System.out.println("Bean销毁前调用destroy()方法");

在测试中:

//初始化自动完成

  //销毁Spring容器中的所有Bean

    AbstractApplicationContext ac=(AbstractApplicationContext)

            applicationContext;

           ac.registerShutdownHook();

八、总结

1、首先介绍了Spring IoC容器,包括BeanFactory接口和ApplicationContext接口

2、其次介绍了Bean的两种配置方式:支持XML和Properties,介绍了xml配置中XML配置文件的根元素<beans>中<bean>子元素的常用属性;

3、接着学习了Bean 的3种实例化方法,包括构造方法实例化、静态工厂实例化和实例工厂实例化

4、然后学习了Bean的作用域,包括singleton作用域和prototype作用域;

5、接着学习了Bean的3种装配(即赋值)方式,包括基于XML的装配、基于注解的装配和自动装配

6、最后学习了Bean的生命周期

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

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

相关文章

重新安装VSCode后,按住Ctrl(or Command) 点击鼠标左键不跳转问题

重新安装VSCode后&#xff0c;按住Ctrl&#xff08;or Command&#xff09; 点击鼠标左键不跳转问题 原因&#xff1a;重新安装一般是因为相应编程语言的插件被删除了或还没有下载。 本次是由于Python相关的插件被删除了&#xff0c;因此导致Python无法跳转。 解决办法 在vs…

船运物流管理系统|基于springboot船运物流管理系统设计与实现(源码+数据库+文档)

船运物流管理系统目录 目录 基于springboot船运物流管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、管理员登录 2、货运单管理 3、公告管理 4、公告类型管理 5、新闻管理 6、新闻类型管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 …

ElasticSearch语法

Elasticsearch 概念 入门学习: Index索引>MySQL 里的表(table)建表、增删改查(查询需要花费的学习时间最多)用客户端去调用 ElasticSearch(3 种)语法:SQL、代码的方法(4 种语法) ES 相比于 MySQL&#xff0c;能够自动帮我们做分词&#xff0c;能够非常高效、灵活地查询内…

【算法 - 动态规划】最长回文子序列

上篇文章中&#xff0c;我们学习一个新的模型&#xff1a; 样本对应模型&#xff0c;该模型的套路就是&#xff1a;以结尾位置为出发点&#xff0c;思考两个样本的结尾都会产生哪些可能性 。 而前篇文章中的 纸牌博弈问题 属于 [L , R]上范围尝试模型。该模型给定一个范围&…

初阶数据结构之---顺序表和链表(C语言)

引言-线性表 线性表&#xff1a; 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构。线性表在逻辑上是线性结构&#xff0c;也就是说是连续的一条直线。但在物理上并不一定是连续的。线性表在物理上…

UE4 C++联网RPC教程笔记(三)(第8~9集)完结

UE4 C联网RPC教程笔记&#xff08;三&#xff09;&#xff08;第8~9集&#xff09;完结 8. exe 后缀实现监听服务器9. C 实现监听服务器 8. exe 后缀实现监听服务器 前面我们通过蓝图节点实现了局域网连接的功能&#xff0c;实际上我们还可以给项目打包后生成的 .exe 文件创建…

【服务器】服务器推荐

一、引言 在数字世界的浪潮中&#xff0c;服务器作为数据存储和处理的基石&#xff0c;其重要性不言而喻。而在这个繁星点点的市场中&#xff0c;雨云以其独特的优势和超高的性价比&#xff0c;逐渐成为众多企业和个人的首选。今天&#xff0c;就让我带你走进雨云的世界&#…

JAVA高并发——单例模式和不变模式

文章目录 1、探讨单例模式2、不变模式 由于并行程序设计比串行程序设计复杂得多&#xff0c;因此我强烈建议大家了解一些常见的设计方法。就好像练习武术&#xff0c;一招一式都是要经过学习的。如果自己胡乱打&#xff0c;效果不见得好。前人会总结一些武术套路&#xff0c;对…

关于 AC 自动机

什么是 AC 自动机 AC 自动机&#xff0c;全称 Aho-Corasick 自动机&#xff0c;是一种用于字符串搜索的算法&#xff0c;由 Alfred V. Aho 和 Margaret J. Corasick 在 1975 年提出。这个算法是为了解决在一个主文本字符串中查找多个模式字符串&#xff08;或称为“关键词”&a…

吴恩达机器学习全课程笔记第三篇

目录 前言 P42-P48 神经元和大脑 神经网络中的层 更复杂的神经网络 前向传播&#xff08;做出预测&#xff09; P49-P53 代码中的推理 构建一个神经网络 P54-P60 矩阵乘法 TensorFlow框架实现神经网络 前言 这是吴恩达机器学习笔记的第三篇&#xff0c;第二篇笔记…

绿盾限制终端网络访问权限会恢复后,别的网站访问正常就是无法访问钉钉网站和下载东西

环境&#xff1a; Win10 专业版 钉钉7.5.5 绿盾7.0 问题描述&#xff1a; 绿盾限制终端网络访问权限会恢复后&#xff0c;别的网站访问正常就是无法访问钉钉网站和下载东西 解决方案&#xff1a; 排查方法 1.重置浏览器或者更换浏览器测试&#xff08;未解决&#xff09…

nc开发刚导入项目eclipse出现莫名其妙的错误,红叉,感叹号,文件missing

解决类出现红叉 解决感叹号&#xff0c;文件missing 其他问题 右上角的视图&#xff0c;要选择java&#xff0c;如果是javaEE也会有一些文件没有展示出来。

QYWX企业微信的公告信息限制保存pdf的破解

公司使用企业微信好几年&#xff0c;重大的消息使用公告信息这个模块。可重要的消息无法保存&#xff0c;只能在线收藏。这个玩意只考虑到了维护企业利益&#xff0c;无视员工利益。 后来发现可以利用windows的虚拟打印机&#xff0c;将公告打印成pdf。 用了一段时间&#xf…

IOT-Reaserch安装ghidra以及IDEA和ghidra的配置

Linux research 5.4.0-91-generic #102~18.04.1-Ubuntu SMP Thu Nov 11 14:46:36 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux java --version IOT自带的java是符合要求的&#xff0c;不需要额外下载 iotresearch:~/install-file$ java --version openjdk 11.0.13 2021-10-19 …

【Quasar】quasar轮播图进度条

效果 开始效果 即将结束 结束 码 <template><q-carouselv-model"slide"transition-prev"scale"transition-next"scale"swipeableanimatedinfiniteautoplaynavigationpaddingarrowsheight"300px"class"bg-primary text…

PHP实现分离金额和其他内容便于统计计算

得到的结果可以粘贴到excel计算 <?php if($_GET["x"] "cha"){ $tips isset($_POST[tips]) ? $_POST[tips] : ; $pattern /(\d\.\d|\d)/; $result preg_replace($pattern, "\t\${1}\t", $tips); echo "<h2><strong>数…

ESRI中国培训资料(2013-2018年)

一、2013年培训资料 链接&#xff1a;https://pan.baidu.com/s/1BDQbOlpXGjEE3nLsQowJJg?pwd4j7v 提取码&#xff1a;4j7v 二、2014年培训资料 链接&#xff1a;https://pan.baidu.com/s/1DiDMgrIMz2D-XCAh8jCncA?pwdbfs9 提取码&#xff1a;bfs9 三、2015年培训资料 …

css实现梯形

<div class"trapezoid"></div> .trapezoid {width: 200px;height: 0;border-bottom: 100px solid red; /* 定义梯形的底边 */border-left: 50px solid transparent; /* 定义梯形的左边 */border-right: 50px solid transparent; /* 定义梯形的右边 */} …

Java 2:运算符、表达式和语句

2.1 运算符与表达式 Java提供了丰富的运算符&#xff0c;如算术运算符、关系运算符、逻辑运算符、位运算符等。Java语言中的绝大多数运算符和C语言相同&#xff0c;基本语句如条件分支语句&#xff0c;循环语句等&#xff0c;也和C语言类似。 2.1.1算术运算符与算术表达式 1…

Redis的常见面试题

目录 前言 Redis支持哪些数据类型 五种核心类型 Zset为什么用跳表不用红黑树 &#xff1f; Redis常见的应用场景&#xff1f; 如何检测Redis的连通性&#xff1f; 如何设置key的过期时间&#xff1f; Redis为什么是单线程模型&#xff1f; Redis里的IO多路复用是什…