当某些实例化过程过于繁琐,或某些第三方库不能直接注册到spring容器的时候,可以实现org.springframeworker.beans.factory.FactoryBean接口,给出自己的实例化逻辑代码,当然使用自定义工厂类方法也可以,不过FactoryBean是spring提供的对付这种情况的“制式装备”
案例:
1.引入datetime插件
<!-- datetime 插件-->
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.9.8</version>
</dependency>
</dependencies>
2.编写NextDayDateDisplayer的类定义
import lombok.Data;
import net.sf.jsqlparser.expression.DateTimeLiteralExpression;
import org.joda.time.DateTime;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
@Data
@Component
public class NextDaydateDisplayer {
@Qualifier("nextDayDate")
@Autowired
private DateTime nextDayDate;
}
3.编写FactoryBean的实现类NextDayDateFactoryBean
import org.joda.time.DateTime;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.lang.Nullable;
import org.springframework.stereotype.Component;
@Component("nextDayDate")
public class NextDayDateFactoryBean implements FactoryBean{
@Nullable
@Override
public Object getObject() throws Exception {
return new DateTime().plusDays(1);
}
@Nullable
@Override
public Class<?> getObjectType() {
return DateTime.class;
}
}
4.测试FactoryBean的注册到容器的使用
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;
@ComponentScan("com.common.omads.test.factorybeantest")
public class Clinet {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Clinet.class);
NextDaydateDisplayer bean = context.getBean(NextDaydateDisplayer.class);
System.out.println(bean.getNextDayDate());
}
}
4.执行结果打印
2021-06-09T14:19:51.765+08:00