spring中的工厂模式
spring的bean的创建原理就是框架利用反射创建出实例对象
工厂模式:工厂帮我们创建对象:有一个专门帮我们创建对象的类,我们把这个类叫做工厂类。
例如:Plane plane = PlaneFactory.getPlane(String name);
工厂有分为静态工厂和实例工厂。
静态工厂:
也即是调用方法的时候,直接是xxxFactory().getXxx();
他的实例对象的创建在static方法中。
public static Plane getPlane(String name)
{
Plane plane = new Plane();
plane.setPname("name");
return plane;
}`
调用:Plane plane = PlaneStaticFactory.getPlane("xxx");
实例工厂:
他和静态工厂的区别就是获得实例的方法是非静态的,要想使用工厂类来创建对象就要先new 工厂再调用getInstance方法。
public Plane getPlane(String name)
{
Plane plane = new Plane();
plane.setPname("name");
return plane;
}
调用:Plane plane = new PlaneFactory().getPlane("xxx");
使用实例工厂创建对象,配置文件操作:
<bean id="person3Factory" class="main.java.factory.personFactory2"> </bean>
//factory-bean 指定的是那个工厂,
//1. 先配置工厂对象
//2. 再配置我们想要的实例对象,factory-method,使用那个工厂方法创建对象。
<bean id="person3" factory-method="getPerson" factory-bean="person3Factory" ></bean>
使用静态工厂创建对象,配置文件
<bean id="personFactory" class="main.java.factory.PersonFactory1" factory-method="getPerson"></bean>
创建静态工厂类。调用静态工厂方法getPerson(),来得到person对象。
FactoryBean是spring框架可以识别的工厂接口,现在我写一个实现类,实现这个接口,测试他的一些方法。
package main.java.factory;
import main.java.domain.Car;
import org.springframework.beans.factory.FactoryBean;
public class myFactoryBeanImpl implements FactoryBean<Car> {
//getObject方法会自动返回factoryBean的泛型,
@Override
public Car getObject() throws Exception {
Car car = new Car();
car.setName("红旗");
car.setColor("red");
car.setPrice(110000);
System.out.println("我帮你造了个汽车!!!");
return car;
}
//getObjectType返回的是读西厢的.class
@Override
public Class<?> getObjectType() {
return Car.class;
}
//isSingleton是判断是否产生的 对象是单实例的,单实例就是true,多实例是false。这里我把他设置成了单例
@Override
public boolean isSingleton() {
return true;
}
}
我们直接配置这个实现接口的工厂类
<!-- 给实现FactoryBean接口的类配置对象-->
<bean class="main.java.factory.myFactoryBeanImpl" id="myFactoryBean" ></bean>
当我测试的时候,开始什么都不写直接运行,当然那个getObjecy()方法并没有执行,当获得这个工厂类对象时,
@Test
void test04()
{
Object myFactoryBean = context.getBean("myFactoryBean");
}
结果:调用了getobject()方法。
我帮你造了个汽车!!!
@Test
void test04()
{
Object myFactoryBean = context.getBean(“myFactoryBean”);
Object myFactoryBean2 = context.getBean(“myFactoryBean”);
System.out.println(myFactoryBean==myFactoryBean2);
}
测试结果:
我帮你造了个汽车!!!
true
当然要是在isSingleton()方法中将返回值改为false,两个对象就不相等了,直接是false。
当输出两个工厂对象时,我们发现输出的是car的属性值,也就是说我们这个工厂实现类其实就是相当于一个Car类。但是不能直接调用Car内部的方法。需要在getObject()方法中设置参数。
System.out.println(myFactoryBean.toString());//Car{name=‘红旗’, price=110000, color=‘red’}
System.out.println(myFactoryBean2.toString());//Car{name=‘红旗’, price=110000, color=‘red’}
FactoryBean实现的类所创建的对象是在使用的的时候才创建并不是容器已加载就创建。
spring中的工厂模式的更多相关文章
- Spring中的工厂模式和单例模式
Spring预备知识(适合中小型项目) 作用:集成和管理其他框架 工厂模式: A a = new A( ); 将类所要创建的对象写入工厂,统一进行管理 package com.spring; pu ...
- 002-创建型-04-建造者模式(Builder)、JDK1.7源码中的建造者模式、Spring中的建造者模式
一.概述 建造者模式的定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 工厂类模式提供的是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理,用来创建复合对象 ...
- 应聘阿里,字节跳动,美团必须掌握的Spring IOC与工厂模式
Spring IOC与工厂模式 PS:本文内容较为硬核,需要对java的面向对象.反射.类加载器.泛型.properties.XML等基础知识有较深理解. (一)简单介绍 在讲Spring IOC之前 ...
- 在商城系统中使用设计模式----策略模式之在spring中使用策略模式
1.前言: 这是策略模式在spring中的使用,对策略模式不了解对同学可以移步在商城中简单对使用策略模式. 2.问题: 在策略模式中,我们创建表示各种策略的对象和一个行为,随着策略对象改变而改变的 c ...
- Spring学习13-中IOC(工厂模式)和AOP(代理模式)的详细解释
我们是在使用Spring框架的过程中,其实就是为了使用IOC,依赖注入,和AOP,面向切面编程,这两个是Spring的灵魂. 主要用到的设计模式有工厂模式和代理模式. IOC是工厂模式参考:设计模式- ...
- PHP中“简单工厂模式”实例讲解
原创文章,转载请注明出处:http://www.cnblogs.com/hongfei/archive/2012/07/07/2580776.html 简单工厂模式:①抽象基类:类中定义抽象一些方法, ...
- JS中的工厂模式
.一个栗子: var BicycleShop = function(){}; BicycleShop.prototype = { sellBicycle : function( model ){ va ...
- Spring设计模式_工厂模式
先说下工厂模式的特性 1.对于调用者来说,影藏了复杂的逻辑处理过程,调用者只关心执行结果. 2.工厂要对结果负责,保证生产出符合规范的产品. Git代码地址 https://github.com/w ...
- 【QtAV】QtAV中的工厂模式
QtAV中的各个模块大量使用的工厂模式,下面对其实现进行介绍. 工厂模式的使用 以 VideoRenderer 类为例子,他含有下面3个工厂模式相关的方法,Register方法用于给一个产品<c ...
随机推荐
- 转:minhash
Minhash算法及其应用 一.引言 MinHash算法属于Locality Sensitive Hashing,用于快速估计两个集合的相似度.最早由Broder Andrei Z. 在1997年提出 ...
- kafka命令及启动
默认内网访问,要在外网访问的话,需要在修改config/server.properties中的配置 将listeners和advertised.listeners的值用主机名进行替换,在外用使用jav ...
- Reflect个人记录
Reflect是一个内置方法,并不能通过构造函数的来进行构建 Reflect.construct: 与new操作父有一些类似,相当于new target(...) 例: 我们先自己定义一个类 clas ...
- 系统类 字符串String类
java编程语言中的字符串. 在java中,String类是不可变的,对String类的任何改变,都是返回一个新的String类对象. String 对象是 System.Char 对象的有序集合,用 ...
- Web服务器-正则表达式-整理+复习(3.1.1)
@ 目录 1.常用api 2.例子 3.正则表达式模式 关于作者 参考文章 1.常用api re.match(pattern, string, flags=0) pattern 匹配的正则表达式 st ...
- Leetcode 220 周赛 题解
5629. 重新格式化电话号码 模拟 注意一些细节,最后位置是否取值. class Solution { public: string reformatNumber(string number) { ...
- B. Navigation System【CF 1320】
传送门 题目:简单理解就是,我们需要开车从s点到t点.车上有一个导航,如果当前点为x,则导航会自动为你提供一条从x到t的最短的路线(如果有多条,则随机选一条),每走到下一个点则会实时更新最短路线,当然 ...
- 微博爬虫,python微博用户主页小姐姐图片内容采集爬虫
python爬虫,微博爬虫,需要知晓微博用户id号,能够通过抓取微博用户主页内容来获取用户发表的内容,时间,点赞数,转发数等数据,当然以上都是本渣渣结合网上代码抄抄改改获取的! 要抓取的微博地址:ht ...
- Epson 打印机计数器清零
错误提示:废墨垫需要维护.请联系爱普生认证服务机构. 一.下载打印机清零软件 软件名称:EPSON Adjustment Program 二.USB线连接打印机 清零前请取消打印任务,打印机用USB线 ...
- 死磕以太坊源码分析之txpool
死磕以太坊源码分析之txpool 请结合以下代码阅读:https://github.com/blockchainGuide/ 写文章不易,也希望大家多多指出问题,交个朋友,混个圈子哦 交易池概念原理 ...