欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

FactoryBean实现自定义bean实例化

程序员文章站 2022-05-23 18:28:41
...

1背景

使用Spring时,通常bean的实例化都比较简单,所以常常使用Spring IoC的默认处理.如果bean的实例化比较复杂,比如需要从网络或者本地配置中读取信息等获取信息完成实例化,直接在bean对应class的默认构造函数处理显的不够优雅,bean本身的功能耦合了其他非业务相关的功能.使用一个自定义bean工厂,把bean实例化组装都交给工厂,工厂实例化bean后放到容器里头,这是一个不错的选择.

2使用FactoryBean实现

自己的工厂对象实现org.springframework.beans.factory.FactoryBean接口就能完成这个功能,这个是Spring IoC提供的实例化扩展接口,让我们通过这个接口实现自己bean实例化需求.在我们的样例代码中,使用FactoryBean实例化一个DateFormat,并返回.具体代码如下:

package com.simos.controller;

import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.InitializingBean;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.time.ZoneId;
import java.util.TimeZone;

/**
 * Created by l2h on 18-5-9.
 * Desc: 日期格式化bean的FactoryBean
 * @author l2h
 */

public class DateFormatFactoryBean implements FactoryBean<DateFormat>,InitializingBean{
private DateFormat dateFormat;

@Override
public void afterPropertiesSet() throws Exception {
    dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    dateFormat.setTimeZone(TimeZone.getTimeZone(ZoneId.SHORT_IDS.get("CTT")));
}

@Override
public DateFormat getObject() throws Exception {
    return dateFormat;
}

@Override
public Class<?> getObjectType() {
    return dateFormat.getClass();
}

@Override
public boolean isSingleton() {
    return true;
}
}

这样,我们在其他地方就可以直接使用DateFormatbean了像容器自身实例化那些bean一样.如下:

/**
 * Created by l2h on 18-4-9.
 * Desc: hello world
 * @author l2h
 */
@RestController
public class HelloController {
@Autowired
DateFormat dateFormat;
@RequestMapping(value = "/hello",method = RequestMethod.GET)
public String hello(){
    System.out.println(dateFormat.format(new Date()));
    return "hello world!";
}
}

3小结

Spring IoC提供很多接口,让开发者根据需要参与容器创建,初始化,刷新,销毁的各个过程.