IOC控制反转

        是一种设计思想,意味着将设计好的对象交给Ioc容器控制,而不是传统的在对象的内部直接控制。

IOC容器把创建和查找依赖对象的控制权交给了容器,由容器进行注入组合对象

DI依赖注入

     组件之间的依赖关系由容器在运行期间决定。

Ioc容器注入应用程序某个对象,它所需要的外部资源(包括对象,资源,常量数据)


Spring Ioc容器

具有依赖注入功能的容器。负责实例化,定位,配置应用程序中的对象及建立这些对象间的依赖。

Spring中BeanFactory是Ioc容器的实际代表者。BeanFactory接口提供了IoC容器的基本功能。

Spring Ioc容器通过读取配置文件中的配置元数据,通过元数据对应用中各个对象进行实例化及装配。

1 xml配置文件进行配置元数据(一般使用)

2 基于注解

3 基于java文件


Spring Ioc容器管理的对象:Bean

Bean就是由Spring容器初始化、装配及管理的对象,此外bean与应用程序中的其他对象没有什么区别.

Bean在容器内部由BeanDefinition对象表示。

BeanDefinition:

全限定类名(FQN):用于定义Bean的实现类;(必须的)

Bean行为定义:包括作用域(单例、原型创建)、是否惰性初始化及生命周期等;

Bean创建方式定义:说明是通过构造器还是工厂方法创建Bean;

Bean之间关系定义:即对其他bean的引用,也就是依赖关系定义,也就是依赖注入。

Bean的作用域

1. “singleton”(单例,通过单例缓存池实现)

2. “prototype”(原型,每次创建全新的bean)

3. 另外提供“request”、“session”、“global session”三种web作用域;


Spring Ioc容器工作流程:(基于xml配置)

1. 准备配置文件

2. 由Ioc容器进行解析元数据,创建,组装bean

3. 客户端实例化Ioc容器,从容器中获取需要的bean


Spring IoC容器实例化Bean

根据Bean定义里的配置元数据使用反射机制来创建Bean

1. 使用无参构造器

        public class Person {   

                     private String name;    

                     private Integer age;

                    //必须包含一个无参数构造器,有参数的也可以有    

                     public Person() {        System.out.println("这是一个无参构造函数");     }

        }        

        <bean id="person" class="com.maple.Person"></bean>

        Person person = (Person)context.getBean("person");  

2. 静态工厂

    通过factory-method属性来指定创建bean实例的静态工厂方法

        public class PersonServiceBeanFactory {

                public static PersonServiceBean createPersonServiceBean(){

                        return new PersonServiceBean()

                }

        }

        <bean id="person2" class="cn.lius.service.impl.PersonServiceBeanFactory" factory-method="createPersonServiceBean"/>

         Person person = (Person)context.getBean("person2");  

3. 实例工厂

定义一个工厂类 
     通过factory-bean属性指定工厂类,通过factory-method属性指定该工厂类的非静态工厂方法

spring调用工厂方法,在该工厂方法中,由程序员来创建对象

        public class PersonServiceBeanFactory {

                public PersonServiceBean createPersonServiceBean(){

                        return new PersonServiceBean()

                }

        }

<bean id="personServiceFactory" class="cn.lius.service.impl.PersonServiceBeanFactory"/>

<bean id="person3" factory-bean="personServiceFactory" factory-method="createPersonServiceBean"/>

Person person = (Person)context.getBean("person3");


Spring IoC容器注入依赖资源的方式:

1. 构造器注入。(构造器方式,静态工厂方式,实例工厂方式都可以)

通过在<bean>中配置构造器实现,构造器参数就是依赖。

配置文件中三种表示参数的方式:参数索引,参数类型,参数名称

public HelloImpl3(String message, int index) {

        this.message = message;

        this.index = index;

    }

<!-- 通过构造器参数索引方式依赖注入 -->

<bean id="byIndex" class="cn.javass.spring.chapter3.HelloImpl3">

<constructor-arg index="0" value="Hello World!"/>

    <constructor-arg index="1" value="1"/>

</bean>

<!-- 通过构造器参数类型方式依赖注入 -->

<bean id="byType" class="cn.javass.spring.chapter3.HelloImpl3">

   <constructor-arg type="java.lang.String" value="Hello World!"/>

   <constructor-arg type="int" value="2"/>

</bean>

<!-- 通过构造器参数名称方式依赖注入 -->

<bean id="byName" class="cn.javass.spring.chapter3.HelloImpl3">

   <constructor-arg name="message" value="Hello World!"/>

   <constructor-arg name="index" value="3"/>

</bean>

2. Setter注入

通过在通过构造器,静态工厂,实例工厂实例好bean后,通过调用bean类的setter方法进行注入依赖。

只有一种方式,根据名字注入。

//setter方法

    public void setMessage(String message) {

        this.message = message;

    }

    public void setIndex(int index) {

        this.index = index;

    }

<bean id="bean" class="cn.javass.spring.chapter3.HelloImpl4">

        <property name="message" value="Hello World!"/>

        <property name="index"><value>1</value></property>

</bean>

Spring IoC容器注入集合、数组、字典

Spring不仅能注入简单类型数据,还能注入集合(Collection、Set、List)类型、数组(Array)类型、字典(Map)类型数据、Properties类型数据。


自动装配

自动装配就是指由Spring来自动地注入依赖对象,无需人工参与。

自动装配的好处是减少构造器注入和setter注入配置,减少配置文件的长度。自动装配通过配置<bean>标签的 “autowire”属性来改变自动装配方式。

Eg.<bean id="bean" class="cn.javass.spring.chapter3.bean.HelloApiDecorator"

     autowire="byName"/>

四种可选值:“no”、“byName ”、“byType”、“constructor”

如果一个bean有很多setter注入,通过“byName”方式能减少很多<property>配置。