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://www.mzph.cn/news/694471.shtml

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

相关文章

利用Python实现科学式占卜

一直以来&#xff0c;中式占卜都是基于算命先生手工实现&#xff0c;程序繁琐&#xff08;往往需要沐浴、计算天时、静心等等流程&#xff09;。准备工作复杂&#xff08;通常需要铜钱等道具&#xff09;&#xff0c;计算方法复杂&#xff0c;需要纯手工计算二进制并转换为最终…

2023年12月 Python(六级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,共50分) 第1题 运行以下程序,输出的结果是?( ) class A():def __init__(self,x):self.x=x

手机连接电脑后资源管理器无法识别(识别设备但无法访问文件)

问题描述 小米8刷了pixel experience系统,今天用电脑连接后无法访问手机文件,但是手机选择了usb传输模式为文件传输 解决办法 在设备和打印机页面中右键选择属性 点击改变设置 卸载驱动,注意勾选删除设备的驱动程序软件 卸载后重新连接手机,电脑弹出希望对设备进行什么操作时…

Code-Audit(代码审计)习题记录4-5

4、习题4 题目内容如下&#xff1a; <?php error_reporting(0); show_source(__FILE__); $a $_REQUEST[hello]; eval("var_dump($a);"); 函数解释 $REQUEST — HTTP Request 变量&#xff0c;默认情况下包含了 [$GET]&#xff0c;[$POST] 和 [$COOKIE]的数…

HTML知识点

HTML 【一】HTML简介 【1】什么是HTML HTML是一种用于创建网页结构和内容的超文本标记语言&#xff0c;它是构建网页的基础。为了让浏览器正确渲染页面&#xff0c;我们必须遵循HTML的语法规则。浏览器在解析网页时会将HTML代码转换为可视化的页面&#xff0c;所以我们在浏览…

python接口测试实践:参数化测试、数据驱动测试和断言的使用

在Python接口测试实践中&#xff0c;参数化测试、数据驱动测试和断言是常用的技术手段。 参数化测试 参数化测试是指将测试用例中的某些部分&#xff08;如输入数据或配置&#xff09;作为参数传递给测试函数&#xff0c;以便于复用和减少代码重复。 例如&#xff0c;使用uni…

2024年最新腾讯云轻量4核8G12M服务器CPU内存性价比如何?

4核8G服务器支持多少人同时在线访问&#xff1f;阿腾云的4核8G服务器可以支持20个访客同时访问&#xff0c;关于4核8G服务器承载量并发数qps计算测评&#xff0c;云服务器上运行程序效率不同支持人数在线人数不同&#xff0c;公网带宽也是影响4核8G服务器并发数的一大因素&…

设计模式--组合模式(Composite Pattern)

组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构,并且能像使用独立对象一样使用它们。 组合模式主要包含以下几个角色: Component:这是组合中对象声明接口,在适当的情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理C…

oracle数据库事务的四大特性与隔离级别与游标

数据库事务的四大特性: 这里提到了 ACID 四个特性&#xff0c;分别是&#xff1a; A&#xff08;Atomicity&#xff09;&#xff1a; 原子性&#xff0c;确保事务中的所有操作要么全部执行成功&#xff0c;要么全部不执行&#xff0c;不存在部分执行的情况。 C&#xff08;…

时序分析深入必学的时序模型详细讲解

目录 一、前言 二、时序建模 2.1 反相器 2.2 线性时序模型 2.3 非线性时序模型 三、时序模块 3.1 组合单元 3.2 时序单元 3.3 同步检查&#xff1a;setup和hold 3.4 异步检查&#xff1a;recovery和removal 3.5 脉冲宽度检查Pulse width check 3.6 传输时延 3.7 …

微信小程序配置文件

目录 小程序配置文件 1. 配置文件介绍 2. 全局配置 2.1 pages 2.2 window 2.3 tabBar 3. 页面配置 4. 项目配置文件 5. 支持使用 sass/less 6. sitemap.json 小程序配置文件 1. 配置文件介绍 JSON是一种轻量级的数据格式&#xff0c;常用于前后端数据的交互&#xf…

LDRA Testbed软件静态分析_软件质量度量

系列文章目录 LDRA Testbed软件静态分析_操作指南 LDRA Testbed软件静态分析_自动提取静态分析数据生成文档 LDRA Testbed软件静态分析_Jenkins持续集成_(1)自动进行静态分析的环境搭建 LDRA Testbed软件静态分析_Jenkins持续集成_(2)配置邮件自动发送静态分析结果 LDRA Testb…

python数据类型-集合set

1 集合&#xff08;set&#xff09;的定义 1.1 集合是一个无序且不重复元素的序列&#xff1a; 1&#xff09;无序&#xff1a;存储顺序和添加的顺序不一定相同&#xff0c;不支持索引、切片 2&#xff09;元素不重复&#xff1a;当添加重复元素时&#xff0c;集合会自动去重…

scss导出颜色变量为空对象

scss导出颜色变量为空对象 scss文件 $base-menu-color:#bfcbd9; :export {menuColor: $base-menu-color }页面使用 import variables from "/assets/styles/variables.scss";然后打印发现 console.log(variables) // {} 打印值为空对象此时我们需要将文件名varia…

typescript映射类型

ts映射类型简介 TypeScript中的映射类型&#xff08;Mapped Type&#xff09;是一种高级类型&#xff0c;它允许我们基于现有类型创建新的类型&#xff0c;同时对新类型的每个属性应用一个转换函数。通过使用映射类型&#xff0c;我们可以方便地对对象的属性进行批量操作&…

BeautifulSoup的使用与入门

1. 介绍 BeautifulSoup是用来从HTML、XML文档中提取数据的一个python库&#xff0c;安装如下: pip install beautifulsoup4 它支持多种解析器&#xff0c;包括python标准库、lxml HTML解析器、lxml XML解析器、html5lib等。结合稳定性和速度&#xff0c;这里推荐使用lxml HT…

typescript 索引签名类型

ts索引类型简介 在TypeScript中&#xff0c;索引签名类型&#xff08;Index Signature Type&#xff09;是一种特殊的类型&#xff0c;它定义了对象中键的类型以及相应的值的类型。通过使用索引签名类型&#xff0c;我们可以表示一个对象&#xff0c;该对象的键可以是任意类型…

spring boot Mybatis Plus分页

文章目录 Mybatis Plus自带分页和PageHelper有什么区别&#xff1f;Mybatis Plus整合PageHelper分页 springboot自定义拦截器获取分页参数spring boot下配置mybatis-plus分页插件单表分页查询自定义sql分页查询PageHelper 参考 Mybatis Plus自带分页和PageHelper有什么区别&…

python3 flask 实现对config.yaml文件的内容的增删改查,并重启服务

config.yaml配置文件内容 功能就是userpass下的用户名和密码做增删改查&#xff0c;并重启hy2服务 auth:type: userpassuserpass:csdn: csdnlisten: :443 masquerade:proxy:rewriteHost: trueurl: https://www.bing.com/type: proxy tls:cert: /root/hyst*****马赛克******er…

开源大数据管理平台选型

随着CDH和HDP的闭源&#xff0c;还有国内信创需求&#xff0c;经过前期调研和后期实践&#xff0c;目前主要有两个产品满足要求&#xff1a;apache bigtop 和 DataSophon 符合要求。因为这两个产品都是完全开源的&#xff0c;自助可控。 一 apache bigtop 项目地址&#xff1…