Bea的获取方式
1.构造方法实例化
-
1,创建bean对象
public class SpringBean { public SpringBean() { System.out.println("springBean无参构造方法执行!"); } }
-
2,xml里面配置bean对象
<!-- spring提供的实例化方法第一种,在Spring配置文件中配置类全限定名,spring会自动调用该类的无参构造方法实例化--> <bean id="sb" class="com.bean.SpringBean"/>
-
3.测试
/** * spring默认情况下bean对象是单例的(singleton),只有在启用容器解析xml文件时实例化对象,bean对象只创建一次 * 多例:prototype(原型) * 当将bean的scopetype设置为prototype时 解析xml文件时不会实例化对象,每次调用getBean时会创建一个对象 */ @Test public void testInstantiation1(){ ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml"); } //输出结果 :springBean无参构造方法执行!
2.简单工厂模式实例化
-
1,创建简单bean类
public class Star { public Star() { System.out.println("Star无参构造方法执行!"); } }
-
2.创建简单工厂,(简单工厂模式要有静态方法)
public class StarFactory { public StarFactory() { System.out.println("factory 静态方法执行"); } public static Star getStar(){ //这个star对象创建还是我们负责new的对象, return new Star(); } }
-
3,通过xml配置文件告诉Spring哪个类的哪个方法实例化bean对象,factory-method属性指定的是静态方法
<!-- 通过简单工厂模式实例化对象,通过xml文件告诉spring告诉哪个类的哪个方法实例化对象,通过factory-method属性获取对象--> <bean id="starBean" class="com.bean.StarFactory" factory-method="getStar"/>
-
4,这里不会将StarFactory实例化,只会调用StarFactory的静态方法获得Star对象
@Test public void testInstantiation2(){ ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml"); Star star = applicationContext.getBean("starBean", Star.class); System.out.println(star); } /* 输出结果:Star无参构造方法执行! com.bean.Star@6c64cb25 */
3.factory-bean实例化,工厂方法模式实例化bean对象
-
1.配置bean和Factory-bean对象
//1 bean对象 public class Gun { public Gun() { System.out.println("Gun 的无参构造方法执行!"); } } //生产工厂对象 public class GunFactory { //这里的方法不是静态的,需要实例化GunFactory来调用get方法 public Gun get(){ return new Gun(); } }
-
2,写配置文件
<!-- 第三种通过工厂方法模式实例化对象,通过factory-bean和factory-method属性共同完成bean对象的实例化--> <bean id="gunFactory" class="com.bean.GunFactory"/> <bean id="gunBean" factory-bean="gunFactory" factory-method="get"/>
4. FatoryBean接口实例化
-
在以上第三种方法种,需要指定factory-bean对象和factory-method对象才能完成需要的bean对象的实例化,spring提供了一个接口,只要factory实现了FactoryBean接口,那么我们就不需要指定factory-bean和factory-method即可完成bean对象的实例化
-
创建bean类
public class Person { public Person() { System.out.println("person无参构造方法执行!"); } }
创建Factory类实现FactoryBean接口
public class PersonFactory implements FactoryBean<Person> { @Override public Person getObject() throws Exception { return new Person(); } @Override public Class getObjectType() { return null; } }
编写xml文件
<!--第四种通过FactorryBean接口实例化bean--> <bean id="person" class="com.bean.PersonFactory"/>
思考:
-
只要将对象配置在xml文件中,对象就会被spring容器创建
-
以上的几种获取bean对象的方法
-
<!-- 第一种,构造方法获取--> <bean id="sb" class="com.bean.SpringBean"/> <!--通过简单工厂模式实例化对象,通过xml文件告诉spring告诉哪个类的哪个方法实例化对象--> <bean id="starBean" class="com.bean.StarFactory" factory-method="getStar"/> <!--第三种通过工厂方法模式实例化对象,通过factory-bean和factory-method属性共同完成bean对象的实例化--> <bean id="gunFactory" class="com.bean.GunFactory"/> <bean id="gunBean" class="com.bean.GunFactory" factory-bean="gunFactory" factory-method="get"/> <!--第四种通过FactorryBean接口实例化bean--> <bean id="person" class="com.bean.PersonFactory"/> <!-- 第三种和第四种都实例化了工厂对象 第三种和第四种本质区别就是:当Factory实现了FactoryBean接口后spring创建Factory对象后会自动调用其get方法获取bean对象(这里 retrun new Bean(这里需要我们自己制定) 第一种方法,只实例化bean对象本身 第二种方法只是调用了Factory对象中的静态方法实例化了bean对象,并没有实例化Factory对象 -->
-