Spring之【Bean工厂后置处理器】

目录

BeanFactoryPostProcessor

BeanDefinitionRegistryPostProcessor

使用一下Bean工厂后置处理器

定义包扫描范围

定义一个组件Bean

定义一个普通的类

自定义一个组件类实现Bean工厂后处理器

测试类


BeanFactoryPostProcessor

  • 该接口是Spring提供的扩展点之一
  • 是一个函数式接口,只有一个抽象方法
  • Spring会在合适的时机执行方法回调,并将bean工厂作为参数传递进去

既然把ConfigurableListableBeanFactory类型的bean工厂传递过来了,那么该类型中的方法我是不是就可以为所欲为地为自己所用了啊

java 复制代码
package org.springframework.beans.factory.config;

import org.springframework.beans.BeansException;

// 函数式接口
@FunctionalInterface
public interface BeanFactoryPostProcessor {

    // 参数为bean工厂
	void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;

}

BeanDefinitionRegistryPostProcessor

  • 是BeanFactoryPostProcessor的子接口
  • 自身提供了一个将BeanDefinitionRegistry作为参数传递进来的方法

把BeanDefinitionRegistry传递过来了,BeanDefinitionRegistry是用来管理BeanDefinition的,提供了一系列操作BeanDefinition的方法,那么我就可以操作Spring容器中的BeanDefinition了

java 复制代码
package org.springframework.beans.factory.support;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;

// 继承了BeanFactoryPostProcessor
public interface BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor {

    // 将BeanDefinitionRegistry作为参数
	void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException;

}

使用一下Bean工厂后置处理器

定义包扫描范围

java 复制代码
package spring.demo;

import org.springframework.context.annotation.ComponentScan;

// 扫描spring.demo及其子包
@ComponentScan("spring.demo")
public class SpringConfig {
}

定义一个组件Bean

java 复制代码
package spring.demo;

import org.springframework.stereotype.Component;

// 这里添加了@Component注解
// Spring容器启动过程中通过ConfigurationClassPostProcessor解析@Component注解,将Cat类的BeanDefinitoon放入容器中
@Component
public class Cat {
}

定义一个普通的类

java 复制代码
package spring.demo;

// Dog类只是一个普通的Java类,没加任何注解
public class Dog {
}

自定义一个组件类实现Bean工厂后处理器

java 复制代码
package spring.demo;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.beans.factory.support.GenericBeanDefinition;
import org.springframework.stereotype.Component;

@Component
public class CustomBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {
    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
        // Dog类只是一个普通的类
        // 在这里我通过Spring的回调拿到BeanDefinitionRegistry
        // 通过BeanDefinitionRegistry将Dog类的定义信息放入Spring容器中
        GenericBeanDefinition beanDefinition = new GenericBeanDefinition();
        beanDefinition.setBeanClass(Dog.class);
        registry.registerBeanDefinition("dog", beanDefinition);
    }

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        // Spring回调将beanFactory传递过来
        // 这里通过beanName从beanFactory中获取到对应的BeanDefinition信息
        BeanDefinition catBeanDefinition = beanFactory.getBeanDefinition("cat");
        String beanClassName = catBeanDefinition.getBeanClassName();
        // 这里打印出:spring.demo.Cat
        System.out.println(beanClassName);
    }
}

测试类

java 复制代码
package spring.demo;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;


public class SpringMain {
    public static void main(String[] args) {
        // 启动Spring容器
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfig.class);
        // 从容器中获取beanName为cat的bean
        Object catBean = applicationContext.getBean("cat");
        // 这里打印出:spring.demo.Cat@4310d43
        System.out.println(catBean);

        // 从容器中获取beanName为cat的bean
        Object dogBean = applicationContext.getBean("dog");
        // 这里打印出:spring.demo.Dog@54a7079e
        System.out.println(dogBean);
    }
}
相关推荐
王者鳜錸14 小时前
方言普通话识别大模型,支持中英+202种方言识别
java·vue·语音识别
haokan_Jia14 小时前
【springboot的分页功能TableDataInfo,有时候需要复杂的分页实现,怎么办呢?】
java·spring boot·后端
Terio_my14 小时前
Java 后端面试技术文档(参考)
java·开发语言·面试
南部余额14 小时前
Maven 依赖管理与版本优化
java·maven
create1715 小时前
IntelliJ IDEA 等软件如何与 AI 编程工具(Cursor、Windsurf、Qoder等)实现互相跳转
java·ide·人工智能·intellij-idea
望获linux15 小时前
论文解读:利用中断隔离技术的 Linux 亚微秒响应性能优化
java·linux·运维·前端·arm开发·数据库·性能优化
龙茶清欢15 小时前
7、微服务中 DTO、VO、PO、BO 的设计规范
java·spring boot·spring cloud
ToneChip15 小时前
配合AI自动生成时序图--最详细在VS Code中使用PlantUML绘图
java
苏纪云15 小时前
算法<java>——排序(冒泡、插入、选择、归并、快速、计数、堆、桶、基数)
java·开发语言·算法