Spring系列文章:Bean的获取⽅式

一、简介

Spring为Bean提供了多种实例化⽅式,通常包括4种⽅式。(也就是说在Spring中为Bean对象的创建准 备了多种⽅案,⽬的是:更加灵活)

第⼀种:通过构造⽅法实例化

第⼆种:通过简单⼯⼚模式实例化

第三种:通过factory-bean实例化

第四种:通过FactoryBean接⼝实例化

二、四种Bean的获取⽅式

1、通过构造⽅法获取(实例化)

默认情况下,会调⽤Bean的⽆参数构造⽅法

spring.xml中配置bean的路径

<?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"><bean id="userBean" class="com.demo.bean.User"/></beans>

public class User {public User(){System.out.println("无参构造被调用");}
}

 

测试

    @Testpublic void testConstructor() {ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");User user = applicationContext.getBean("userBean", User.class);System.out.println(user);}

2、通过简单⼯⼚模式获取(实例化)

第一步:定义⼀个Bean

public class User {}

第二步:编写简单⼯⼚模式当中的⼯⼚类

public class UserFactory {public static User get(){return new User();}
}

第三步:在Spring配置⽂件中指定创建该Bean的⽅法(使⽤factory-method属性指定)

<?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"><!--factory-method指定的是工厂类中的静态方法,也就是告诉spring框架 调用这个方法可以获取bean--><bean id="userBean" class="com.demo.entity.UserFactory" factory-method="get"/></beans>

第四步:编写测试程序

    @Testpublic void testSimpleFactory(){ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");User user = applicationContext.getBean("userBean", User.class);System.out.println(user);}

3、通过factory-bean获取(实例化)

这种⽅式本质上是:通过⼯⼚⽅法模式进⾏实例化。

第⼀步:定义⼀个Bean

public class Order{}

 第⼆步:定义具体⼯⼚类,⼯⼚类中定义实例⽅法

public class OrderFactory {public Order get(){return new Order();}
}

第三步:在Spring配置⽂件中指定factory-bean以及factory-method

<bean id="orderFactory" class="com.demo.bean.OrderFactory"/>
<bean id="orderBean" factory-bean="orderFactory" factory-method="get"/>

第四步:编写测试程序

    @Testpublic void testSimpleFactory(){ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");Order orderBean = applicationContext.getBean("orderBean", Order.class);System.out.println(orderBean);}

4、通过FactoryBean接⼝实例化

以上的第三种⽅式中,factory-bean是我们⾃定义的,factory-method也是我们⾃⼰定义的。

在Spring中,当你编写的类直接实现FactoryBean接⼝之后,factory-bean不需要指定了,factory-method也不需要指定了。

factory-bean会⾃动指向实现FactoryBean接⼝的类,factory-method会⾃动指向getObject()⽅法。

第⼀步:定义⼀个Bean

public class Person {
}

第⼆步:编写⼀个类实现FactoryBean接⼝

//PersonFactoryBean 也是一个bean 只不过这个bean比较特殊,叫做工厂bean,通过工厂bean这个特殊的bean可以获取一个普通的bean
public class PersonFactoryBean implements FactoryBean<Person> {@Overridepublic Person getObject() throws Exception {
//最终这个bean还是程序员自己newreturn new Person();}@Overridepublic Class<?> getObjectType() {return null;}//这个方法在接口中有默认的实现,默认返回true 表示单例的,若多例直接将这个方法修改reture false即可@Overridepublic boolean isSingleton() {// true表示单例// false表示原型return true;}
}

第三步:在Spring配置⽂件中配置FactoryBean

<bean id="personBean" class="com.demo.bean.PersonFactoryBean"/>

 第四步:测试

    @Testpublic void testSimpleFactory(){ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");Person personBean = applicationContext.getBean("personBean", Person.class);System.out.println(personBean);Person personBean2 = applicationContext.getBean("personBean", Person.class);System.out.println(personBean2);}

FactoryBean在Spring中是⼀个接⼝。被称为“⼯⼚Bean”。“⼯⼚Bean”是⼀种特殊的Bean。所有 的“⼯⼚Bean”都是⽤来协助Spring框架来创建其他Bean对象的。

三、BeanFactory和FactoryBean的区别

Spring IoC容器的顶级对象,BeanFactory被翻译为“Bean⼯⼚”,在Spring的IoC容器中,“Bean⼯ ⼚”负责创建Bean对象。

这是 IOC 容器的基本实现,是 Spring 内部使用的接口。面向 Spring 本身,不提供给开发人员使用

FactoryBean:它是⼀个Bean,是⼀个能够辅助Spring实例化其它Bean对象的⼀个Bean。

在Spring中,Bean可以分为两类:

第⼀类:普通Bean

第⼆类:⼯⼚Bean(记住:⼯⼚Bean也是⼀种Bean,只不过这种Bean⽐较特殊,它可以辅助 Spring实例化其它Bean对象。)

四、注⼊⾃定义Date

前面文章有介绍到java.util.Date在Spring中被当做简单类型,简单类型在注⼊的时候可以直接使⽤value属 性或value标签来完成。但我们之前已经测试过了,对于Date类型来说,采⽤value属性或value标签赋值 的时候,对⽇期字符串的格式要求⾮常严格,必须是这种格式的:Mon Oct 10 14:30:26 CST 2022。其 他格式是不会被识别的。如以下代码:

public class Student {private Date birth;public void setBirth(Date birth) {this.birth = birth;}@Overridepublic String toString() {return "Student{" +"birth=" + birth +'}';}
}
<bean id="studentBean" class="com.demo.bean.Student"><property name="birth" value="Mon Oct 10 14:30:26 CST 2002"/>
</bean>
    @Testpublic void testDate(){ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");Student studentBean = applicationContext.getBean("studentBean", Student.class);System.out.println(studentBean);}

结果

如果把⽇期格式修改⼀下: 

<bean id="studentBean" class="com.demo.bean.Student"><property name="birth" value="2002-10-10"/>
</bean>

执行就报错

这种情况下,我们就可以使⽤FactoryBean来完成这个操作。 编写DateFactoryBean实现FactoryBean接⼝:

public class DateFactoryBean implements FactoryBean<Date> {// 定义属性接收⽇期字符串private String date;// 通过构造⽅法给⽇期字符串属性赋值public DateFactoryBean(String date) {this.date = date;}@Overridepublic Date getObject() throws Exception {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");return sdf.parse(this.date);}@Overridepublic Class<?> getObjectType() {return null;}
}

编写spring配置⽂件:

<bean id="dateBean" class="com.demo.bean.DateFactoryBean"><constructor-arg name="date" value="1999-10-11"/>
</bean>
<bean id="studentBean" class="com.demo.bean.Student"><property name="birth" ref="dateBean"/>
</bean>

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

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

相关文章

App测试时常用的adb命令你都掌握了哪些呢?

adb 全称为 Android Debug Bridge&#xff08;Android 调试桥&#xff09;&#xff0c;是 Android SDK 中提供的用于管理 Android 模拟器或真机的工具。 adb 是一种功能强大的命令行工具&#xff0c;可让 PC 端与 Android 设备进行通信。adb 命令可执行各种设备操作&#xff0…

Redis原理:动态字符串SDS

&#xff08;课程总结自b站黑马程序员课程&#xff09; 一、引言 Redis中保存的Key是字符串&#xff0c;value往往是字符串或者字符串的集合。可见字符串是Redis中最常用的一种数据结构。 不过Redis没有直接使用C语言中的字符串&#xff0c;因为C语言字符串存在很多问题&…

防火墙 FireWall

这里写自定义目录标题 一、概述二、防火墙分类三、防火墙性能四、硬件防火墙定义五、硬件防火墙作用&#xff08;拓扑图 ups&#xff09;六、硬件防火墙品牌七、软件防火墙八、iptables一、iptables是什么&#xff1f;二、netfilter/iptables功能三、iptables概念四、iptables中…

【云原生】Kubeadmin安装k8s集群

目录 前言&#xff1a; 一 环境部署 1.1 服务器部署功能 1.2 环境准备&#xff08;所有节点&#xff09; 二 安装docker&#xff08;所有节点&#xff09; 三 所有节点安装kubeadm&#xff0c;kubelet和kubectl 3.1 定义kubernetes源 3.2 开机自启kubelet 四 部署K8S集…

Redis——数据结构介绍

Redis是一个key-value的数据库&#xff0c;key一般是String类型&#xff0c;不过value的类型是多样的&#xff1a; String&#xff1a;hello wordHash&#xff1a;{name:"Jack",age:21}List&#xff1a;[A -> B -> C -> D]Set&#xff1a;{A,B,C}SortedSet…

Keras入门与残差网络的搭建

发现草稿箱里还有一篇很早之前的学习笔记&#xff0c;希望可以帮助到有需要的童鞋~ 目录 1、keras入门 2、残差网络 &#xff08;ResNet&#xff09; 2.1、恒等块 2.2、卷积块 搭建一个50层的残差网络 自己的测试数据 1、keras入门 本文参考参考 Keras模型大纲&#xff…

数据结构——带头双向循环链表

数据结构——带头双向循环链表 一、带头双向循环链表的定义二、带头双向循环链表的实现2.1初始化创建带头双向循环链表的节点2.2申请新节点2.3节点的初始化2.4带头双向循环链表的尾插2.5带头双向循环链表的头插2.6判空函数2.7带头双向循环链表的打印函数2.8带头双向循环链表的尾…

博客系统项目

文章目录 数据库的增删改查草稿箱草稿箱自动保存分页查询后端前端 评论区后端前端 md5加盐加密 md5加盐对用户密码进行加密; 全服用户博客列表页,实现分页查询; 用户博客列表页; 写博客,发博客,改博客; 博客草稿箱,自动保存,定时发布; 博客访问量,博客评论区,博客点赞; 数据库…

“JSR303和拦截器在Java Web开发中的应用与实践“

目录 引言JSR303什么是JSR303?为什么要使用JSR303?常用注解快速入门JSR303 拦截器什么是拦截器拦截器与过滤器应用场景快速入门拦截器 总结 引言 在Java Web开发过程中&#xff0c;我们经常会遇到需要对输入数据进行验证和处理&#xff0c;同时需要对请求进行拦截与控制的需…

通过idea实现springboot集成mybatys

概述 使用springboot 集成 mybatys后&#xff0c;通过http请求接口&#xff0c;使得通过http请求可以直接直接操作数据库&#xff1b; 完成后端功能框架&#xff1b;前端是准备上小程序&#xff0c;调用https的请求接口用。简单实现后端框架&#xff1b; 详细 springboot 集…

Scrum工作模式的角色和活动

​Scrum工作模式是一种敏捷软件开发方法&#xff0c;其核心是团队合作和自我组织&#xff0c;旨在通过短周期的迭代开发&#xff0c;实现快速反馈和持续改进。 Scrum工作模式包括以下角色和活动&#xff1a; 1、产品负责人&#xff08;Product Owner&#xff09;&#xff1a;…

laravel系列(二) Dcat admin框架开发工具使用

开发工具可以非常好的帮助我们去快速的开发CURD等操作,但也是有部分框架有些不是太便捷操作,这篇博客主要为大家介绍Dcat admin的开发工具详细使用. 如何创建页面: 在联表我们首先要去.env文件中去找连接数据库方法: APP_NAMELaravel APP_ENVlocal APP_KEYbase64:thO0lOVlzj0…

Allegro166版本如何在颜色管理器中实时显示层面操作指导

Allegro166版本如何在颜色管理器中实时显示层面操作指导 在用Allegro166进行PCB设计的时候,需要在颜色管理器中频繁的开关层面。但是166不像172一样在颜色管理器中可以实时的开关层面,如下图 需要打开Board Geometry/Soldermask_top层,首先需要勾选这个层面,再点击Apply即…

论文简读 LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS

论文地址&#xff1a;https://arxiv.org/pdf/2106.09685.pdf 项目地址&#xff1a;https://github.com/microsoft/LoRA 全文翻译地址&#xff1a;https://zhuanlan.zhihu.com/p/611557340 本来想自行翻译的&#xff0c;但最近没有空 1、关键凝练 1.1 LORA是什么&#xff1f; …

基于java SpringBoot和Vue uniapp的影楼摄影预约小程序

摘要 今天信息技术的发展很快&#xff0c;其足迹在我们的生活中随处可见。它影响着我们的衣食住行等各种需求。影响也在逐渐增加&#xff0c;逐渐渗透到各行各业&#xff0c;在这种背景下&#xff0c;经过实地考察后&#xff0c;为了让婚纱照管理更加高效方便&#xff0c;我决定…

gitlab 点击Integrations出现500错误

背景&#xff1a;在新服务器重新搭建了gitlab&#xff0c;并导入原来gitlab的备份&#xff0c;在项目中点击点击Integrations出现500错误。 解决方法&#xff1a;1.进入新服务器&#xff0c;将 /etc/gitlab/gitlab-secrets.json重命名为 /etc/gitlab/gitlab-secrets.json.bak …

JavaScript的内置类

一、认识包装类型 1.原始类型的包装类 JavaScript的原始类型并非对象类型&#xff0c;所以从理论上来说&#xff0c;它们是没有办法获取属性或者调用方法的。 但是&#xff0c;在开发中会看到&#xff0c;我们会经常这样操作&#xff1a; var message "hello world&q…

文件上传漏洞(CVE-2022-30887)

简介 多语言药房管理系统&#xff08;MPMS&#xff09;是用PHP和MySQL开发的&#xff0c;该软件的主要目的是在药房和客户之间提供一套接口&#xff0c;客户是该软件的主要用户。该软件有助于为药房业务创建一个综合数据库&#xff0c;并根据到期、产品等各种参数提供各种报告…

python超详细安装

目录 初始python获取python安装包python解释器安装pycharm编译器安装pycharm的简单使用&#xff08;第一个hello world&#xff09; 初始python Python 是一款易于学习且功能强大的编程语言。 它具有高效率的数据结构&#xff0c;能够简单又有效地实现面向对象编程。 Python简…

uni-app(微信小程序)图片旋转放缩,文字绘制、海报绘制

总结一下&#xff1a; 要进行海报绘制离不开canvas&#xff0c;我们是先进行图片&#xff0c;文字的拖拽、旋转等操作 最后再对canvas进行绘制&#xff0c;完成海报绘制。 背景区域设置为 position: relative&#xff0c;方便图片在当前区域中拖动等处理。添加图片&#xff0…