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服务器并发数的一大因素&…

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

目录 一、前言 二、时序建模 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…

typescript映射类型

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

typescript 索引签名类型

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

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…

【算法2-1】前缀和、差分与离散化

一、【P3406】海底高铁&#xff08;差分贪心&#xff09;​​​​​​ 由于本题涉及到线路问题&#xff0c;需要统计Uim途径每条线路的次数&#xff0c;而且Uim每次的轨迹都是很长一段路径&#xff0c;所以需要使用一个合理的数据结构来维护区间的变化&#xff0c;首先想到线段…

正交匹配追踪算法(Orthogonal Matching Pursuit)实现过程及Python模拟

正交匹配追踪&#xff08;Orthogonal Matching Pursuit&#xff0c;OMP&#xff09;是一种用于寻找稀疏信号的贪婪算法&#xff0c;用于求解压缩感知问题中的稀疏近似问题。在压缩感知的背景下&#xff0c;通常我们有一个欠定的线性系统Ax y&#xff0c;其中A是一个已知的测量…

信奥一本通:2022:【例4.7】最小n值

这个题目的难点在于他让你输入1 2 3&#xff0c;不等的数&#xff0c;意思就是你不知道循环要执行几次&#xff0c;用户输入几次就是几次&#xff0c;那就只有这样写 while (cin >> num) #include <iostream> # include <iomanip> using namespace std;…

第三百五十九回

文章目录 1. 概念介绍2. 使用方法3. 代码与效果3.1 示例代码3.2 运行效果 4. 内容总结 013pickers2.gif 我们在上一章回中介绍了"如何实现Numberpicker"相关的内容&#xff0c;本章回中将介绍wheelChoose组件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念…

学习鸿蒙基础(4)

1.条件渲染 ArkTS提供了渲染控制的能力。条件渲染可根据应用的不同状态&#xff0c;使用if、else和else if渲染对应状态下的UI内容。 当if、else if后跟随的状态判断中使用的状态变量值变化时&#xff0c;条件渲染语句会进行更新。。 Entry Component struct PageIfElse {Stat…

【C++杂货铺】模板

&#x1f308;前言&#x1f308; 欢迎观看本期【C杂货铺】&#xff0c;本期内容将讲解模板的初阶&#xff0c;即了解模板&#xff0c;熟练掌握模板的使用方法&#xff0c;了解模板的工作原理等内容。 &#x1f4c1; 函数模板 &#x1f4c2; 概念 函数模板代表了一个函数家族&am…

如何在Windows系统中检测和结束运行中的程序(任务管理器显示运行程序可能有bug)

如何在Windows系统中检测和结束运行中的程序 在Windows系统的日常使用和管理过程中&#xff0c;我们经常需要检测某个程序是否正在运行&#xff0c;并在必要时结束它。本文将详细介绍如何在Windows系统中检测运行中的程序&#xff0c;并提供多种方法来结束这些程序。 检测运行…