【sping揭秘】4、某些无法注册到IOC容器的对象如何交给spring托管

可以实现spring的factoryBean 接口,这样可以加入spring的IOC容器

比如现在有一个类叫MyObject,我们没有这个对象的源码,无法对这个对象进行操作,那么我们如何加入spring的配置呢?

package cn.cutter.start.bean;

import org.springframework.beans.factory.FactoryBean;
import org.springframework.stereotype.Component;

@Component
public class NextDayDateFactoryBean implements FactoryBean {
    
    private int count = 0;

    @Override
    public Object getObject() throws Exception {
        MyObject mo = new MyObject();
        mo.setName("num:" + count++);
        return mo;
    }

    @Override
    public Class getObjectType() {
        
        return MyObject.class;
        
    }
    
    @Override
    public boolean isSingleton() {
        return false;
    }
}

我们实现了factorybean接口,实现里面三个接口,然后我们给自己写的这个factory类添加注解,交给spring托管

到现在为止,好像没什么特别的地方,但是接下来,注意了!!

写一个测试 类

@Test
    public void test3() {
        //测试spring的IOC容器中,默认是保持在IOC容器中只有一个实例
        ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:application-bean.xml");
        //使用spring的factorybean
        //这里注意了,我们返回的对象不是NextDayDateFactoryBean,而是MyObject,很关键 !!!!
        MyObject mo1 = (MyObject) ctx.getBean("nextDayDateFactoryBean");
        System.out.println("mo name is:" + mo1.getName());
        MyObject mo2 = (MyObject) ctx.getBean("nextDayDateFactoryBean");
        System.out.println("mo name is:" + mo2.getName());
        MyObject mo3 = (MyObject) ctx.getBean("nextDayDateFactoryBean");
        System.out.println("mo name is:" + mo3.getName());
        MyObject mo4 = (MyObject) ctx.getBean("nextDayDateFactoryBean");
        System.out.println("mo name is:" + mo4.getName());
        
        
    }

你们猜这个结果会怎么样???

【sping揭秘】4、某些无法注册到IOC容器的对象如何交给spring托管

看到了没,我们使用factory对第三方的对象实现了控制!!!!

 【sping揭秘】4、某些无法注册到IOC容器的对象如何交给spring托管

关键点在这里。。。。

不过说实话哈,感觉作用不是很大,我们也可以通过配置的方式直接配到spring容器中

 【sping揭秘】4、某些无法注册到IOC容器的对象如何交给spring托管

这样不也可以加入spring配置中了吗???

当然用factorybean就不用写什么配置文件了,这个倒是实实在在的好处。。。