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中的工厂模式的更多相关文章

  1. Spring中的工厂模式和单例模式

    Spring预备知识(适合中小型项目) 作用:集成和管理其他框架 工厂模式: A  a  = new A( ); 将类所要创建的对象写入工厂,统一进行管理 package com.spring; pu ...

  2. 002-创建型-04-建造者模式(Builder)、JDK1.7源码中的建造者模式、Spring中的建造者模式

    一.概述 建造者模式的定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 工厂类模式提供的是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理,用来创建复合对象 ...

  3. 应聘阿里,字节跳动,美团必须掌握的Spring IOC与工厂模式

    Spring IOC与工厂模式 PS:本文内容较为硬核,需要对java的面向对象.反射.类加载器.泛型.properties.XML等基础知识有较深理解. (一)简单介绍 在讲Spring IOC之前 ...

  4. 在商城系统中使用设计模式----策略模式之在spring中使用策略模式

    1.前言: 这是策略模式在spring中的使用,对策略模式不了解对同学可以移步在商城中简单对使用策略模式. 2.问题: 在策略模式中,我们创建表示各种策略的对象和一个行为,随着策略对象改变而改变的 c ...

  5. Spring学习13-中IOC(工厂模式)和AOP(代理模式)的详细解释

    我们是在使用Spring框架的过程中,其实就是为了使用IOC,依赖注入,和AOP,面向切面编程,这两个是Spring的灵魂. 主要用到的设计模式有工厂模式和代理模式. IOC是工厂模式参考:设计模式- ...

  6. PHP中“简单工厂模式”实例讲解

    原创文章,转载请注明出处:http://www.cnblogs.com/hongfei/archive/2012/07/07/2580776.html 简单工厂模式:①抽象基类:类中定义抽象一些方法, ...

  7. JS中的工厂模式

    .一个栗子: var BicycleShop = function(){}; BicycleShop.prototype = { sellBicycle : function( model ){ va ...

  8. Spring设计模式_工厂模式

    先说下工厂模式的特性 1.对于调用者来说,影藏了复杂的逻辑处理过程,调用者只关心执行结果. 2.工厂要对结果负责,保证生产出符合规范的产品. Git代码地址  https://github.com/w ...

  9. 【QtAV】QtAV中的工厂模式

    QtAV中的各个模块大量使用的工厂模式,下面对其实现进行介绍. 工厂模式的使用 以 VideoRenderer 类为例子,他含有下面3个工厂模式相关的方法,Register方法用于给一个产品<c ...

随机推荐

  1. CF1147F Zigzag Game & 稳定婚姻问题学习笔记

    CF1147F Zigzag Game 这题太神仙了,不得不记录一下. 我网络流做不动了,DS做不动了,DP做不动了,特别自闭.于是博弈论之神(就是随手切3500博弈的那种) \(\color{bla ...

  2. Java为什么称为动态编译?

    Java在程序运行时产生Java类并编译成.class文件.

  3. NPM相关知识点

    1.Windows环境变量的配置 npm config set prefix "D:\Program Files\nodejs\node_global" npm config se ...

  4. 【Tomcat 源码系列】源码构建 Tomcat

    一,前言 这篇博客写于 12 月 12 日,从 github[1] 上 fork 了一份 tomcat 的源代码,clone 到了本地.最近想把 tomcat 的源代码分析一下,寒假的时候有完整的时间 ...

  5. 20201205-2 HTML概念与版本

      HTML的基础   HTML称为超文本标记语言,是一种标识性的语言. 它包括一系列标签,通过这些标签可以将网络上的文档格式统一, 使分散的Internet资源连接为一个逻辑整体. HTML文本是由 ...

  6. Springboot mini - Solon详解(八)- Solon的缓存框架使用和定制

    Springboot min -Solon 详解系列文章: Springboot mini - Solon详解(一)- 快速入门 Springboot mini - Solon详解(二)- Solon ...

  7. 正方形和球体,利用蒙特卡洛计算pi值

    clc; clear all; close all; R = 3; time = 10000; origin = [0,0,0]; %%======绘制球体====== t=linspace(0,pi ...

  8. kafka rebalance解决方案 -incremental cooperative协议和static membership功能

    apache kafka的重平衡(rebalance),一直以来都为人诟病.因为重平衡过程会触发stop-the-world(STW),此时对应topic的资源都会处于不可用的状态.小规模的集群还好, ...

  9. C# 链表 二叉树 平衡二叉树 红黑树 B-Tree B+Tree 索引实现

    链表=>二叉树=>平衡二叉树=>红黑树=>B-Tree=>B+Tree 1.链表 链表结构是由许多节点构成的,每个节点都包含两部分: 数据部分:保存该节点的实际数据. 地 ...

  10. HTTP Error 405.0 - Method Not Allowed 无法显示您正在查找的页面,因为使用了无效方法(HTTP 谓词)。

    将submit改成button即可   因为触发了form表单