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);
}