《读spring源码》14实现FactoryBean接口

package com.enjoy.cap6;


import com.enjoy.cap1.Person;
import com.enjoy.cap5.LinCodition;
import com.enjoy.cap5.WinCodition;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

@Configuration
@Import(value = {Dog.class,Cat.class,TTTTImportSelector.class,TTTImportBeanDefinitionRegistrar.class})
public class MainConfig {

    /**
     * 1、@Bean   【导入第三方的类或包的组件】,比如Person为第三方的类,需要我们IOC使用时
     * 2、包扫描+组件的标注注解(@ComponentScan:@Controller,@Service,@Repository,@Componet)一般针对自己写的类
     * 3、@Import:【快速给容器导入一个组件】注意@Bean有点简单
     *              1)@Import(要导入到容器中的组件):容器会自动注册这个组件,bean的id为全类名
     *              2)ImportSelector:是一个接口,返回需要导入到容器的组件的全类名数组。
     *              3)ImportBeanDefinitionRegistrar:模块化管理,可以手动添加组件到IOC容器,所有Bean的注册可以使用BeanDifinitionRegistry
     *              写TTTImportBeanDefinitionRegistrar实现registerBeanDefinitions接口即可
     * 4、使用Spring提供的FactoryBean(工厂Bean)进行注册---FactoryBean是进行注册的BeanFactory是获取容器中的对象
     *
     *
     * 容器启动时初始化person的bean实例
     *
     * @return
     */
    @Bean("person")
    public Person zhangsan(){
        System.out.println("给我们的容器中添加张三");
        return new Person("张三",22);
    }

    /**
     * 现在是在TTTFactoryBean 中实现了FactoryBean的所有的方法 当被调用的时候会自动的执行默认方法 将我们的Python直接引入容器
     *
     * @return
     */
    @Bean("python")
    public TTTFactoryBean tttFactoryBean(){
        return new TTTFactoryBean();
    }


}

package test;

import com.enjoy.cap6.MainConfig;
import com.enjoy.cap6.TTTFactoryBean;
import org.junit.jupiter.api.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

/**
 * FactoryBean 和 BeanFactorty 有什么区别?
 *
 * FactoryBean :可以把我们的JAVA实例通过FactoryBean注入到容器中
 *
 * BeanFactorty:从我们的容器中获取实例化后的bean
 *
 */
public class MainTEwst6 {


    @Test

    public void sss(){
        AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
        String[] beanDefinitionNames = annotationConfigApplicationContext.getBeanDefinitionNames();
        for(String name :beanDefinitionNames){
            System.out.println(name);
        }


        Object tttFactoryBean = annotationConfigApplicationContext.getBean("python");
        System.out.println("获取python到的bean类型"+tttFactoryBean.getClass());
    }
}

打印结果:

在这里插入图片描述
我们可以看到我们通过@Bean的实现方式 注册FactoryBean注册bean的时候 其实里面注册了Python但是并没有注册Factory的实现对象为bean。

可以把我们JAVA实例Bean通过FactoryBean注入到容器中,
BeanFactory从我们的容器中获取实例化的bean

在这里插入图片描述
在这里插入图片描述
getObject 其实就是返回我们实例bean,在spring中拿到的bean也是这里拿到的

如果在id前面加一個&则会拿到我们实现的FactoryBean的实例

 Object tttFactoryBean = annotationConfigApplicationContext.getBean("&python");
package test;

import com.enjoy.cap6.MainConfig;
import com.enjoy.cap6.TTTFactoryBean;
import org.junit.jupiter.api.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

/**
 * FactoryBean 和 BeanFactorty 有什么区别?
 *
 * FactoryBean :可以把我们的JAVA实例通过FactoryBean注入到容器中
 *
 * BeanFactorty:从我们的容器中获取实例化后的bean
 *
 */
public class MainTEwst6 {


    @Test

    public void sss(){
        AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
        String[] beanDefinitionNames = annotationConfigApplicationContext.getBeanDefinitionNames();
        for(String name :beanDefinitionNames){
            System.out.println(name);
        }


        Object tttFactoryBean = annotationConfigApplicationContext.getBean("&python");
        System.out.println("获取python到的bean类型"+tttFactoryBean.getClass());
    }
}

演示结果如下:
在这里插入图片描述

发布了434 篇原创文章 · 获赞 58 · 访问量 31万+

猜你喜欢

转载自blog.csdn.net/ppwwp/article/details/103329231
今日推荐