工厂返回的可以是一个具体的对象,比如造一辆车,可以返回一个自行车对象,或者汽车对象。
  但是在Spring 中需要工厂返回一个具体的Service,这就是一个抽象工厂了

  一种方法是反射,个人觉得这种方式不好;
  还有一种方法是巧妙的使用Map对象,工厂的一个优点就是可扩展,对于这种方式可以说是体现的淋漓尽致了,可以定义多个map,map里也可以扩充

  假设现在有一个接口类:BingService
  以及实现了这个接口的两个实现类: OneBingServiceImpl,TwoBingServiceImpl

  1、在工厂类里定义Map

import java.util.Map;

public class BingServiceFactory {

    //Map中的Value是 ServiceBean
private Map<String, BingService> serviceMap; //返回对应的 Service
public BingService getBingService(String platform) {
return serviceMap.get(platform);
} public Map<String, BingService> getServiceMap() {
return serviceMap;
} public void setServiceMap(Map<String, BingService> serviceMap) {
this.serviceMap = serviceMap;
}
}

  2、是用注解方式,配置工厂,同时使用set 注入的方法,给用到工厂的bean来set一下

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map; @Configuration
public class BingConfiguration {
@Resource
private OneServiceImpl oneService; @Resource
private TwoServiceImpl twoService; @Resource
private TestServiceImpl testService; @Bean
public BingServiceFactory createFactory() {
BingServiceFactory factory = new BingServiceFactory(); Map<String, BingService> serviceMap = new HashMap<>();
serviceMap.put("One",oneService);
serviceMap.put("Two",twoService);
factory.setServiceMap(serviceMap); testService.setFactory(factory); return factory;
} }

@Bean 注解如果无效的话,可能得 @Bean("xxxxServiceFactory")  这样的

  3、使用set 注入的方方式来获取工厂(当然也可以使用Autowired 注解注入)

import org.springframework.stereotype.Component;

@Component
public class TestServiceImpl { private BingServiceFactory factory; public void test() {
BingService service = factory.getBingService("One");
} public BingServiceFactory getFactory() {
return factory;
} public void setFactory(BingServiceFactory factory) {
this.factory = factory;
}
}

  这个工厂可以优化的,不要Factory 这个类,直接使用Map 就行

  原创文章,欢迎转载,转载请注明出处!

工厂模式如何返回Spring的Bean的更多相关文章

  1. Java工厂模式解耦 —— 理解Spring IOC

    Java工厂模式解耦 -- 理解Spring IOC 最近看到一个很好的思想来理解Spring IOC,故记录下来. 资源获取方式 主动式:(要什么资源都自己创建) 被动式:(资源的获取不是我们创建, ...

  2. 工厂模式讲解, 引入Spring IOC

    目录 引入 简单工厂 抽象工厂 Spring的bean工厂 模拟Spring工厂实现 模拟IOC 引入 假设有一个司机, 需要到某个城市, 于是我们给他一辆汽车 public class Demo { ...

  3. 从基础知识到重写Spring的Bean工厂中学习java的工厂模式

    1.静态工厂模式其他对象不能直接通过new得到某个类,而是通过调用getInstance()方法得到该类的对象这样,就可以控制类的产生过程.顺带提一下单例模式和多例模式:  单例模式是指控制其他对象获 ...

  4. Spring三 Bean的三种创建方式

    创建Bean的三种方式在大多数情况下,Spring容器直接通过new关键字调用构造器来创建Bean实例,而class属性指定Bean实例的实现类,但这不是实例化Bean的唯一方法.实际上,Spring ...

  5. java设计模式---三种工厂模式之间的区别

    简单工厂,工厂方法,抽象工厂都属于设计模式中的创建型模式.其主要功能都是帮助我们把对象的实例化部分抽取了出来,优化了系统的架构,并且增强了系统的扩展性. 本文是本人对这三种模式学习后的一个小结以及对他 ...

  6. IOC的实现原理—反射与工厂模式的结合

    反射机制概念   我们考虑一个场景,如果我们在程序运行时,一个对象想要检视自己所拥有的成员属性,该如何操作?再考虑另一个场景,如果我们想要在运行期获得某个类的Class信息如它的属性.构造方法.一般方 ...

  7. 设计模式-Runoob:工厂模式

    ylbtech-设计模式-Runoob:工厂模式 1.返回顶部 1. 工厂模式 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供 ...

  8. 工厂模式模拟Spring的bean加载过程

    一.前言    在日常的开发过程,经常使用或碰到的设计模式有代理.工厂.单例.反射模式等等.下面就对工厂模式模拟spring的bean加载过程进行解析,如果对工厂模式不熟悉的,具体可以先去学习一下工厂 ...

  9. 理解Spring的Bean工厂

    一提到工厂,我们先来回顾前面学习过的工厂方法和抽象工厂模式: 工厂方法:针对产品维度,能够产生新的产品,也能够产生新的产品工厂,既能够扩展产品维度.可是假设我们想在普通工厂上生产产品系列,就会特别麻烦 ...

随机推荐

  1. 史上最全office2016 激活码

    现在office版本已经更新到2016了,现在给大家分享Office 2016 各个版本的激活码,记得断网激活哈.(本人使用的是家庭版) Office 2016 Pro Retail 版激活密钥: [ ...

  2. 个人对【依赖倒置(DIP)】、【控制反转(IOC)】、【依赖注入(DI)】浅显理解

    一.依赖倒置(Dependency Inversion Principle) 依赖倒置是面向对象设计领域的一种软件设计原则.(其他的设计原则还有:单一职责原则.开放封闭原则.里式替换原则.接口分离原则 ...

  3. 初学Shiro

    Shiro Shiro是什么? Apache Shiro是Java的一个安全(权限)框架. Shiro可以非常容易的开发出足够好的应用,其不仅可以用在JavaSE环境下,也可以用者JavaEE环境下 ...

  4. pycharm中Django的安装和简单使用

    一.安装: 1.点击File,找到setting选项 2.点击+号,进入下面界面 结束后,安装完成 二.创建Django项目 创建成功后,新项目左侧: templates:用于存储HTML文件 set ...

  5. React 16.x 新特性思维导图

    React 16版本相对于以前的版本做了很大的改动,下面是我整理的React 16.x 新特性的思维导图文件,欢迎围观和指导:

  6. 【esri-loader】帮助文档翻译 part2 用法

    esri-loader怎么用?看完不要太清楚. [未完待续]!!! Q1: 在哪里用? 这是我最疑惑的问题之一,我知道要用esri-loader,肯定是某条js导入语句起作用的,但是你得告诉我写在哪里 ...

  7. new会返回NULL空指针吗

    c++中的new会返回NULL空指针吗 https://stackoverflow.com/questions/3389420/will-new-operator-return-null On a s ...

  8. 网络爬虫BeautifulSoup库的使用

    使用BeautifulSoup库提取HTML页面信息 #!/usr/bin/python3 import requests from bs4 import BeautifulSoup url='htt ...

  9. gradle 编译war包出现乱码,设置为utf-8格式

    1.找gradle 安装目录下的 gradle 2.修改 DEFAULT_JVM_OPTS="-Dfile.encoding=UTF-8"

  10. SQLServer之锁定数据库表

    用户锁定表注意事项 通过指定锁定方法.一个或多个索引.查询处理操作(如表扫描或索引查找)或其他选项,表提示在数据操作语言 (DML) 语句执行期间覆盖查询优化器的默认行为.表提示在 DML 语句的 F ...