Spring IOC - 控制反转(依赖注入) - 创建对象的方式

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

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

猜你喜欢

转载自www.cnblogs.com/chuijingjing/p/9782910.html