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实现的类所创建的对象是在使用的的时候才创建并不是容器已加载就创建。

最新文章

  1. 【2016-10-26】【坚持学习】【Day13】【WCF】【EF + Data Services】
  2. C4.5,CART,randomforest的实践
  3. java第6次作业
  4. jQuery—DOM操作
  5. WPF中图形表示语法详解(Path之Data属性语法)ZZ
  6. UML_时序图画法
  7. NOIP2001 统计单词个数
  8. oracle6
  9. Android学习笔记--服务(Service)
  10. 有结果集的mysqli函数获取行数和列数
  11. SSM三大框架整合详细教程(Spring+SpringMVC+MyBatis
  12. 【APP问题定位(三)】adb安装
  13. Typescript学习笔记(一)基础类型
  14. JavaScript实现全屏显示
  15. HBase最佳实践-写性能优化策略
  16. Puppetmaster高可用和可扩展的方案设计
  17. es 中的 Iterator
  18. 和程序有关的一个游戏&lt;&lt;mu complex&gt;&gt; 攻略
  19. JAVA常见算法题(三十二)---找规律
  20. 11. Container With Most Water(装最多的水 双指针)

热门文章

  1. AGC043 B题题解
  2. 笔记-[AH2017/HNOI2017]礼物
  3. 优化Windows电脑常见方法,提高速度,释放硬盘C盘
  4. Redis达到最大占用内存后的淘汰策略
  5. docker 批量删除已经停止的容器
  6. 解决Linux所有命令不能使用的问题
  7. glances linux资源使用监控
  8. 1款开源工具,实现自动化升级K3S集群!
  9. Raft算法系列教程1:Leader选举
  10. 图片放大缩小的zoom.js