工厂模式

Spring中bean的创建,默认是框架利用反射new出来的bean实例。有时候也会有一些复杂的情况。

假设有一个飞机,属性如下,现在需要造很多同型号的飞机,那么唯一需要改变的属性只有DriverName(机长姓名),此时可以使用工厂模式帮我们创建对象,有一个专门帮我们创建对象的类帮我们创建对象,这个类就叫工厂。

public class AirPlane {

private String DriverName;// 机长姓名

private String AirPlaneName;// 飞机名字

private String longth;// 飞机长度

private Integer num;// 载客量

//省略getter与setter方法

}

静态工厂:工厂本身不用创建对象,通过静态方法调用。

实例工厂:工厂本身需要创建对象,需要先new一个工厂实例。

1.使用静态工厂创建bean

静态工厂:

package com.gql.factory;

import com.gql.bean.AirPlane;

/**

* 静态工厂

*

* @author guoqianliang

*/

public class AirPlaneStaticFactory {

public static AirPlane getAirPlane(String drivername) {

System.out.println("静态工厂造飞机...");

AirPlane airplan = new AirPlane();

airplan.setDriverName(drivername);

airplan.setAirPlaneName("歼20");

airplan.setLongth(20);

airplan.setNum(1);

return airplan;

}

}

在xml中注册静态工厂:

测试:

@Test

public void test07() {

System.out.println("容器启动完成");

AirPlane bean = (AirPlane) ioc.getBean("airPlan1");

System.out.println("打印飞机属性:" + bean);

}

2.使用实例工厂创建bean

实例工厂:

package com.gql.factory;

import com.gql.bean.AirPlane;

/**

* 实例工厂

* @author guoqianliang

*/

public class AirPlaneInstanceFactory {

public AirPlane getAirPlane(String drivername) {

System.out.println("实例工厂造飞机...");

AirPlane airplan = new AirPlane();

airplan.setDriverName(drivername);

airplan.setAirPlaneName("歼20");

airplan.setLongth(20);

airplan.setNum(1);

return airplan;

}

}

在xml中注册实例工厂:

factory-bean=“InstanceFactory” :指定使用哪个工厂实例。

factory-method=“getAirPlane”:使用哪个工厂方法。

class="com.gql.factory.AirPlaneInstanceFactory">

factory-bean="InstanceFactory" factory-method="getAirPlane">

测试:

@Test

public void test08() {

System.out.println("容器启动完成");

AirPlane bean = (AirPlane) ioc.getBean("airPlan2");

System.out.println("打印飞机属性:" + bean);

}

3.实现FactoryBean工厂创建Bean

ioc容器启动的时候不会创建实例(无论是单实例还是多实例),获取的时候才创建实例对象。

实现FactoryBean接口:

package com.gql.factory;

import org.springframework.beans.factory.FactoryBean;

import com.gql.bean.Book;

public class MyFactoryBean implements FactoryBean {

/**

* 返回创建的对象

*/

@Override

public Book getObject() throws Exception {

System.out.println("MyFactoryBean创建对象...");

Book book = new Book();

book.setBookName("红楼梦");

book.setAuthor("曹雪芹");

return book;

}

/**

* 返回创建的对象的类型

*/

@Override

public Class> getObjectType() {

// TODO Auto-generated method stub

return Book.class;

}

/**

* 是单例? true:是 false:不是

*/

@Override

public boolean isSingleton() {

// TODO Auto-generated method stub

return true;

}

}

在xml中注册:

测试:

@Test

public void test09() {

System.out.println("容器启动完成");

Object bean = ioc.getBean("myFactoryBean");

System.out.println("打印属性:" + bean);

}

到此这篇关于Spring框架通过工厂创建Bean的三种方式实现的文章就介绍到这了,更多相关Spring 工厂创建Bean内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

时间: 2020-03-22

java bean 工厂模式_Spring框架通过工厂创建Bean的三种方式实现相关推荐

  1. java 多线程编程(包括创建线程的三种方式、线程的生命周期、线程的调度策略、线程同步、线程通信、线程池、死锁等)

    1 多线程的基础知识 1.1 单核CPU和多核CPU 单核CPU,其实是一种假的多线程,因为在一个时间单元内,也只能执行一个线程的任务.微观上这些程序是分时的交替运行,只不过是给人的感觉是同时运行,那 ...

  2. java多线程w3c_Java创建多线程的三种方式

    前言 这篇文章主要讲述线程的概念.组成.Java创建多线程的三种方式以及线程的类型. 线程概念 线程和进程的区别 **进程:**正在运行的程序,例如:你打开 的qq音乐.exe程序,其由PCB(进程控 ...

  3. java 创建线程_【80期】说出Java创建线程的三种方式及对比

    点击上方"Java面试题精选",关注公众号 面试刷图,查缺补漏 >>号外:往期面试题,10篇为一个单位归置到本公众号菜单栏->面试题,有需要的欢迎翻阅. 一.Ja ...

  4. Java创建线程的三种方式

    一.继承Thread类创建线程类 (1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务.因此把run()方法称为执行体. (2)创建Thread子类的实 ...

  5. java的如何创建js_[Java教程]JS创建事件的三种方式(实例)

    [Java教程]JS创建事件的三种方式(实例) 0 2016-05-11 14:00:16 1.普通的定义方式 οnclick="Sfont=prompt('请在文本框中输入红色','红色' ...

  6. Java并发基础01. 传统线程技术中创建线程的两种方式

    传统的线程技术中有两种创建线程的方式:一是继承Thread类,并重写run()方法:二是实现Runnable接口,覆盖接口中的run()方法,并把Runnable接口的实现扔给Thread.这两种方式 ...

  7. Java创建线程的三种方式,以前只知道两种,现在添加一种Callable与FutureTask创建的方式

    一共有以下三种方式: 1.继承Thread 2.实现Runnable 3.实现Callable,并FutureTask包装 线程启动方式均是使用start()方法 先阐述优缺点: 1和2,3: 2,3 ...

  8. Java 创建线程的三种方式

    一.继承Thread类创建 1.定义一个类继承Thread类,并重写Thread类的run()方法,run()方法的方法体就是线程要完成的任务,因此把run()称为线程的执行体: 2.创建该类的实例对 ...

  9. java反射获取实体类_java 反射获取类对象的三种方式

    Java反射经常用到的就是获取对象中的属性,那么Java获取类对象就是必不可少的啦! Java实体类: public class ReflexModel { private String code; ...

最新文章

  1. 腾讯云的Ubuntu 18.04的镜像地址
  2. POJ-1655 Balancing Act 树的重心
  3. mysql 导入主键冲突_MySQL 处理插入过程中的主键唯一键重复值的解决方法
  4. Docker入门 - 005 Docker 容器连接
  5. WebLogic中修改AdminServer及Managed Server的端口
  6. Spring Boot Framework的关键组件和内部构造(自动装配、起步依赖、CLI、Actuator)
  7. eclipse改变默认的编码格式(UTF-8)
  8. play home tifa_144Hz OLED屏手机 努比亚Play喜提Android 11_手机通讯
  9. P4213 【模板】杜教筛(杜教筛)题解
  10. Spring Boot官方文档笔记
  11. 结构方程软件Lisrel 8.7 和HLM5.5
  12. 门电路逻辑符号大全(三态门,同或门,异或门,或非门,与或非门, 传输门,全加器,半加器等)
  13. Android Tombstone/Crash的log分析和定位(墓碑文件)
  14. 4.25 C语言练习(然后是几点:根据起始时间和流逝的时间计算出终止时间。计算当前时间经过那么多分钟后是几点,结果也表示为四位数字。)
  15. 图像拼接(八):拼接多幅图像+Matlab实现+Stanford Open Course
  16. 被虎牙HR抬出公司员工发声
  17. Groovy Script 获取当前时间函数
  18. MySQL--锁的奥秘--数据怎么锁
  19. Merriam-Webster's Vocabulary Builder 学习笔记 Unit 5
  20. 基于ssm技术的校自助阅览室的设计与实现 毕业设计-附源码242326

热门文章

  1. spring boot 之session的总结
  2. #161: 给定n*n由0和1组成的矩阵,如果矩阵的每一行和每一列的1的数量都是偶数,则认为符合条件。 你的任务就是检测矩阵是否符合条件...
  3. 封装构造函数,用canvas写饼状图和柱状图
  4. Mybatis系列(三):Mybatis实现关联表查询
  5. ajax 传递数组与接收
  6. UIScrollView控件常用属性
  7. jQuery运行方式818
  8. ifconfig 命令介绍
  9. ASSERT(IsOpen());
  10. php面试基础项目,PHP面试经典题