Spring框架注解开发——使用FactoryBean创建对象源码解剖(超详细)

一.先新建一个ColorBeanFactory实现方法FactoryBean,并实现其方法

package com.Bean;

import org.springframework.beans.factory.FactoryBean;
//创建Spring工厂FactoryBean
public class ColorBeanFactory implements FactoryBean<Color> {
    //返回一个color对象,这个对象会添加到容器中
    public Color getObject() throws Exception {
        System.out.println("ColorBeanFactory...");
        return new Color();
    }

    //返回对象的类型
    public Class<?> getObjectType() {
        return Color.class;
    }

    //是否位单例模式 true位单实例
    public boolean isSingleton() {
        return true;
    }
}

其中三个方法分别为

1.//返回一个color对象这个对象会添加到容器中

public Color getObject() throws Exception

2.//返回对象的类型

public Class<?> getObjectType()

3.//是否位单例模式 true位单实例

public boolean isSingleton()

2.1 新建一个Config类,用@Imort注解添加MyImportBeanDefinitionRegistar类

package com.Config;

import com.Bean.Color;
import com.Bean.ColorBeanFactory;
import com.Bean.Person;
import com.Conditional.Linux;
import com.Conditional.MyImportBeanDefinitionRegistar;
import com.Conditional.MyImportSelect;
import com.Conditional.windows;
import org.springframework.context.annotation.*;


@Import({ MyImportBeanDefinitionRegistar.class})
//ImportBeanDefinitionRegistar:
public class MainConfig {

    
    @Bean("ColorBeanFactory")
    public ColorBeanFactory colorBeanFactory(){
        return new ColorBeanFactory();
    }


}

2.2创建测试类

import com.Bean.Person;
import com.Config.MainConfig;
import com.Config.config;
import org.junit.jupiter.api.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.core.env.ConfigurableEnvironment;

public class TestP {
    AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
    @Test
    public void testImport() {
        printBean(applicationContext);
    }

    private void printBean(AnnotationConfigApplicationContext annotationConfigApplicationContext) {
        String[] beanDefinitionNames = annotationConfigApplicationContext.getBeanDefinitionNames();
        for (String name : beanDefinitionNames) {
            System.out.println(name);
        }
    }}

2.3 运行后

ColorFactoryBean已经被添加到IOC容器中  

现在我们来解析一下源码!!

在测试代码中添加一些代码,运行

@Test
public void testImport() {
    printBean(applicationContext);
    //获取ColorBeanFactory
    Object colorBeanFactory1 = applicationContext.getBean("ColorBeanFactory");
    Object colorBeanFactory2 = applicationContext.getBean("ColorBeanFactory");
//获取colorBeanFactory1 类名
    System.out.println("bean类型为"+colorBeanFactory1.getClass());
//测试是否为单例模式
    System.out.println(colorBeanFactory1==colorBeanFactory2);

}

 我们发现这是一个单例模式

且发现ColorBeanFactory实际上运行的是一个Color类。

如果想要获得ColorBeanFactory需要在前面添加一个&符号

成功获得ColorBeanFactory

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值