• 【JavaSpring】spring接口-beanfactory和applicationcontext与事件解耦


    beanfactory

    1.applicationcontext的父接口

    2.是Spring的核心容器

    功能

    表面只有getBean,但实现类默默发挥了巨大作用

    1.管理所有bean

    2.控制反转

    3.基本的依赖注入

    实现(后处理器)

    1. package org.example;
    2. import org.springframework.beans.factory.annotation.Autowired;
    3. import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
    4. import org.springframework.beans.factory.support.AbstractBeanDefinition;
    5. import org.springframework.beans.factory.support.BeanDefinitionBuilder;
    6. import org.springframework.beans.factory.support.DefaultListableBeanFactory;
    7. import org.springframework.context.annotation.AnnotationConfigUtils;
    8. import org.springframework.context.annotation.Bean;
    9. import org.springframework.context.annotation.Configuration;
    10. import org.springframework.stereotype.Component;
    11. import static java.rmi.server.LogStream.log;
    12. public class TestBeanFactory {
    13. public static void main(String[] args) {
    14. DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
    15. //bean的定义(描述bean的特征)
    16. AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition(Config.class).setScope("singleton").getBeanDefinition();
    17. beanFactory.registerBeanDefinition("config", beanDefinition);
    18. System.out.println("原始已有的bean");
    19. for (String name : beanFactory.getBeanDefinitionNames()) {
    20. System.out.println(name);
    21. }
    22. //添加一些常用的后处理器
    23. AnnotationConfigUtils.registerAnnotationConfigProcessors(beanFactory);
    24. System.out.println("添加一些常用的后处理器");
    25. for (String name : beanFactory.getBeanDefinitionNames()) {
    26. System.out.println(name);
    27. }
    28. //调用后处理器
    29. System.out.println("调用后处理器");
    30. beanFactory.getBeansOfType(BeanFactoryPostProcessor.class).values().forEach(beanFactoryPostProcessor -> {
    31. beanFactoryPostProcessor.postProcessBeanFactory(beanFactory);
    32. });
    33. for (String name : beanFactory.getBeanDefinitionNames()) {
    34. System.out.println(name);
    35. }
    36. }
    37. @Configuration
    38. static class Config {
    39. @Bean
    40. public Bean1 bean1() {
    41. return new Bean1();
    42. }
    43. @Bean
    44. public Bean2 bean2() {
    45. return new Bean2();
    46. }
    47. }
    48. @Component
    49. static class Bean1 {
    50. public Bean1() {
    51. log("构造Bean1()");
    52. }
    53. @Autowired
    54. private Bean2 bean2;
    55. public Bean2 getBean2() {
    56. return bean2;
    57. }
    58. }
    59. @Component
    60. static class Bean2 {
    61. public Bean2() {
    62. log("构造Bean2()");
    63. }
    64. }
    65. }

    applicationcontext

    功能

    1.继承了MessageSource,有了处理国际化资源的能力

    context.getMessage("hi",null,locale.CHINA)//参数:翻译内容,配置,语言类型

    2.继承了ResourcePatternResolver,有了根据通配符匹配多个资源的能力

    context.getResource(classpath:application.properties)//参数:资源

    3.继承了ApplicationEventPublisher,有了发布事件对象的能力

    context.getEnvironment().getProperty("java_home")//环境变量名称

    4.继承了EnvironmentCapable,有了读取、处理环境信息的能力,用于解耦

    context.publishEvent(new UserRegisteredEvent(context));//参数:事件源

    监听器(增加方法) 

    1. //无返回值,名字随意,参数固定
    2. @EventListener
    3. public void aaa(UserRegisteredEvent event){
    4. log.debug("{}",event)
    5. }

    实现

    beanfactory和applicationcontext的关系

    applicationcontext间接继承了beanfactory,applicationcontext把beanfactory作为成员变量

    applicationcontext的功能更多

  • 相关阅读:
    从Hugging Face上手动下载并加载预训练模型
    ACID事务理论
    【Java面经】阿里三面被挂、幸获内推,历经5轮终于拿到口碑offer
    form表单内嵌套动态表格添加校验功能
    树状数组基本操作
    区块链共识机制 (Consensus)(PoW,PoS,PAXOS,RAFT,PBFT)
    案例题-软件架构设计
    ViT-YOLO论文解读
    深入理解AQS之CyclicBarrier
    Hive优化
  • 原文地址:https://blog.csdn.net/David_Hzy/article/details/132148853