gball个人知识库
首页
基础组件
基础知识
算法&设计模式
  • 操作手册
  • 数据库
  • 极客时间
  • 每日随笔
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
  • 画图工具 (opens new window)
关于
  • 网盘 (opens new window)
  • 分类
  • 标签
  • 归档
项目
GitHub (opens new window)

ggball

后端界的小学生
首页
基础组件
基础知识
算法&设计模式
  • 操作手册
  • 数据库
  • 极客时间
  • 每日随笔
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
  • 画图工具 (opens new window)
关于
  • 网盘 (opens new window)
  • 分类
  • 标签
  • 归档
项目
GitHub (opens new window)
  • 面试

  • 数据库

  • linux

  • node

  • tensorFlow

  • 基础组件

    • mybatis

    • spring

      • 源码分析

        • spring管理bean之间的协同方式
        • Bean的生命周期
      • Conditional 注解
      • IOC
      • spring bean的配置方式
      • springCache配合redis做缓存
      • springIOC
      • spring的refresh方法解析
      • spring模块介绍
      • spring声明式事务失效原因
      • spring事务实战
      • spring语法变化
      • spring的配置信息
      • springBean了解
        • 1. 定义springBean
        • 2. Beandefinition 元信息
        • 3. 命名spring bean
        • 4. spring bean的别名
        • 5. 注册spring Beandefinition
          • 注册BeanDefinition 方式
        • 6. 实例化spring bean
          • 通过构造器
          • 通过静态工厂方法
          • 通过实例化工厂方法
          • 通过factoryBean实例化bean
          • 通过serviceLoader实例化bean
          • 通过serviceLoaderBeanFactory 实例化bean
          • 通过 AutowireCapableBeanFactory 实例化bean
        • 7. 初始化spring bean
        • 8. 延迟实例化spring bean
        • 9. 销毁spring bean
        • 10. 垃圾回收spring bean
      • spring的三级缓存如何解决循环依赖
    • 消息队列

    • springboot

    • tomcat如何工作

    • elasticsearch

  • 基础知识

  • 算法与设计模式

  • 分布式

  • 疑难杂症

  • go学习之旅

  • 极客时间

  • 知识库
  • 基础组件
  • spring
ggball
2022-04-19

springBean了解

# springBean了解

# 1. 定义springBean

# 2. Beandefinition 元信息

# 3. 命名spring bean

# 4. spring bean的别名

# 5. 注册spring Beandefinition

# 注册BeanDefinition 方式

# 1. xml

  <beans>
        <description>ggBall的bean工厂</description>
        <import resource="textBean.xml"/>
        <alias name="veryComplexDomain" alias="vcd"/>

        <bean id="user" class="com.zhu.entity.User" >
            <constructor-arg index="0">
                <ref bean="son"/>
            </constructor-arg>
        </bean>

        <bean id="son" class="com.zhu.entity.Son">
            <property name="id" value="1"/>
            <property name="name" value="小名"/>
        </bean>

    </beans>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# 2. 注解 (@Bean,@Component,@Import)

@Configuration
@Import(User.class)
public class Config {

    @Bean
    public User user(){
        return new User();

    }

    @Bean
    public Son son() {
        return new Son();
    }

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# 3. java Api

  • BeanDefinitionRegistry#registerBeanDefinition
/**
	 * 命名方式 注册BeanDefinition
	 * registry.registerBeanDefinition(beanName,beanDefinition);
	 * @param registry
	 * @param beanName
	 * @param classBean
	 */
	public static void registerBeanDefinition(BeanDefinitionRegistry registry,String beanName,Class classBean) {
		BeanDefinitionBuilder definitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(classBean);

		definitionBuilder.addPropertyValue("name","xxx")
				.addPropertyValue("id","1");

		AbstractBeanDefinition beanDefinition = definitionBuilder.getBeanDefinition();
		registry.registerBeanDefinition(beanName,beanDefinition);
	}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  • BeanDefinitionReaderUtils#registerWithGeneratedName
/**
	 * 非命名方式 注册BeanDefinition
	 * BeanDefinitionReaderUtils.registerWithGeneratedName(beanDefinition,registry);
	 * @param registry
	 * @param classBean
	 */
	public static void registerBeanDefinition(BeanDefinitionRegistry registry,Class classBean) {
		BeanDefinitionBuilder definitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(classBean);

		definitionBuilder.addPropertyValue("name","xxx_1")
				.addPropertyValue("id","1");

		AbstractBeanDefinition beanDefinition = definitionBuilder.getBeanDefinition();
		BeanDefinitionReaderUtils.registerWithGeneratedName(beanDefinition,registry);
	}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 6. 实例化spring bean

我个人理解bean的元信息是Bean初始化时所需要的配置参数。

# 通过构造器

# xml配置元信息

 <bean id="user" class="com.zhu.entity.User" >
     <!--这是有参构造器-->
    <constructor-arg index="0">
        <ref bean="son"/>
    </constructor-arg>
  </bean>
1
2
3
4
5
6

# java类配置元信息

未找到

# 注解配置元信息

// spring实际上扫描类的构造方法,实例化bean
@Component
public class Son {

    private Long id;
    private String name;
}
1
2
3
4
5
6
7

# 通过静态工厂方法

# xml配置

@Data
public class StaticFactoryUser {
    private Long id;
    private String name;

    public static StaticFactoryUser createInstance() {
        return new StaticFactoryUser();
    }
}
1
2
3
4
5
6
7
8
9
        <!-- 静态工厂实例化bean -->
        <bean id="staticFactoryUser" class="com.zhu.instantiate_bean.StaticFactoryUser" factory-method="createInstance"></bean>
1
2

# java Api配置

  • 未找到

# 通过实例化工厂方法

# xml配置

public interface UserFactory {

	default StaticFactoryUser createUser() {
		return StaticFactoryUser.createInstance();
	}

  public  class InsUserFactory implements UserFactory {
}

}
1
2
3
4
5
6
7
8
9
10
    <!--实例化工厂方法实例化bean-->
		<bean id="insUserFactory" class="com.zhu.instantiate_bean.factory.InsUserFactory"></bean>
		<bean id="noneStaticFactoryUser" factory-bean="insUserFactory" factory-method="createUser"></bean>
1
2
3

# java Api配置

  • 未找到

# 通过factoryBean实例化bean

public class UserFactoryBean implements FactoryBean {
	@Override
	public Object getObject() throws Exception {
		return new User();
	}

	@Override
	public Class<?> getObjectType() {
		return User.class;
	}
}
1
2
3
4
5
6
7
8
9
10
11
<!-- 利用factoryBean实例化bean-->
<bean id="userFactoryBean" class="com.zhu.instantiate_bean.factory_bean.UserFactoryBean"></bean>
1
2

# 通过serviceLoader实例化bean

  1. resource目录下建立META-INF/services目录,再创建文件,文件名使用接口名,里面的内容填写接口实现类的全限定名 resource目录下建立services目录
  2. 大概流程:serviceLoader 会去找META-INF/services下文件,找到实现类的全限定名,再利用class.forName("全限定名")得到calss类,再实例化对象。
/**
	 * 利用serviceLoader 实例化bean
	 */
	public static void testServiceLoader() {
		ServiceLoader<UserFactory> serviceLoader = ServiceLoader.load(UserFactory.class);
		Iterator<UserFactory> iterator = serviceLoader.iterator();
		while (iterator.hasNext()) {
			UserFactory userFactory = iterator.next();
			User user = userFactory.createUser();
			System.out.println("use ServiceLoader user = " + user);
		}
	}
1
2
3
4
5
6
7
8
9
10
11
12

# 通过serviceLoaderBeanFactory 实例化bean

  1. resource目录下建立META-INF/services目录,再创建文件,文件名使用接口名,里面的内容填写接口实现类的全限定名 resource目录下建立services目录
  2. xml配置
	<!-- 利用serviceLoaderBeanFactory 创建 serviceLoader ,再利用serviceLoader 实例化bean-->
		<bean id="userServiceLoaderFactoryBean" class="org.springframework.beans.factory.serviceloader.ServiceLoaderFactoryBean">
			<property name="serviceType" value="com.zhu.instantiate_bean.factory.UserFactory"></property>
		</bean>
1
2
3
4
  1. 从容器拿到serviceLoader,后面流程和通过serviceLoader实例化bean一样的
/**
	 * 利用serviceLoaderBeanFactory 创建 serviceLoader ,再利用serviceLoader 实例化bean
	 */
	public static void testServiceFactoryBean() {

		ServiceLoader<UserFactory> serviceLoader = (ServiceLoader<UserFactory>)applicationContext.getBean("userServiceLoaderFactoryBean");
		Iterator<UserFactory> iterator = serviceLoader.iterator();
		while (iterator.hasNext()) {
			UserFactory userFactory = iterator.next();
			User user = userFactory.createUser();
			System.out.println("use ServiceFactoryBean user = " + user);
		}
	}
1
2
3
4
5
6
7
8
9
10
11
12
13

# 通过 AutowireCapableBeanFactory 实例化bean

	/**
	 * 通过 AutowireCapableBeanFactory 实例化bean
	 */
	public static void testAutowireCapableBeanFactory() {
		// applicationContext 虽然继承beanFactory 但是想通过applicationContext拿到beanFactory只能get
		AutowireCapableBeanFactory autowireCapableBeanFactory = applicationContext.getAutowireCapableBeanFactory();
		InsUserFactory userFactory = autowireCapableBeanFactory.createBean(InsUserFactory.class);
		User user = userFactory.createUser();
		System.out.println("use autowireCapableBeanFactory user = " + user);
	}
1
2
3
4
5
6
7
8
9
10

# 7. 初始化spring bean

# 8. 延迟实例化spring bean

# 9. 销毁spring bean

# 10. 垃圾回收spring bean

上次更新: 2025/06/04, 15:06:15
spring的配置信息
spring的三级缓存如何解决循环依赖

← spring的配置信息 spring的三级缓存如何解决循环依赖→

最近更新
01
AIIDE
03-07
02
githubActionCICD实战
03-07
03
windows安装Deep-Live-Cam教程
08-11
更多文章>
Theme by Vdoing
总访问量 次 | 总访客数 人
| Copyright © 2021-2025 ggball | 赣ICP备2021008769号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×

评论

  • 评论 ssss
  • 回复
  • 评论 ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
  • 回复
  • 评论 ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
  • 回复
×