登陆

章鱼彩票最新公告-Java工程师必须搞明白:BeanFactory与FactoryBean是个啥?

admin 2019-10-29 246人围观 ,发现0个评论

1.条件概要

许多java开发者在运用Spring结构中都见过后缀为FactoryBean的类,比方Mybatis-Spring中的SqlSessionFactoryBean。提到这儿就不得不提BeanFactory。FactoryBean和BeanFactory特别简略让人混杂,面试还常常问到这两种概念。其实它们的效果和运用场景是不一样的

2.BeanFactory

先来说说BeanFactory。 用于拜访Spring bean容器的根接口。这是Spring bean容器的根本客户端视图。本来是获取Spring Bean的接口,也便是IoC容器。然后咱们看类图

本来咱们更常用的A吻别pplicationContext便是一个BeanFactory。咱们经过bean的称号或许类型都能够从BeanFactory来获取bean。关于BeanFactory这么介绍信任都不陌生了。让咱们把关注点转向FactoryBean上。

3.FactoryBean

FactoryBean 是个什么玩意儿呢?来看看源码

 public interface FactoryBean {
@Nullable
T getObject() throws Exception;

@Nullable
Class

default boolean isSingleton() {
return true;
}
}
  • T getObject() 获取泛型T的实例。用来创立Bean。当IoC容器经过getBean办法来FactoryBean创立的实例时实践获取的不是FactoryBean 自身而是详细创立的T泛型实例。等下咱们会来验证这个工作。
  • Class
  • default章鱼彩票最新公告-Java工程师必须搞明白:BeanFactory与FactoryBean是个啥? boolean isSingleton() 用来规则 Factory创立的的bean是否是单例。这儿经过默许办法界说为单例。

3.1 FactoryBean运用场景

FactoryBean 用来创立一类bean。比方你有一些同属鸟类的bean需求被创立,可是它们自己有各自的特色,你只需求把他们的特色注入FactoryBean中就能够出产出各种鸟类的实例。举一个愈加靠近实践出产的比如。乃至这个比如你能够应用到实践java开发中去。咱们需求自己造一个守时使命的轮子。用FactoryBean 再适宜不过了。咱们来用代码说话一步步来演示FactoryBean的运用场景。

3.2 构建一个FactoryBean

咱们声明守时使命一般具有下列要素:

  • 时刻周期,必定会运用到cron表达式。
  • 一个使命的履行笼统接口。
  • 守时使命详细行为的履行者。

Task使命履行笼统接口的完成。完成包括两个方面:

  • SomeService 是详细使命的履行逻辑。
  • cron时刻表达式

public class CustomTask implements Task {
private SomeService someService;
private String cronExpression;
public CustomTask(SomeService someService) {
this.someService = someService;
}
@Override
public void execute() {
//do something
someService.doTask();
}
@Override
public void setCron(String cronExpression) {
this.cronExpression = cronExpression;
}
@Override
public String getCron() {
return cronExpression;
}
}

经过以上的界说。使命的时刻和使命的逻辑能够依据不同的事务做到差异化装备。然后咱们完成一个关于Task的FactoryBean。


public class TaskFactoryBean implements FactoryBean {
private SomeService someService;
private String cronExpression;
@Override
public Task getObject() throws Exception {
CustomTask customTask = new CustomTask(someService);
customTask.setCron(cronExpression);
return customTask;
}
@Override
public Class
return CustomTask.class;
}
@Override
public boolean isSingleton() {
return true;
}
public SomeService getSomeService() {
return someService;
}
public void setSomeService(SomeService someService) {
this.someService = someService;
}
public String getCronExpression() {
return cronExpression;
}
public void setCronExpression(String cronExpression) {
this.cronExpression = cronExpression;
}
}

3.3 FactoryBean 注入IoC

你能够运用xml的注入办法,当然也能够运用javaConfig的装备办法。这儿咱们运用javaConfig注入。咱们将两个FactroyBean注入到Spring容器中去。

@Configuration
public class Config {
@Bean
public TaskFactoryBean customTask() {
TaskFactoryBean taskFactoryBean = new TaskFactoryBean();
taskFactoryBean.setCronExpression("0 15 10 * * ?");
String word = "守时使命一";
SomeService someService = new SomeService();
someService.setWord(word);
taskFactoryBean.setSomeService(someService);
return taskFactoryBean;
}
@Bean
public TaskFactoryBean otherTask() {
TaskFac章鱼彩票最新公告-Java工程师必须搞明白:BeanFactory与FactoryBean是个啥?toryBean taskFactoryBean = new TaskFactoryBean();
章鱼彩票最新公告-Java工程师必须搞明白:BeanFactory与FactoryBean是个啥?taskFactoryBean.setCronExpression("0 15 17 * * ?");
String word = "守时使命二";
SomeService someService = new SomeService();
someService.setWord(word);
taskFactoryBean.setSomeService(someService);
return taskFactoryBean;
}
}

3.4 FactoryBean的一些特色

一般如上声明后,@Bean注解假如不显式声明bean称号则办法名作为bean的称号,并且回来值作为注入的Bean。可是咱们经过debug发现却是这样的:

也便是说经过办法名是回来FactoryBean 创立的Bean。那么怎么回来该FactoryBean呢?上图中也给出了答案在办法前添加引证符“&”。详细的原因还用从BeanFactory中寻觅,真是不是冤家不聚头

咱们对上面声明的两个bean进行测验,也超卓地完成了不同的守时使命事务逻辑。

 @Autowired
private Task customTask;
@Autowired
private Task otherTask;
@Test
public void task() {
customTask.execute();
otherTask.execute();
}

4. 总结

在后续的运用中你能够经过声明不同的cron表达式,以及不同SomeService来定制更多的守时使命。经过这个比如信任你会对FactoryBean有的明晰的知道。demo就不供给了,十分简略,强烈建议你自己试一试以加深了解。

转自:https://segmentfault.com/a/1190000020338228

请关注微信公众号
微信二维码
不容错过
Powered By Z-BlogPHP