Spring中Bean实例化方式和Bean生命周期

news2024/9/23 13:16:32

Spring

  • Bean的实例化方式
    • 通过构造方法实例化
    • 通过简单工厂模式实例化
    • 通过工厂方法模式实例化
    • 通过FactoryBean接口实例化
  • 注入自定义Date
  • Bean的生命周期
  • Bean的循环依赖问题


Bean的实例化方式

Spring为Bean提供了多种实例化方式,通常包括4种方式。(也就是说在Spring中为Bean对象的创建准备了多种方案,目的是:更加灵活)
第一种:通过构造方法实例化
第二种:通过简单工厂模式实例化
第三种:通过factory-bean实例化
第四种:通过FactoryBean接口实例化

通过构造方法实例化

默认情况下,会调用Bean的无参数构造方法
在这里插入图片描述

通过简单工厂模式实例化

新建spring-Bean模块用来写本节代码

第一步:定义一个Bean
Vip.java

package com.w.spring6.bean;

public class Vip {
}

第二步:编写简单工厂模式当中的工厂类
VipFactory.java

package com.w.spring6.bean;

public class VipFactory {
    public static Vip get(){
        return new Vip();
    }
}


第三步:在Spring配置文件中指定创建该Bean的方法(使用factory-method属性指定)
spring.xml

<?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="vipBean" class="com.w.spring6.bean.VipFactory" factory-method="get"/>
    
</beans>

第四步:编写测试程序

package com.w.spring.test;

import com.w.spring6.bean.Vip;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringBeanTest {
    @Test
    public void testSimpleFactory(){
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
        Vip vip = applicationContext.getBean("vipBean", Vip.class);
        System.out.println(vip);
    }
}

运行结果:
在这里插入图片描述

通过工厂方法模式实例化

第一步:定义一个Bean
Order.java

package com.w.spring6.bean1;

public class Order {
}

第二步:定义具体工厂类,工厂类中定义实例方法
OrderFactory.java

package com.w.spring6.bean1;

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


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

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

第四步:编写测试程序

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

运行结果:
在这里插入图片描述

通过FactoryBean接口实例化

FactoryBean在Spring中是一个接口,用来协助Spring框架来创建其他Bean对象的。

以上的第三种方式中,factory-bean是我们自定义的,factory-method也是我们自己定义的。
在Spring中,当你编写的类直接实现FactoryBean接口之后,factory-bean不需要指定了,factory-method也不需要指定了。
factory-bean会自动指向实现FactoryBean接口的类,factory-method会自动指向getObject()方法。

第一步:定义一个Bean
Person.java

package com.w.spring6.bean2;

public class Person {
}

第二步:编写一个类实现FactoryBean接口
PersonFactoryBean.java

package com.w.spring6.bean2;

import org.springframework.beans.factory.FactoryBean;

public class PersonFactoryBean implements FactoryBean<Person> {

    @Override
    public Person getObject() throws Exception {
        return new Person();
    }

    @Override
    public Class<?> getObjectType() {
        return null;
    }

    @Override
    public boolean isSingleton() {
        // true表示单例
        // false表示原型
        return true;
    }
}

第三步:在Spring配置文件中配置FactoryBean
spring.xml

    <bean id="personBean" class="com.w.spring6.bean2.PersonFactoryBean"/>

第四步:编写测试程序

@Test
public void testFactoryBean(){
    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);
}

运行结果:
在这里插入图片描述

注入自定义Date

简单类型在注入的时候可以直接使用value属性或value标签来完成,但对于Date类型来说,采用value属性或value标签赋值的时候,对日期字符串的格式要求非常严格,必须是这种格式的:Mon Oct 10 14:30:26 CST 2022。其他格式是不会被识别的。
这种情况下,我们就可以使用FactoryBean来完成其他格式。

编写DateFactoryBean实现FactoryBean接口:
DateFactoryBean.java

package com.w.spring6.test;


import org.springframework.beans.factory.FactoryBean;

import java.text.SimpleDateFormat;
import java.util.Date;

public class DateFactoryBean implements FactoryBean<Date> {

    // 定义属性接收日期字符串
    private String date;

    // 通过构造方法给日期字符串属性赋值
    public DateFactoryBean(String date) {
        this.date = date;
    }

    @Override
    public Date getObject() throws Exception {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        return sdf.parse(this.date);
    }

    @Override
    public Class<?> getObjectType() {
        return null;
    }
}

编写spring配置文件:
spring.xml

    <bean id="userBean" class="com.w.spring6.test.User">
        <property name="birth" ref="dateBean"/>
    </bean>

    <bean id="dateBean" class="com.w.spring6.test.DateFactoryBean">
        <constructor-arg name="date" value="2023-11-11"/>
    </bean>

测试程序:

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

运行结果:
在这里插入图片描述

Bean的生命周期

Bean生命周期可以粗略的划分为五大步:

  • 第一步:实例化Bean
  • 第二步:Bean属性赋值
  • 第三步:初始化Bean
  • 第四步:使用Bean
  • 第五步:销毁Bean

Bean的循环依赖问题

循环依赖:A对象中有B属性。B对象中有A属性。我依赖你,你也依赖我。

例:
Husband.java

package com.w.spring6.BeanCircularDependency;

public class Husband {
    private String name;
    private Wife wife;
}


Wife.java

package com.w.spring6.BeanCircularDependency;

public class Wife {
    private String name;
    private Husband husband;
}

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

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

相关文章

阿里全系产品崩上了热搜,我是有些失望的

双十一刚刚过&#xff0c;没想到阿里巴巴全系产品却又崩上热搜了。看来阿里的不少程序员同学今天又是在加班中度过了&#xff0c;心疼&#xff0c;希望你们把班加了就可以了&#xff0c;锅就别背了。 据了解&#xff0c;截至目前&#xff0c;本次修复进展如下&#xff1a; 17:…

SCADA系统在化工行业应用解决方案和注意事项

SCADA系统在化工行业的数字化工厂中具有广泛的应用解决方案。SCADA系统通过实时监控和远程控制&#xff0c;帮助化工企业实现生产过程的自动化和数字化管理。以下是化工行业的SCADA系统行业应用中可以解决的客户痛点以及相关的详细设计说明&#xff1a; 远程监测和控制&#xf…

GPON、XG(S)-PON基础

前言 本文主要介绍了GPON、XG(S)-PON中数据复用技术、协议、关键技术、组网保护等内容&#xff0c;希望对你有帮助。 一&#xff1a;GPON数据复用技术 下行波长&#xff1a;1490nm&#xff0c;上行波长&#xff1a;1310nm 1&#xff1a;单线双向传输&#xff08;WDM技术&am…

JS+ES6新增字符串方法大汇总,爆肝,共四十七种方法(求个赞,哈哈)

让我为大家介绍一下字符串的操作方法吧&#xff0c;你知道与不知道的大部分都在这&#xff01; 分类可能有点不太对&#xff0c;还请大家见谅&#xff01; 增 1.concat() 拼接字符串 可以连接两个或多个字符串 let str "hello"let str1 " str"console…

项目管理工具:提高团队协作效率,确保项目按时完成

项目管理对于企业的成功至关重要&#xff0c;一个好的项目管理工具可以提高团队协作效率&#xff0c;确保项目按时完成&#xff0c;并保持项目进度的高效跟踪。 近年来&#xff0c;一款名为“进度猫”的项目管理工具逐渐崭露头角&#xff0c;它以其独特的功能和优势&#xff…

算法细节类错误

1.使用全局变量时&#xff0c;若有多组测试数据 应该注意在循坏中重新初始化全局变量 例如&#xff1a;

【第2章 Node.js基础】2.4 Node.js 全局对象(一)

什么是Node.js 全局对象 对于浏览器引擎来说&#xff0c;JavaScript 脚本中的 window 是全局对象&#xff0c;而Node.js程序中的全局对象是 global&#xff0c;所有全局变量(除global本身外)都是global 对象的属性。全局变量和全局对象是所有模块都可以调用的。Node.is 的全局…

记忆科技携手中国电信,一站式存储打造坚实数字底座

11月10日&#xff0c;以“数字科技 焕新启航”为主题的2023数字科技生态大会在广州盛大开幕&#xff0c;本次大会由中国电信、广东省人民政府联合举办&#xff0c;是一场数字科技领域的年度盛会。忆联母公司记忆科技作为中国电信的合作伙伴之一受邀参会&#xff0c;深度参与了大…

常用的一些LDO芯片及使用稳定的LDO芯片推荐

LDO也是电赛中常用的电源模块。相比DCDC以及稳压器&#xff0c;LDO的跌落电压更小&#xff0c;因此两者适用场合不同。下面介绍一些常用的LDO及其使用&#xff1a; 1. TPS7A4501&#xff08;正降压&#xff09; 数据手册&#xff1a;https://www.ti.com.cn/cn/lit/ds/symlink…

【JUC】一、synchronized关键字与Lock接口

文章目录 1、JUC2、进程与线程3、并发与并行4、用户线程和守护线程5、对象锁和类锁6、Synchronized关键字7、synchronized案例8、Lock接口 1、JUC JUC&#xff0c;即java.util.concurrent这个处理线程的工具包&#xff0c;始于JDK1.5&#xff0c;其中下有三个包&#xff0c;为…

华为的干部管理和人才管理实践精髓(深度好文,收藏)

&#xff08;本文摘自谢宁专著《华为战略管理法&#xff1a;DSTE实战体系》&#xff0c;欢迎购买&#xff09; 1997年&#xff0c;在《华为基本法》的起草过程中&#xff0c;起草小组的一位人大教授问任正非:“任总&#xff0c;人才是不是华为的核心竞争力?”任正非的回答出人…

阿里三面被虐惨,非让我举例说明,为什么GC需要Stop the World?

最近&#xff0c;五哥回忆起4年前在蚂蚁金服三面的经历。关于GC的一个问题&#xff0c;让我记忆深刻。 当聊起来Java GC时&#xff0c;我提到 young gc 和 full gc都会 Stop the world。 ”为什么需要 Stop the world“&#xff0c;蚂蚁面试官问道。 我略微怔住&#xff0c;…

WH4530A可检测0-100cm环境光+距离检测功能

台湾旺泓推出的WH4530A是一款结合了先进环境光传感器&#xff08;ALS&#xff09;先进接近传感器&#xff08;PS&#xff09;和高效率的红外LED灯三合一为一体的光距感接近传感器&#xff1b;可测距范围0-100cm;采用I2C接口&#xff0c;可实现超高灵敏度、精准测距检测范围广等…

设备管理软件有什么用?如何让维修工作智能化?

随着数字化和人工智能技术的不断发展&#xff0c;设备管理软件已经成为了一种智能化的管理方式&#xff0c;它能够整合设备设施的维修资源&#xff0c;实现全生命周期的设备设施管理。这种软件可以帮助机构单位更好地跟踪和管理设备设施的维修请求&#xff0c;提高维修效率和管…

OA+CRM+HR+ERP 客户关系 进销存 财务 办公审批系统源码

功能介绍 1、个人中心 电话薄&#xff1a;主要用于添加联系人信息&#xff0c;相当于通讯录功能&#xff0c;可以存贮相关联系人的基本信息&#xff0c;姓名、联系方式、地址、邮箱等。 工作日志 &#xff1a;主要用于记录个人工作生活中大小事情的备忘&#xff0c;相当于备…

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-超级终端

红队专题 招募六边形战士队员[16]超级终端(1) 招募六边形战士队员 一起学习 代码审计、安全开发、web攻防、逆向等。。。 私信联系 [16]超级终端(1) 服务端 — 本地打开cmd — 接收命令 — 执行 — 发送回显 客户端 — 远端发送命令 — 接收回显 发送开启cmd命令 --- 接受…

Rectangle:掌控你的Mac视窗,提升工作效率

你是否曾经在Mac上同时处理多个窗口&#xff0c;却因为无法有效管理而感到困扰&#xff1f;现在&#xff0c;一款全新的窗口管理工具正在改变这一切&#xff0c;它就是Rectangle。 Rectangle是一款简单而强大的窗口管理工具&#xff0c;适用于Mac系统。它改变了传统的窗口管理…

深度学习AI识别人脸年龄

以下链接来自 落痕的寒假 GitHub - luohenyueji/OpenCV-Practical-Exercise: OpenCV practical exercise GitHub - luohenyueji/OpenCV-Practical-Exercise: OpenCV practical exercise import cv2 as cv import time import argparsedef getFaceBox(net, frame, conf_thresh…

拆解软件定义汽车:OS突围

软件作为智能汽车的核心组成部分&#xff0c;由于自身较为独立和复杂的IT学科体系&#xff0c;其技术链路、产业分工、价值分配、商业模式相对硬件产品&#xff08;如域控、激光雷达、摄像头等硬件&#xff09;而言&#xff0c;在汽车产业内探讨和传播相对较少。 11月3日&…

GoLong的学习之路,进阶,语法之并发(并发错误处理)补充并发三部曲

这篇文章主要讲的是如何去处理并发的错误。 在Go语言中十分便捷地开启goroutine去并发地执行任务&#xff0c;但是如何有效的处理并发过程中的错误则是一个很棘手的问题。 文章目录 recovererrgroup recover 哦对&#xff0c;似乎没写错误处理的文章。后面补上。 首先&…