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