副问题[/!--empirenews.page--]
1.条件提纲
许多java开拓者在行使Spring框架中都见事后缀为FactoryBean的类,好比Mybatis-Spring中的SqlSessionFactoryBean。说到这里就不得不提BeanFactory。FactoryBean和BeanFactory出格轻易让人夹杂,口试还常常问到这两种观念。着实它们的浸染和行使场景是纷歧样的
2.BeanFactory
先来说说BeanFactory。 用于会见Spring bean容器的根接口。这是Spring bean容器的根基客户端视图。原本是获取Spring Bean的接口,也就是IoC容器。然后我们看类图
原本我们更常用的ApplicationContext就是一个BeanFactory。我们通过bean的名称可能范例都可以从BeanFactory来获取bean。对付BeanFactory这么先容信托都不生疏了。让我们把存眷点转向FactoryBean上。
3.FactoryBean
FactoryBean 是个什么玩意儿呢?来看看源码
- public interface FactoryBean<T> {
- @Nullable
- T getObject() throws Exception;
-
- @Nullable
- Class<?> getObjectType();
-
- default boolean isSingleton() {
- return true;
- }
- }
- T getObject() 获取泛型T的实例。用来建设Bean。当IoC容器通过getBean要领来FactoryBean建设的实例时现实获取的不是FactoryBean 自己而是详细建设的T泛型实例。等下我们会来验证这个工作。
- Class getObjectType() 获取 T getObject()中的返回值 T 的详细范例。这里凶猛提议假如T是一个接口,返回其详细实现类的范例。
- default 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<Task> {
- 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<?> getObjectType() {
- 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
(编辑:河北网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|