Spring中有哪些扩展点?和@Import注解的使用
创始人
2024-05-28 23:11:31
0

Spring中有哪些扩展点?和@Import注解的使用

  • 1.BeanDefinitionRegisterPostProcessor
    • 作用
    • 代码示例
  • 2.BeanFactoryPostProcessor
    • 作用:
    • 代码示例:
  • 3.BeanPostProcessor
    • 作用
  • 4.SmartInitializingSingletion
    • 作用
    • 代码示例
  • 5.@Import注解的使用
    • 5.1注入普通的对象或配置类对象
    • 5.2 实现ImportSelector接口
    • 5.3 实现DeferredImportSelector接口
    • 5.4导入ImportBeanDefinitionRegistrar 的实现类

1.BeanDefinitionRegisterPostProcessor

作用

实现该接口后可以注册BeanDefinition对象到Spring IOC容器,是对BeanDefinition的扩展。

代码示例

@Component //这里需要交给Spring管理才会回调
public class MyBeanDefinitionRegisterPostProcessor implements BeanDefinitionRegistryPostProcessor {@Overridepublic void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition(PersonService.class).getBeanDefinition();// 采用有参构造器初始化时必须传入,默认无参构造器时无需传入beanDefinition.getConstructorArgumentValues().addGenericArgumentValue(1.0);// 这里还可以调用为属性传值beanDefinition.getPropertyValues().add("name","张小明");beanDefinitionRegistry.registerBeanDefinition(PersonService.class.getSimpleName(),beanDefinition);}@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {}
}

创建实体:

public class PersonService {private Long version;private String name;//必须通过这个有参构造器构建public PersonService(Long version) {this.version = version;}public void test() {System.out.println("test running");System.out.println("version:"+version+",name:"+name);}public String getName() {return name;}public void setName(String name) {this.name = name;}
}

测试:

public class MyBeanDefinitionRegisterPostProcessorTest {@Testpublic void testBeanDefinitionReister() {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ExpressServiceApplication.class);PersonService bean = context.getBean(PersonService.class);bean.test();}
}

2.BeanFactoryPostProcessor

作用:

将BeanFacotry回传,获取到IOC容器后可用查询、使用、扩展一切IOC容器提供的方法,如:所有的BeanDefintion注册完成后,对beanDefinition对象进行扩展。
调用时机:IOC加载注册beanDefinition完成之后。

代码示例:

@Component
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {for (String beanDefinitionName : beanFactory.getBeanDefinitionNames()) {System.out.println(beanDefinitionName);}//可用通过如下方式进行扩展
//        BeanDefinition beanDefinition = beanFactory.getBeanDefinition("xxx");}
}

3.BeanPostProcessor

作用

可用在bean初始化前和初始化后进行回调,修改bean。

4.SmartInitializingSingletion

作用

在所有的Bean创建完成后的回调

代码示例

@Component
public class MySmartInitializingSingleton implements SmartInitializingSingleton {@Overridepublic void afterSingletonsInstantiated() {System.out.println("所有的单例Bean加载完成了...");}
}

5.@Import注解的使用

5.1注入普通的对象或配置类对象

如果是普通类会解析生成Bean,配置类会按照配置类正常解析。

@SpringBootApplication
@Import(PersonService.class)
public class ExpressServiceApplication {public static void main(String[] args) {new SpringApplicationBuilder(ExpressServiceApplication.class).run(args);}
}

5.2 实现ImportSelector接口

代码示例如下:

public class MyImportSelector implements ImportSelector {@Overridepublic String[] selectImports(AnnotationMetadata annotationMetadata) {return new String[] {"org.chenglj.express.spring.ext.PersonService"};}
}
@SpringBootApplication
@Import(MyImportSelector .class)
public class ExpressServiceApplication {public static void main(String[] args) {new SpringApplicationBuilder(ExpressServiceApplication.class).run(args);}
}

5.3 实现DeferredImportSelector接口

DeferredImportSelector继承至ImportSelector,用法一样,区别在延迟、分组特性?spring-boot自动配置类常用该接口实现。
BeanDefinition的注册顺序:

  1. @Configuration / @Import - @Configuration
  2. @Component
  3. @Import -class
  4. @Import -@Bean / @Bean
  5. @Import - ImportBeanDefinitionRegistrar
  6. @Import - DeferredImportSelector

5.4导入ImportBeanDefinitionRegistrar 的实现类

public class MyImportBeanDefinitionRegister implements ImportBeanDefinitionRegistrar {/*@Overridepublic void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry, BeanNameGenerator importBeanNameGenerator) {registerBeanDefinitions(importingClassMetadata,registry);}*/@Overridepublic void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {GenericBeanDefinition beanDefinition = new GenericBeanDefinition();beanDefinition.setBeanClass(PersonService.class);beanDefinition.getConstructorArgumentValues().addGenericArgumentValue(2.0);registry.registerBeanDefinition(PersonService.class.getSimpleName(), beanDefinition);}
}

相关内容

热门资讯

海南自贸港正式封关 “零关税”... 12月18日,海南自贸港全岛封关运作正式启动。在封关前半个月,《新闻调查》栏目组赴海南拍摄记录,详细...
湖南大学法学院党委书记李劲松到... 2025年12月19日下午,湖南大学长沙校友会“法商共创探讨沙龙”在湖南芙蓉律师事务所44楼大会议室...
从法律咨询到健康关怀:长沙市律... 2025年12月16日至19日,湖南省中医附一医院的高级康复理疗师在湖南芙蓉律师事务所,开展了一场为...
新闻调查丨海南自贸港正式封关 ... 12月18日,海南自贸港全岛封关运作正式启动。在封关前半个月,《新闻调查》栏目组赴海南拍摄记录,详细...
具身智能迎来政策“红利期”,灵... 一台身形庞大的机器人,却拥有一双灵巧的“手”。它可以根据任务指令,用五根手指灵活地拿取物品,精准避障...
明年,山西省将实现政策范围内住... 12月19日,山西省医保局发布消息,我省通过提高保障水平、优化经办服务,切实减轻参保职工生育医疗负担...
南通市海门区:“三及时”制度助... “一名机关干部因房屋漏水与邻里产生矛盾,社区监督员第一时间反馈后,镇上组织部门迅速介入提醒该干部并协...
涉外企业跨境金融服务政策宣讲会... 本报讯(记者 安欣欣)12月19日,由郑州市委金融委员会办公室、中国人民银行河南省分行联合举办的涉外...
保持领先!前海制度创新硕果累累 制度创新成果的持续涌现,使前海在全国自贸区中保持领先地位。图为前海湾夜景。(新华社发) 深圳商报记者...
坚持政策支持与改革创新并举 增... 必须坚持政策支持与改革创新并举的宏观经济治理思想,植根于中国特色社会主义市场经济理论,体现了有效市场...