a.通过类的无参构造方法创建对象
在入门案例中就是这种方式。当用最普通的方式配饰一个<bean>时,默认就是采用类的
无参构造创建对象。在Spring容器初始化时,通过<bean>上配置的class属性反射的到字
节码对象,通过newInstance()创建对象。
Class c = Class .forName("类的全路径名称")
Object obj = c.newInstance()
这种方式下Spring创建对象,必须有无参的构造,否则无法通过反射创建对象,会抛出异常。
package cn.tedu.beans; public class Person { public Person(String str) { System.out.println("有参构造 ~~~"); } public void say() { System.out.println("person hello spring ~~~"); } }
@Test /** * SpringIOC 创建对象方式 1 - 通过无参构造方法创建对象 */ public void test4(){ /* <bean id="person" class="cn.tedu.beans.Person"></bean> <alias name="person" alias="per"/> */ ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); // 通过id获取 Person p = (Person) context.getBean("person"); p.say(); }
b.通过静态工厂创建对象
很多时候,我们面对的类是无法通过无参构造去创建的,例如该类没有无参构造、是一抽象类等等情况,此时无法要求spring通过无参构造创建对象,此时可以使用静态工厂方式创建对象。
package cn.tedu.factory; import java.util.Calendar; public class CalendarStaticFactory { public static Calendar getInstance(){ return Calendar.getInstance(); } }
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd" > <bean id="calendar" class="cn.tedu.factory.CalendarStaticFactory" factory-method="getCalendar"></bean> </beans>
@Test /** * SpringIOC 创建对象方式 2 - 静态工厂 */ public void test5(){ ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); // 通过id获取 Calendar calendar = (Calendar) context.getBean("calendar"); System.out.println(calendar); }
c.实例工厂创建对象
实例工厂也可以解决类是无法通过无参构造创建的问题,解决的思路和静态工厂类似,只不过实例工厂提供的方法不是静态的。Spring需要先创建出实例工厂的对象,在调用实例工厂对象上指定的普通方法来创建对象。所以实例工厂也需要配置到Spring中管理。
package cn.tedu.factory; import java.util.Calendar; public class CalendarFactory { public Calendar getCalendar(){ return Calendar.getInstance(); } }
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd" > <bean id="calendarFactory" class="cn.tedu.factory.CalendarFactory"></bean> <bean id="calendar" factory-bean="calendarFactory" factory-method="getCalendar"></bean> </beans>
@Test /** * Spring 创建对象方式3 - 实例工厂 */ public void test7(){ ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); Calendar calendar = (Calendar) context.getBean("calendar"); System.out.println(calendar); }
d.Spring工厂创建对象
Spring内置了工厂接口,也可以通过实现这个接口来开发Spring工厂,通过这个工厂创建对象。
package cn.tedu.factory; import java.util.Calendar; import org.springframework.beans.factory.FactoryBean; public class CalendarSpringFactory implements FactoryBean<Calendar> { /** * Spring工厂生产对象的方法 */ @Override public Calendar getObject() throws Exception { return Calendar.getInstance(); } /** * 获取当前工厂生产的对象的类型的方法 */ @Override public Class<?> getObjectType() { return Calendar.class; } /** * Spring工厂生产对象时是否采用单例模式 * 如果返回true,则在spring中该对象只创建一次,后续重复使用 * 如果返回false,则每次获取该bean都重新创建对象 */ @Override public boolean isSingleton() { return true; } }
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd" > <bean id="calendar" class="cn.tedu.factory.CalendarSpringFactory"></bean> </beans>
@Test /** * SpringIOC 创建对象方式 3 - spring工厂 */ public void test6(){ ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); // 通过id获取 Calendar calendar = (Calendar) context.getBean("calendar"); System.out.println(calendar); }