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;
}
}
这样,我们在其他地方就可以直接使用DateFormat
bean了像容器自身实例化那些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提供很多接口,让开发者根据需要参与容器创建,初始化,刷新,销毁的各个过程.