a.通过类的无参构造方法创建对象
在入门案例中就是这种方式。当用最普通的方式配饰一个
无参构造创建对象。在Spring容器初始化时,通过
节码对象,通过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(){/*
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&#61;"http://www.springframework.org/schema/beans" xmlns:xsi&#61;"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation&#61;"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd"><bean id&#61;"calendar" class&#61;"cn.tedu.factory.CalendarStaticFactory" factory-method&#61;"getCalendar">bean>beans>
&#64;Test/*** SpringIOC 创建对象方式 2 - 静态工厂*/public void test5(){ApplicationContext context &#61; new ClassPathXmlApplicationContext("applicationContext.xml");// 通过id获取Calendar calendar &#61; (Calendar) context.getBean("calendar");System.out.println(calendar);}
c.实例工厂创建对象
实例工厂也可以解决类是无法通过无参构造创建的问题&#xff0c;解决的思路和静态工厂类似&#xff0c;只不过实例工厂提供的方法不是静态的。Spring需要先创建出实例工厂的对象&#xff0c;在调用实例工厂对象上指定的普通方法来创建对象。所以实例工厂也需要配置到Spring中管理。
package cn.tedu.factory;import java.util.Calendar;public class CalendarFactory {public Calendar getCalendar(){return Calendar.getInstance();}
}
xml version&#61;"1.0" encoding&#61;"UTF-8"?>
<beans xmlns&#61;"http://www.springframework.org/schema/beans" xmlns:xsi&#61;"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation&#61;"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd"><bean id&#61;"calendarFactory" class&#61;"cn.tedu.factory.CalendarFactory">bean><bean id&#61;"calendar" factory-bean&#61;"calendarFactory" factory-method&#61;"getCalendar">bean>beans>
&#64;Test/*** Spring 创建对象方式3 - 实例工厂*/public void test7(){ApplicationContext context &#61; new ClassPathXmlApplicationContext("applicationContext.xml");Calendar calendar &#61; (Calendar) context.getBean("calendar");System.out.println(calendar);}
d.Spring工厂创建对象
Spring内置了工厂接口&#xff0c;也可以通过实现这个接口来开发Spring工厂&#xff0c;通过这个工厂创建对象。
package cn.tedu.factory;import java.util.Calendar;import org.springframework.beans.factory.FactoryBean;public class CalendarSpringFactory implements FactoryBean
}
xml version&#61;"1.0" encoding&#61;"UTF-8"?>
<beans xmlns&#61;"http://www.springframework.org/schema/beans" xmlns:xsi&#61;"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation&#61;"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd"><bean id&#61;"calendar" class&#61;"cn.tedu.factory.CalendarSpringFactory">bean>beans>
&#64;Test/*** SpringIOC 创建对象方式 3 - spring工厂*/public void test6(){ApplicationContext context &#61; new ClassPathXmlApplicationContext("applicationContext.xml");// 通过id获取Calendar calendar &#61; (Calendar) context.getBean("calendar");System.out.println(calendar);}