spring创建bean的三种方法

SpringBoot的Bean Definition 生成过程(源码分析) 1、目的: 从源码的角度分析整个springboot的启动流程、了解springboot项目在整个启动过程都干了一些什么。 因为spring项目的启动主要是分为两步,一个是bean definition的获取,一个是根据bean definition 生成bean。本篇主要涉及 2、demo项目结构的简单描述。 基本的东西都是有的,包括dao,service、model、且包含myba... 阅读详情

Spring支持如下三种方式创建Bean
1:调用构造器创建Bean
2:调用静态工厂方法创建Bean
3:调用实例工厂方法创建Bean

注解@Bean方式
Xml方式
BeanDefinitionBuilder方式

1.注解@Bean方式

通过@Bean方式创建自定义Bean是最明显的方式,
直接在对应的方法上添加@Bean注解,表明这是Bean,
结合@Configuration,Spring会自动创建Bean,
测试样例及注释如下:
BeanDefinitionByAnnotation.java:

package com.example.springbeandemo;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class BeanDefinitionByAnnotation {
    private static final Logger logger = LoggerFactory.getLogger(BeanDefinitionByAnnotation.class);

    @Bean
    public User myUserBean(){
        return new User("hhh",21);
    }
    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
        //注册BeanDefinition
        applicationContext.register(BeanDefinitionByAnnotation.class);
        //加载或刷新配置(JAVA基础配置/XML/properties等)的持久化描述
        //这里关注填充singletonObjects
        applicationContext.refresh();
        logger.info(">>>>>>>>>>应用程序上下文启动");
        User user = applicationContext.getBean(User.class);
        System.out.println(user.getName());
        System.out.println(user.getAge());
        System.out.println(user.getClass());
        logger.info(">>>>>>>>Bean:{}", user);
        applicationContext.close();
        logger.info(">>>>>>>>关闭应用程序上下文");
    }
}

AnnotationConfigApplicationContext实现了Bean定义的注册,Bean的实例化,事件,生命周期,国际化等功能,使用AnnotationConfigApplicationContext可以实现基于Java的配置类加载Spring的应用上下文。避免使用application.xml进行配置。相比XML配置,更加便捷
在这里插入图片描述

2.XML方式

通过XML创建Bean,首先要构建对应的XML文件
bean.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" xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    <!-- 在Spring framework中启用@Resource注解 -->
    <context:annotation-config />
    <!-- 构建User Bean实例:Bean id为user1 -->
    <bean id="userA" class="com.example.springbeandemo.User">
        <property name="name" value="qiezi" />
        <property name="age" value="20" />
    </bean>
</beans>

User.java:

package com.example.springbeandemo;

public class User {
    private String name;
    private int age;
    public User(){

    }
    public User(String name,int age){
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

BeanDefinitionByXml.java:

package com.example.springbeandemo;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class BeanDefinitionByXml {
    private static final Logger logger = LoggerFactory.getLogger(BeanDefinitionByXml.class);
    public static void main(String[] args) {
        String beanConfig = "bean.xml";
        //通过xml配置文件构建Bean
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext(beanConfig);
        User user = applicationContext.getBean("userA", User.class);
        System.out.println(user.getName());
        System.out.println(user.getAge());
        logger.info(">>>>>>>>Creation Bean using XML, User Bean :{}", user);

    }
}

ClassPathXmlApplicationContext是Spring读取xml最常用的类,它只能读取放在WEB-INF/classes/目录下的配置文件,所以在使用ClassPathXmlApplicationContext的时候可以将配置文件放在项目的原文件夹下面,这样编译的时候会将配置文件拷贝到WEB-INF下面去。如果是Springboot项目,一般要把文件呢放到resources配置文件夹下,才可以被ClassPathXmlApplicationContext读取到。
在这里插入图片描述

3.BeanDefinitionBuilder方式

上面两种创建Bean的方式对于应用开发者而言是显式的,
而,更贴近Spring底层的方式是通过BeanDefinition创建Bean,
Spring创建Bean的第一个过程即注册BeanDefinition,就是下面的样例,
通过显式的方式注册BeanDefinition,
然后再创建单例的Bean,测试样例及注释如下:

package com.example.springbeandemo;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class BeanDefinitionByBuilder {
    private static final Logger logger = LoggerFactory.getLogger(BeanDefinitionByBuilder.class);

    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
        //构建BeanDefinition,填充Bean属性
        BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(User.class);
        beanDefinitionBuilder.addPropertyValue("name","nick");
        beanDefinitionBuilder.addPropertyValue("age","20");
        AbstractBeanDefinition beanDefinition = beanDefinitionBuilder.getBeanDefinition();
        //注册BeanDefinition
        applicationContext.registerBeanDefinition("myBean",beanDefinition);
        // 加载或刷新配置(Java基础配置/XML/properties等)的持久化描述,
        // 这里关注填充singletonObjects
        applicationContext.refresh();
        logger.info(">>>>>>>>>>应用程序上下文启动");
        User user1 = applicationContext.getBean(User.class);
        System.out.println(user1.getName());
        System.out.println(user1.getAge());
        User user2 = (User) applicationContext.getBean("myBean");
        System.out.println(user2.getName());
        logger.info(">>>>>>>>>>User:{}, user2:{}", user1, user2);
        applicationContext.close();
        logger.info(">>>>>>>>关闭应用程序上下文");

    }
}

在这里插入图片描述
参考:
https://blog.youkuaiyun.com/Xin_101/article/details/128334261

spring 深入了解bean的创建过程 一、创建bean之初 spring调用 beanFactory.preInstantiateSingletons()此方法完成整个bean生产以及依赖注入,那么在生成bean之前,spring做了哪些事呢? 1.盘点bean定义是否是bean工厂 遍历所有beandefinition 非懒加载以及非抽象bean,单例,去执行AbstractBeanFactory.isFactoryBean(beanName) 方法判断是否是重写 SmartFactoryBean接口的isEagerI... 阅读详情

相关推荐

Spring创建Bean的几种方式

最简单的配置,可以通过xml中bean标签来设置 通过这种方法要在响应类中添加get和set方法,或者添加构造方法.或者可以通过静态工厂或者实例工厂方法 通过这种方式配置要创建一个工厂类,然后将类和方法在xml文件中配置.最后我们还可以通过实现FactoryBean接口来创建一个bean,然后再xml中配置这个实现类即可. 需要注意的是BeanFactory和FactoryBean完全不是一个概念.BeanFactory是spring容器最基本的接口,他提供了spring容器的最基本方法,但是不

weixin_42828799的博客 2827

BeanDefinition 及其构造方式 BeanDefinitionBuilder, AbstractBeanDefinition

BeanDefinition 是个接口,AbstractBeanDefinition 是这个接口的实现类,很多常见的 bean 属性在 AbstractBeanDefinition 中。这是经典的工厂模式,抽象出接口去规范工厂生产的实体类的行为。另外 GenericBeanDefinition 只是子类实现,大部分的属性在 AbstractBeanDefinition 中。/*** bean 对应的 class(用一个 Class 对象来表示)/*** bean 的作用范围。

JellyfishMIX 的博客 3469

J2EE高级开发框架小课程之Spring框架1——Spring创建三种方式:使用无参构造器创建对象(bean标签的方式),使用静态方法创建对象,使用实例方法创建对象(非静态方法)

J2EE高级开发框架小课程1——Spring创建三种方式:使用无参构造器创建对象(bean标签的方式),使用静态方法创建对象,使用实例方法创建对象(非静态方法)

m0_56294528的博客 640

BeanDefinitionBuilder 使用

【代码】BeanDefinitionBuilder 使用。

面朝大海,春暖花开 1729

基于 Cognex VisionPro 的工业级图像匹配技术全解析

通过本文的深度解析,开发者可以系统掌握 Cognex VisionPro 图像匹配技术的核心原理、开发流程、优化策略及工业级应用。实际项目中,需结合具体场景灵活调整参数,综合运用预处理、特征提取和匹配算法,构建稳定可靠的视觉系统。

品质生活,极致编程。 1594

基于分数阶傅里叶变换的chirp信号检测与参数估计(原理附代码)

线性调频信号(chirp信号) 顾名思义,该信号的频率随着时间线性变换,其复数表达形式如下: s(t)=e2jπ(f0t+0.5μt2)s(t)=e^{2j\pi(f_0 t+ 0.5\mu t^2)}s(t)=e2jπ(f0​t+0.5μt2) 根据欧拉公式,其相位项为2π(f0t+0.5μt2))2\pi(f_0 t+ 0.5\mu t^2))2π(f0​t+0.5μt2))。信号的角频率是相位对时间的导数。对相位求导后有2π(f0+μt)2\pi(f_0+\mu t)2π(f0​+μt),显然,f0f

weixin_42845306的博客 1万+

Spring三种创建Bean对象的方法

开发工具与关键技术:eclipse 作者:Mr_恺 撰写时间:2021.12.28 我们用eclipse创建一个java项目,把那些包创建好: dao包下的接口和实现类: service包下的接口和实现类: 把Spring的jar包引进来: 创建一个xml文件并命名为bean.xml,导入Spring的约束 <!-- 导入spring的约束spring的IoC约束:beans--> <beans xmlns="http://www.sprin...

weixin_44546509的博客 3742

汽车BMS技术分享及其HIL测试方案

在全球碳中和目标的战略驱动下,新能源汽车产业正以指数级速度重塑交通出行格局。动力电池作为电动汽车的"心脏",其性能与安全性不仅直接决定了车辆的续航里程、使用寿命等关键指标,更深刻影响着消费者对电动汽车的市场接受度。而电池管理系统(Battery Management System, BMS)是动力电池安全运行与性能释放的核心技术支撑。

Speedgoat的博客 2687

java 创建bean_Spring学习之一----创建Bean的三种方法

Resource resource = new FileSystemResource(“beans.xml”);BeanFactory factory = new XmlBeanFactory(resource);2)ClassPathResource resource = new ClassPathResource(“beans.xml”);BeanFactory factory = new X...

weixin_39776991的博客 1334

Microsemi Libero使用技巧11——CoreUARTAPB RX管脚分配时不显示

调用串口IP核CoreUARTAPB,并例化到顶层设计,发现UART_RX管脚在进行管脚分配时没有显示出来,最后发现是CoreAPB3总线IP核配置不对导致,改为如下配置后正常。

whik1194的博客 758

YOLOv12改进目录一览 | 涉及卷积层、轻量化、注意力、损失函数、Backbone、SPPF、Neck、检测头等全方位改进

1️⃣ 什么!不知道如何改进模型⁉️ 本专栏所使用并改进的每一个模块均包含详细的模块分析、原理讲解、个人总结、多种改进方式以及完整的修改流程,所有改进100%可直接运行,性价比极高。2️⃣ 找不到合适的模块⁉️ 所有改进点均为近三年顶会,顶刊提出的先进算法,将其融入到中,并进行二次创新,新颖度高,创新度高,能够适应不同的任务场景。3️⃣ 不确定自己改进的步骤、结果是否正确⁉️ 订阅专栏即可进群享受模型训练、模型改进、论文写作、投稿选刊,从入门到论文的各种答疑内容,非常适合新手。4️⃣ 团队内发表数篇SCI论

Limiiiing的博客 2万+

Spring创建Bean实例的三种方法

1、使用构造器 2、使用静态工厂类 //静态工厂类(由静态方法创建bean) public class PersonServiceBeanFactory { public static PersonService createPersonService(){ return new PersonService(); } } 3、使用实例化工厂

wind'的专栏 2409

#systemverilog# 之 event region 和 timeslot 仿真调度(三)Verdi 辅助查看

通过今天的学习,我们知道:event region 是event sequence 的全集。我们打开了 event region feature 也就开启了event sequence 的功能。

那么菜的博客 1366

spring中bean的细节 三种创建bean对象的方法 bean作用范围 bean对象的生命周期

spring中bean的细节 一、之三种创建bean对象的方法 把对象的创建交给spring来管理 <!-- spring对bean的管理细节 1.创建bean的三种方式 2.bean对象的作用范围 3.bean对象的生命周期 --> 创建Bean的三种方式 第一种方式:使用默认构造函数创建。 在spring的配置文件中使用bea...

韦恩少爷的博客 494

基于截图详解:SAP GUI for Java 如何设置登录链接,以及 conn= 连接字符串该怎么写

摘要:SAP GUI for Java 的连接属性配置关键是在"高级"页签的"conn="后填写连接字符串。连接字符串格式取决于网络拓扑:直连应用服务器使用"/H/主机/S/端口";通过消息服务器负载均衡使用"/M/消息服务器/S/端口/G/组名";经SAProuter访问则需添加路由器前缀。配置时需注意专家模式会覆盖其他页签设置,且连接字符串还支持附加参数如客户端、语言和默认事务码。具体填写内容应根据Basis团队提供的系统信

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 252

【新能源汽车测试工程师必看!DBC文件50条实战技巧,看懂这篇直接封神】

如果你是新能源汽车研发/测试工程师,还在为信号解析错误、报文找不到、DBC看不懂、实车故障复现不了头疼——那这篇文章,你一定要!在整车电控开发里,DBC = CAN总线的官方字典。没有DBC,报文就是一串乱码;读不懂DBC,测试寸步难行;用不好DBC,排查故障全靠猜。本文总结50条全网最实用、最贴近实车、最能解决问题的DBC技巧,从基础语法到新能源专用信号,从工具操作到故障排错,全部来自一线台架、实车、高压平台实战经验。不废话、不空谈、不玄学,全是能直接落地的硬货!

优快云-新能源汽车研发测试专业博主 1372

Spring学习之一----创建Bean的三种方法

关键字 BeanFactory ApplicationContext 创建Bean的三种方法 Bean的作用域 Bean的生命周期 Bean的XML元数据配置 自动扫描管理Bean 对于Spring框架开发而言,BeanFactory和ApplicationContext无疑是最基础的两个类。那么这篇文章就介绍下。 一 BeanFactory    接口BeanFactory(org.springframework.beans.BeanFactory),其职责是:处理Bean的初始化,定

hua1597531的博客 807

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

spring bean xml 调用方法_把对象的创建交给spring来管理(通过xml创建bean的三种方式)...

ioc全局session<!--把对象的创建交给spring来管理--><!--spring对bean的管理细节 1.创建bean的三种方式 2.bean对象的作用范围 3.bean对象的生命周期--><!--创建Bean的三种方式 --><!-- 第一种方式:使用默认构造函数创建。 在spring的配置文件中使用bean标...

weixin_39655362的博客 341

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

spring框架,springIOC入门,配置文件详解,三种bean的创建方法

IOC: 控制反转 思想大白话: 把创建对象的权利交给spring了 底层技术支持: 工厂+反射+配置文件 (spring都封装好了) 解决的问题: 解耦合 spring的环境搭建: 1 导包: ...

未来架构师的博客 474

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Spring中创建bean的三种方法

construction注入,setter注入,factory-method,因为第三种方法的写法老是忘,特留此文。 简单地说,如果你在Spring xml文件里有一个bean tag(也就是类似于...的一段),那么Spring就会尝试给你创建一个object。那

大头客的专栏 2626

spring 创建bean对象三种方法,以及注意细节

bean.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:schemaLo...

qq_33351986的博客 285

Spring核心容器创建对象时三种方法时,Bean标签属性所代表的意义

1.使用构造函数的方法时创建对象的(用来管理一些直接可以new出来的对象) id:创建对象的唯一标识 class:要创建对象的全限定名 scope:标识要创建对象的范围 单例(只创建一次 每次都是调用的这个创建的)还是多例(可以创建多次 每次都不是同一个对象 地址值不一样) singleton表示单例(默认) 创建核心容器的时候创建 prototype表示多例 每次调用的时候创建 init-method:表示绑定的方法是对象创建的生命周期方法(也即是当对象被创建的时候就运行调用此方法)

lc1062657810的博客 369

创建Bean的三种方式 在大多数情况下,Spring容器直接通过new关键字调用构造器来创建Bean实例,而class属性指定Bean实例的实现类,但这不是实例化Bean的唯一方法。实际上,Sprin

创建Bean的三种方式 在大多数情况下,Spring容器直接通过new关键字调用构造器来创建Bean实例,而class属性指定Bean实例的实现类,但这不是实例化Bean的唯一方法。实际上,Spring支持使用以下三种方式来创建Bean: (1)调用构造器创建Bean (2)调用静态工厂方法创建Bean (3)调用实例工厂方法创建Bean 一 构造器创建Bean实例 如果不采用构造注入

chainiao_zhang的博客 1690

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/

咸鱼的博客 477

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/

咸鱼的博客 169
上一篇: syscall函数(调用底层,非windowsAPI)去执行shellcode
下一篇: 对class文件进行base64编码
qieziwa(boy)
博客等级 码龄7年 5713粉丝 160原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值