首页 > 其他分享 >(一)spring beans

(一)spring beans

时间:2024-04-27 20:12:19浏览次数:23  
标签:spring beanName springframework beans org public

1.beanDefinition 首先是承载class的载体,里面包含了许多如是否单例,属性值等内容。以下只是建议代码,重在理解概念

package org.springframework.spring.beans.factory.config;

/**
 * @ClassName : BeanDefinition  //类名
 * @Description :   //描述
 * @Author : 10300 //作者
 * @Date: 2024/4/27  16:24
 */
public class BeanDefinition {
    private Class beanClass;

    public BeanDefinition(Class beanClass) {
        this.beanClass = beanClass;
    }

    public Class getBeanClass() {
        return this.beanClass;
    }

    public void setBeanClass(Class beanClass) {
        this.beanClass = beanClass;
    }
}

2.DefaultListableBeanFactory 可以理解是bean的最外层容器,Map键值对

package org.springframework.spring.beans.factory.support;

import org.springframework.spring.beans.BeansException;
import org.springframework.spring.beans.factory.config.BeanDefinition;

import java.util.HashMap;
import java.util.Map;

/**
 * @ClassName : DefaultListableBeanFactory  //类名
 * @Description :   //描述
 * @Author : 10300 //作者
 * @Date: 2024/4/27  19:39
 */
public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory implements BeanDefinitionRegistry{

    private final Map<String, BeanDefinition> beanDefinitionMap = new HashMap<>();

    @Override
    public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition) {
        beanDefinitionMap.put(beanName, beanDefinition);
    }

    @Override
    public BeanDefinition getBeanDefinition(String beanName) throws BeansException {
        BeanDefinition beanDefinition = beanDefinitionMap.get(beanName);
        if (beanDefinition == null) throw new BeansException("No bean named '" + beanName + "' is defined");
        return beanDefinition;
    }
}

3.调用DefaultListableBeanFactory.getBean(beanName),AbstractAutowireCapableBeanFactory继承AbstractBeanFactory类型,该AbstractBeanFactory类往下继承DefaultSingletonBeanRegistry类

package org.springframework.spring.beans.factory.support;

import org.springframework.spring.beans.factory.config.SingletonBeanRegistry;

import java.util.HashMap;
import java.util.Map;

/**
 * @ClassName : DefaultSingletonBeanRegistry  //类名
 * @Description :   //描述
 * @Author : 10300 //作者
 * @Date: 2024/4/27  19:16
 */
public class DefaultSingletonBeanRegistry implements SingletonBeanRegistry {
    private final Map<String, Object> SingletionObjects = new HashMap<>();

    @Override
    public Object getSingleton(String beanName) {
        return this.SingletionObjects.get(beanName);
    }

    public void addSingleton(String beanName, Object bean) {
        this.SingletionObjects.put(beanName, bean);
    }
}

AbstractBeanFactory类会判断beanName是否在DefaultSingletionBeanRegistry存在,不存在则去构建bean对象

package org.springframework.spring.beans.factory.support;

import org.springframework.spring.beans.BeansException;
import org.springframework.spring.beans.factory.BeanFactory;
import org.springframework.spring.beans.factory.config.BeanDefinition;
import org.springframework.spring.beans.factory.config.SingletonBeanRegistry;

/**
 * @ClassName : AbstractBeanFactory  //类名
 * @Description :   //描述
 * @Author : 10300 //作者
 * @Date: 2024/4/27  19:31
 */
public abstract class AbstractBeanFactory extends DefaultSingletonBeanRegistry implements BeanFactory {

    @Override
    public Object getBean(String name) throws BeansException {
        Object singleton = this.getSingleton(name);
        if (singleton!=null){
            return singleton;
        }

        BeanDefinition beanDefinition = getBeanDefinition(name);
        return createBean(name,beanDefinition);
    }

    protected abstract BeanDefinition getBeanDefinition(String beanName) throws BeansException;


    protected abstract Object createBean(String beanName, BeanDefinition beanDefinition) throws BeansException;
}
package org.springframework.spring.beans.factory.support;

import org.springframework.spring.beans.BeansException;
import org.springframework.spring.beans.factory.config.BeanDefinition;

/**
 * @ClassName : AbstractAutowireCapableBeanFactory  //类名
 * @Description :   //描述
 * @Author : 10300 //作者
 * @Date: 2024/4/27  19:36
 */
public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory {

    public Object createBean(String beanName, BeanDefinition beanDefinition) throws BeansException{
        Object bean;
        try {
            bean = beanDefinition.getBeanClass().newInstance();
        } catch (InstantiationException | IllegalAccessException e) {
            throw new BeansException("Instantiation of bean failed", e);
        }

        addSingleton(beanName,bean);

        return bean;
    }
}

 

标签:spring,beanName,springframework,beans,org,public
From: https://www.cnblogs.com/jichenghui/p/18162441

相关文章

  • SpringBoot集成minio前后端联调
    基本配置初始化项目新建一个SpringBoot项目,集成lombokmybatis-plusminiohutool-core(可有可无)。新建一个数据表attachement,用于存储文件上传后在minio中的位置。droptableifexistsattachment;createtableattachment(idintauto_increment......
  • spring-securty-oauth2使用例子
    oauth2概念https://www.cnblogs.com/LQBlog/p/16996125.html环境搭建1.引入依赖<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-oauth2</artifactId></depen......
  • spring boot
    链接:https://pan.baidu.com/s/1quiC-bqO5s3KgoLT5MWX7Q?pwd=412p提取码:412p1.Springboot入门springboot-简化了开发-比如-我们之前导入依赖--到需要自己写配置类-返回Beanspringboot帮我们简化了这个工程SpringBoot提供了一种快速使用Spring的方式,基于约定优于配置的思想sp......
  • 有意思!一个关于 Spring 历史的在线小游戏
    发现SpringOne的官网上有个好玩的彩蛋,分享给大家!进到SpringOne的官网,可以看到右下角有个类似马里奥游戏中的金币图标。点击该金币之后,会打开一个新的页面,进入下面这样一个名为:TheHistoryOfSpring的在线小游戏你可以使用上下左右的方向键来控制Spring的Logo一步步经历......
  • 一个通用的SpringBoot项目响应实体类Response
    packagecom.luky.vo;importlombok.AllArgsConstructor;importlombok.Data;importlombok.NoArgsConstructor;importlombok.ToString;importorg.springframework.http.HttpStatus;@Data@ToString@AllArgsConstructor@NoArgsConstructorpublicclassResponse&......
  • SpringBoot+MyBatisPlus报错 Invalid value type for attribute 'factoryBeanObjectTy
    依赖版本org.springframework.boot:spring-boot-starter-web:3.2.5com.baomidou:mybatis-plus-boot-starter:3.5.5错误Invalidvaluetypeforattribute'factoryBeanObjectType'问题原因:这个问题是由于依赖传递导致,在MyBatis起步依赖中的myBatis-spring版本过低,导致程......
  • spring-接口大全
    1.Bean相关1.InitializingBeanInitializingBean接口为bean提供了初始化方法的方式,它只包括afterPropertiesSet方法,凡是继承该接口的类,在初始化bean的时候都会执行该方法。demo@ComponentpublicclassMyInitBeanimplementsInitializingBean{publicvoidafterPro......
  • springboot链接redis IPV6
    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><exclusions><exclusion>......
  • Spring Boot应用中如何动态指定数据库,实现不同用户不同数据库的场景
    当在SpringBoot应用程序中使用SpringDataJPA进行数据库操作时,配置Schema名称是一种常见的做法。然而,在某些情况下,模式名称需要是动态的,可能会在应用程序运行时发生变化。比如:需要做数据隔离的SaaS应用。所以,这篇博文将帮助您解决了在SpringBoot应用程序中如何设置动态S......
  • springBoot源码(一)
    构造函数运行代码publicConfigurableApplicationContextrun(String...args){ Startupstartup=Startup.create(); if(this.registerShutdownHook){ SpringApplication.shutdownHook.enableShutdownHookAddition(); } DefaultBootstrapContextbootstrapConte......