当前位置: 首页 > news >正文

Spring 创建 Bean 的三种方式

在使用 Spring 框架后,对象以 Bean 的形式统一交给 IOC 容器去创建和管理。现阶段主流的方式是基于 SpringBoot 框架,基于注解的方式实现 Bean 的创建,但在原生 Spring 框架中其实存在三种创建 Bean 的方式。

一、基础类

  1. BeanProcess 实体类,虽然加了 @Component 等三个注解,但只在注解方式创建 Bean 时用到了。
package com.nineya.spring.entity;import lombok.Getter;
import lombok.Setter;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;@Getter
@Setter
@Component("test")
public class BeanProcess {private String name;@PostConstructpublic void init() {System.out.println("Bean InitMethodName");}@PreDestroypublic void destroy() {System.out.println("Bean DestroyMethodName");}}
  1. 后置处理器类

BeanPostProcessor 后置处理器。

package com.nineya.spring.processor;import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Component;@Component
public class NineyaBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {System.out.println("BeanPostProcessor.postProcessAfterInitialization(" + beanName + ") 后置处理器");return bean;}@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {System.out.println("BeanPostProcessor.postProcessBeforeInitialization(" + beanName + ") 后置处理器");return bean;}
}

BeanFactoryPostProcessor 后置处理器。

package com.nineya.spring.processor;import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.stereotype.Component;@Component
public class NineyaBeanFactoryPostProcessor implements BeanFactoryPostProcessor {@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {System.out.println("BeanFactoryPostProcessor.postProcessBeanFactory 后置处理器");}
}

二、三种创建方式

2.1 JavaApi 方式

JavaApi 方式没有注册 BeanFactoryPostProcessor 后置处理器的接口,应该在注册添加完所有 BeanDefinition 后,手动调用执行 BeanFactoryPostProcessor 后置处理器方法。

private static void javaApi() {// 创建bean工厂DefaultListableBeanFactory context = new DefaultListableBeanFactory();//构造bean定义GenericBeanDefinition gbd = new GenericBeanDefinition();gbd.setBeanClass(BeanProcess.class);// 设置属性List<PropertyValue> propertyValues = new ArrayList<>();propertyValues.add(new PropertyValue("name", "test"));gbd.setPropertyValues(new MutablePropertyValues(propertyValues));// 设置生命周期方法gbd.setInitMethodName("init");gbd.setDestroyMethodName("destroy");//注册到环境上下文context.registerBeanDefinition("test", gbd);context.addBeanPostProcessor(new NineyaBeanPostProcessor());new NineyaBeanFactoryPostProcessor().postProcessBeanFactory(context);// 通过class取得beanBeanProcess beanProcess = context.getBean(BeanProcess.class);System.out.println(beanProcess + " : " + beanProcess.hashCode());
}

2.2 xml方式

创建 beanxml 文件。

<?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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><bean class="com.nineya.spring.entity.BeanProcess" name="test" init-method="init" destroy-method="destroy"><property name="name" value="test" /></bean><!-- 注册处理器 --><bean class="com.nineya.spring.processor.NineyaBeanPostProcessor"/><bean class="com.nineya.spring.processor.NineyaBeanFactoryPostProcessor"/>
</beans>

读取 xml 文件创建 bean 工厂。

private static void xmlFile() {ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");// 通过class取得beanBeanProcess beanProcess = context.getBean(BeanProcess.class);System.out.println(beanProcess + " : " + beanProcess.hashCode());
}

2.3 注解方式

private static void annotation() {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();// 配置注解扫描路径context.scan(BeanLifecycleMain.class.getPackage().getName());context.refresh();// 通过class取得beanBeanProcess beanProcess = context.getBean(BeanProcess.class);System.out.println(beanProcess + " : " + beanProcess.hashCode());
}

相关文章:

Spring 创建 Bean 的三种方式

在使用 Spring 框架后&#xff0c;对象以 Bean 的形式统一交给 IOC 容器去创建和管理。现阶段主流的方式是基于 SpringBoot 框架&#xff0c;基于注解的方式实现 Bean 的创建&#xff0c;但在原生 Spring 框架中其实存在三种创建 Bean 的方式。 一、基础类 BeanProcess 实体类…...

软工导论知识框架(五)面向对象方法学

传统软件工程方法学适用于中小型软件产品开发&#xff1b; 面向对象软件工程方法学适用于大型软件产品开发。 一.四要素 对象&#xff0b;类&#xff0b;继承&#xff0b;传递消息实现通信 二.概念 1.对象&#xff1a;具有相同状态的一组操作的集合&#xff0c;对状态和操作…...

MyBatisPlus代码生成器

首先需要mybaits-plus依赖和自动代码生成器依赖 <!-- mybatis-plus --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.0.5</version></dependency><!-…...

文件传输软件常见问题解决办法大全

文件传输软件是我们工作中不可缺少的一种工具&#xff0c;它可以帮助我们快速、安全、稳定地传输各种文件&#xff0c;如文档、图片、视频等。但是在使用文件传输软件的过程中&#xff0c;我们也可能会遇到一些问题&#xff0c;影响我们的工作效率和传输质量。那么&#xff0c;…...

springboot工程测试临时数据修改技巧

目录 properties临时属性测试注入 args临时参数测试注入 bean配置类属性注入&#xff08;Import&#xff09; SpringBootTest是一个注解&#xff0c;用于测试Spring Boot应用程序。它可用于指示Spring Boot测试应用程序的启动点&#xff0c;并为测试提供一个可用的Spring应用…...

Echarts 清空画布空白以及鼠标悬浮提示信息格式化问题

清空画布用clear()会导致图表空白 const option1 = this.myEchart1.getOption()const option2 = this.myEchart2.getOption()const option3 = this.myEchart3.getOption()// 清空数据option1.series = []option1.xAxis[0].data = []option2.series = []option2.xAxis[0].data …...

数据结构入门:栈

目录 前言 1. 栈 1.1栈的概念及结构 1.2 栈的实现 1.2.1 栈的定义 1.2.2 栈的初始化 1.2.3 入栈 1.2.4 出栈 1.2.5 栈的元素个数 1.2.6 栈顶数据 1.2.7 栈的判空 2.栈的应用 2.1 题目一&#xff1a;括号匹配 2.1.1 思路 2.1.2 分析 2.1.3 题解 总结 前言 无论你是计算机科学专…...

《UNUX环境高级编程》(14)高级I/O

1、引言 2、 非阻塞I/O 系统调用分为两类&#xff1a;低速系统调用和其他系统调用。低速系统调用是可能会使进程永远阻塞的一类系统调用&#xff0c;包括&#xff1a; 如果某些文件类型&#xff08;如读管道、终端设备和网络设备&#xff09;的数据并不存在&#xff0c;读操作…...

第5讲:如何构建类的方法

【分享成果&#xff0c;随喜正能量】在这个社会上&#xff0c;对别人好一点&#xff0c;多站在别人的角度考虑&#xff0c;不要为小事争执&#xff0c;不要取笑他人&#xff0c;不要在别人背后嚼舌根&#xff0c;更不能逼人太甚。凡事退一步&#xff0c;对你有好处。。 《VBA中…...

【TypeScript】TS接口interface类型(三)

【TypeScript】TS接口interface类型&#xff08;三&#xff09; 【TypeScript】TS接口interface类型&#xff08;三&#xff09;一、接口类型二、实践使用2.1 常规类型2.2 设置属性只读 readonly2.3 设置索引签名2.4 设置可选属性2.5 函数类型接口 一、接口类型 TypeScript中的…...

Python web实战之Django 的 RESTful API 设计详解

关键词: Python, Web 开发, Django, RESTful API 1 API的一些事儿 1.1 什么是API&#xff1f; API是应用程序编程接口&#xff08;Application Programming Interface&#xff09;的缩写。它是一种定义了不同软件组件之间交互方式的规范。API允许不同的应用程序之间进行通信和…...

Python 程序设计入门(014)—— Python 的 Lambda 函数(匿名函数)

Python 程序设计入门&#xff08;014&#xff09;—— Python 的 Lambda 函数&#xff08;匿名函数&#xff09; 目录 Python 程序设计入门&#xff08;014&#xff09;—— Python 的 Lambda 函数&#xff08;匿名函数&#xff09;一、匿名函数的定义二、匿名函数的特征三、匿…...

【MySQL系列】表约束的学习

「前言」文章内容大致是MySQL的表的约束。 「归属专栏」MySQL 「主页链接」个人主页 「笔者」枫叶先生(fy) 目录 一、MySQL表的约束1.1 空属性1.2 默认值&#xff08;default&#xff09;1.3 列描述&#xff08;comment&#xff09;1.4 zerofill1.5 主键&#xff08;primary ke…...

低功耗LoRaWAN国产低功耗LoRa+RF射频前端芯片XD6500S

目录 典型应用XD6500S简介芯片特性 LoRa系列选型参考 LoRa是为低数据速率、远距离距离和超低功耗而优化的扩频协议&#xff0c;用于LPWAN应用程序的通信。 典型应用 一、智慧农业   智慧农业大田解决方案利用传感设备、自动化控制设备、气象站实时监测采集田间土壤墒情、气象…...

【基础IO】文件系统 {磁盘的物理结构,存储结构,逻辑结构;CHS 和 LBA 寻址方式;磁盘分区和块组;文件inode;软硬链接}

文件系统 文件分为&#xff1a; 内存文件&#xff1a;被进程打开的文件&#xff0c;文件被加载到内存中供进程快速读写。磁盘文件&#xff1a;没有被打开的文件&#xff0c;保存在磁盘上。磁盘文件被分门别类的存储和管理&#xff0c;用于支持更好的存取。 提示&#xff1a; …...

全角字符和半角字符

全角字符的由来 全角符号是双字节中文编码的历史遗留问题。当年在纯文本的界面中&#xff0c;为了让西文和中日韩的方块字对齐&#xff0c;就让西文字母、数字和标点也占用一个汉字的视觉空间&#xff0c;并使用 2 个字节存储。后来&#xff0c;其中的一些全角字符因为比较有用…...

【java】【经验】java: 错误: 不支持发行版本 6

前言&#xff1a;配置过maven之后&#xff0c;发现原来的一些项目运行提示java: 错误: 不支持发行版本 6或者java: 错误: 不支持发行版本 5&#xff0c;主要原因&#xff1a;是因为项目使用的Java版本和安装的Java版本不符合 目录 1 设置项目java版本 2 设置模块版本 3 set…...

Spring Boot3.0(四):Thymeleaf 使用详解

Thymeleaf 介绍 简单说&#xff0c;Thymeleaf 是一个跟 Velocity、FreeMarker 类似的模板引擎&#xff0c;它可以完全替代 JSP 。相较与其他的模板引擎&#xff0c;它有如下三个极吸引人的特点&#xff1a; 1.Thymeleaf 在有网络和无网络的环境下皆可运行&#xff0c;即它可以…...

杨辉三角【Java二维数组】

这个代码中&#xff0c;我们定义了一个二维数组nums来存储杨辉三角的每一个数字。在for循环中&#xff0c;我们初始化每一行的第一个和最后一个数字&#xff0c;并且根据上一行的数字来计算出中间的数字。 接着&#xff0c;我们使用两个嵌套的for循环来输出杨辉三角。第一个循…...

解决SpringBoot服务返回数据存在$ref $.data等相关问题

1、场景 ​ 在日常的开发中&#xff0c;我们数据接口返回数据使用了FastJson序列化数据&#xff0c;当返回一个数据list时候出现" r e f " " ref" " ref"".data" 等类似乱码一样的数据&#xff0c;当时我比较匪夷所思&#xff0c;我写…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...

Linux 中如何提取压缩文件 ?

Linux 是一种流行的开源操作系统&#xff0c;它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间&#xff0c;使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的&#xff0c;要在 …...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

云原生安全实战:API网关Kong的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关&#xff08;API Gateway&#xff09; API网关是微服务架构中的核心组件&#xff0c;负责统一管理所有API的流量入口。它像一座…...