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 ...
随机推荐
- 2020高考倒计时!全屏向下滑动设计HTML源码
全屏竖向滑动效果,自适应,多终端 全国高考倒计时,音乐自动播放. 背景图片:img目录下替换bg.jpg 背景音乐:audio目录下替换song.mp3 原本按照正常情况下每年的6月7.8日就是全国 ...
- Docker部署FastDFS(附示例代码)
1. FastDFS简介 FastDFS是一个开源的分布式文件系统,它对文件进行管理,功能包括:文件存储.文件同步.文件访问(文件上传.文件下载)等,解决了大容量存储和负载均衡的问题.特别适合以文 ...
- Difference between @Bean and @Autowired
Demo01 1 @SpringBootApplication 2 public class Application { 3 4 @Autowired 5 BookingService booking ...
- [日常摸鱼]poj1509Glass Beads-SAM
QAQ学了好几天了-(我太傻啦) #include<cstdio> #include<cstring> #define rep(i,n) for(register int i= ...
- burpsuite无法拦截本地流量
参考文章链接:https://blog.csdn.net/tb_youth/article/details/103436796?utm_medium=distribute.pc_relevant.no ...
- 正方形和球体,利用蒙特卡洛计算pi值
clc; clear all; close all; R = 3; time = 10000; origin = [0,0,0]; %%======绘制球体====== t=linspace(0,pi ...
- .NET Core AWS S3云存储
前言 最近有需要用到AWS S3云存储上传附件,这里对利用.NET或.NET Core在调用SDK APi需要注意的一点小问题做个记录,或许能对后续有用到的童鞋提供一点帮助 AWS S3云存储 官方已 ...
- python使用smtplib和email库发送邮件
国内很多服务器提供商都默认禁止了smtp默认的25端口服务,而启用465端口发送邮件 在smtplib库中直接调用SMTP_SSL就是默认使用465端口 示例代码如下: def send_eamil( ...
- Maven仓库是什么
Maven仓库是基于简单文件系统存储的,集中化管理Java API资源(构件)的一个服务.仓库中的任何一个构件都有其唯一的坐标,根据这个坐标可以定义其在仓库中的唯一存储路径.得益于 Maven 的坐标 ...
- 表单综合HTML
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...