首页 > 编程语言 >纯编程式驱动IOC

纯编程式驱动IOC

时间:2022-10-05 21:58:09浏览次数:37  
标签:AnnotationConfigApplicationContext 编程 ctx Cat personDefinition new 驱动 IOC class

编程式创建bean

public static void main(String[] args) throws Exception {
    AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
    BeanDefinition personDefinition = BeanDefinitionBuilder.rootBeanDefinition(Person.class).getBeanDefinition();
    ctx.registerBeanDefinition("person", personDefinition);
    ctx.refresh();
    Person person = ctx.getBean(Person.class);
    System.out.println(person);
}

编程式依赖注入

public class ProgrammaticInjectApplication {
    
    public static void main(String[] args) throws Exception {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
        BeanDefinition personDefinition = BeanDefinitionBuilder.rootBeanDefinition(Person.class)
            .addPropertyValue("name", "老王").getBeanDefinition();
    ctx.registerBeanDefinition("laowang", personDefinition);
    
    BeanDefinition catDefinition = BeanDefinitionBuilder.rootBeanDefinition(Cat.class)
            .addPropertyValue("name", "咪咪").addPropertyReference("person", "laowang")
            .getBeanDefinition();
    ctx.registerBeanDefinition("mimi", catDefinition);
        ctx.refresh();
        Cat cat = ctx.getBean(Cat.class);
        System.out.println(cat);
    }
}

refresh 方法会触发 单实例bean 的实例化

包扫描器ClassPathBeanDefinitionScanner:

public static void main(String[] args) throws Exception {
    AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();

    BeanDefinition personDefinition = BeanDefinitionBuilder.rootBeanDefinition(Person.class)
            .addPropertyValue("name", "老王").getBeanDefinition();
    ctx.registerBeanDefinition("laowang", personDefinition);

    ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner(ctx);
    scanner.addIncludeFilter((metadataReader, metadataReaderFactory) -> {
        return metadataReader.getClassMetadata().getSuperClassName().equals(Animal.class.getName());
    });
    
    // int count = scanner.scan("com.linkedbear.spring.programmatic.b_di.bean");
    Set<BeanDefinition> animalDefinitions = scanner
            .findCandidateComponents("com.linkedbear.spring.programmatic.b_di.bean");
    animalDefinitions.forEach(definition -> {
        MutablePropertyValues propertyValues = definition.getPropertyValues();
        String beanClassName = definition.getBeanClassName();
        propertyValues.addPropertyValue("name", beanClassName);
        propertyValues.addPropertyValue("person", new RuntimeBeanReference("laowang"));
        ctx.registerBeanDefinition(Introspector.decapitalize(beanClassName.substring(beanClassName.lastIndexOf("."))), definition);
    });
    
    ctx.refresh();

    Cat cat = ctx.getBean(Cat.class);
    System.out.println(cat);
}

xml配置文件解析器XmlBeanDefinitionReader:

 XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(ctx);
 reader.loadBeanDefinitions(new ClassPathResource("programmatic/programmatic-components.xml"));

标签:AnnotationConfigApplicationContext,编程,ctx,Cat,personDefinition,new,驱动,IOC,class
From: https://www.cnblogs.com/sjj123/p/16756503.html

相关文章

  • C++/Python混合编程
    以C++为底层基础,Python作为上层建筑,共同搭建起高性能、易维护、可扩展的混合系统。Python本身就有C接口,可以用C语言编写扩展模块,把一些低效耗时的功能改用C实现......
  • 【linux基础】ubuntu系统NVIDIA驱动安装
    前言在安装GPU环境下的软件工具,特别是CUDA/CUDNN等,一定要先把GPU环境搭建好。NVIDIA驱动安装会遇到各种问题,真希望黄教主可以将各个工具如何安装使用讲解的更加细致、清楚一......
  • 编程的学习总结
    一,实验代码   #include<stdio.h>intmain(){printf("Hello,world!")}  二,设计思路 第一步:打框架第二步:算法是排序   第三步:编译,查......
  • 对比python学julia(第四章:人工智能)--(第一节)OpenCV编程初步(3)
    1.4. 人脸检测(续上)3.检测视频中的人脸在VSCode环境中,新建一个空白源文件,以detect_video.jl作为文件名保存到项目文件夹中,然后编写程序检测视频流......
  • Linux多线程服务端编程 pdf
    高清文字版下载链接:https://pan.baidu.com/s/1Ar0sbiycp70BdNysXfkg2w点击这里获取提取码 ......
  • IOC容器的配置元 definition
    beans的配置元信息:context的配置元信息:beandefinition:BeanDefinition描述了SpringFramework中bean的元信息,它包含bean的类信息、属性、行为、依赖关系、配置......
  • (函数)编程:定义一个函数fun(a,b,c),返回一元二次方程ax^2+bx+c=0的两个解。程序运行后输
    样例输入231 样例输出(-0.5,-1.0) 样例输入246 样例输出输入错误,无解 解题代码importmathdeffun(a,b,c):dt=b*b-4*a*cx1=(-b......
  • LCCUP 22秋季编程大赛
    ​​LCCUP22秋季编程大赛​​总结:交的时候,460名然后慢慢得掉到最后580。第三题一开始没读好题,浪费了很长时间。四五题没有什么思路,直接就没写了。(横向对比,比春季进步了......
  • Python编程经验
    目录代码结构工作目录全局变量调试信息异常处理尝试次数化简结构日志哈希和ID函数第三方库exchangelib字符串处理replacestripsplitjoin格式化列表处理打包函数代码结构......
  • python的入门TCP编程
    一、创建TCP服务器创建TCP服务器的流程:使用socket创建一个套接字使用bind绑定IP和端口使用listen让套接字变成可以被动连接使用accept等待客户端的连接使用recv/send接收......