1:谁控制谁,控制什么:传统JAVA SE中,直接在对象内部通过new进行创建对象。是程序主动去创建依赖对象;而IOC是有专门的容器来创建这些对象。由IOC容器来控制对象的 创建。谁控制谁,当然是IOC控制对象。控制什么:控制外部资源(不只是对象包括比如文件等);
用图例说明一下,传统程序设计如图2-1,都是主动去创建相关对象然后再组合起来:
用IOC:
DI:依赖注入:是组件间依赖关系由容器在运行期决定的。
  谁依赖谁:应用程序依赖IOC容器;
  为什么需要依赖:应用程序需要IOC容器来提供对象需要的外部资源;
  谁注入谁:IOC容器注入应用程序某个对象。应用程序依赖的对象;
  注入了什么:就是注入了某个对象所需要的外部资源(包括对象,资源。常量数据)
类之间的关系:
  泛化:表示类与类之间的继承关系。接口与接口之间的继承关系;
  实现:类对接口的实现;
  依赖:当类与类之间有使用关系时候就是依赖关系。表现为:拥有关系“;具体代码可以用实例变量来表示;
  聚合:是关联的特殊情况,体现部分-整体关系。是一种弱拥有关系。整体和部分可以有不一样 的生命周期;
  组合:关联的特殊情况。体现部分-整体关系。但是是一种强拥有关系。整体和部分有相同的生命周期;是强关联‘
然后就是注入:
   注入分为三种:属性注入。构造器注入。静态工厂方法注入
  属性注入:
      <bean id="helloworld" class="com.spring.beans.HelloWorld">
                <property name="name2" value="luwei"/>   name中的就是set后面的对应的值;
           </bean>
  构造器注入:
      实体:
      package com.spring.beans;
public class Car {
    private String brand;
    private String corp;
    private int price;
    private int maxSpeed;
    public Car(String brand, String corp, int price, int maxSpeed) {
        super();
        this.brand = brand;
        this.corp = corp;
        this.price = price;
        this.maxSpeed = maxSpeed;
    }
    @Override
    public String toString() {
        return "Car [brand=" + brand + ", corp=" + corp + ", price=" + price
                + ", maxSpeed=" + maxSpeed + "]";
    }
    
}
配置文件
  <bean id ="car" class="com.spring.beans.Car">
        <constructor-arg value="audi" index="0"></constructor-arg>
        <constructor-arg value="shanghai" index="1"></constructor-arg>
        <constructor-arg value="30000" index="2"></constructor-arg>
        <constructor-arg value="300" index="3"></constructor-arg>
        
    </bean>
添加 index属性就是按构造器中的顺序。
换成type 就是按照类型   不过要写包名
  <constructor-arg value="audi" type="java.lang.String"></constructor-arg>
        <constructor-arg value="30000" type="int"></constructor-arg>
工厂方法注入:
静态工厂方法。不用创建实例而是调用方法。
java文件:
package com.spring.beans;
import java.util.HashMap;
import java.util.Map;
public class StaticCarFactory {
    private static Map<String,Car> cars=new HashMap<String, Car>();
    static{
        cars.put("audi", new Car("audi","shanghai",30000,300));
        cars.put("ford", new Car("ford","shanghai",30000,300));
    }
    
    public static Car getCar(String name){
        return cars.get(name);
    }
}
配置文件:
  <bean id="car1" class="com.spring.beans.StaticCarFactory" factory-method="getCar">    
            <constructor-arg value="audi"></constructor-arg>
    </bean>    
实例工厂方法:一定先创建实例本身
package com.spring.beans;
import java.util.HashMap;
import java.util.Map;
public class InstanceCarFactory {
    private Map<String, Car> cars=null;
    public InstanceCarFactory(){
        cars=new HashMap<String, Car>();
        cars.put("audi", new Car("audi","shanghai",30000,300));
        cars.put("ford", new Car("ford","shanghai",30000,300));
    }
    public Car getCar(String brand){
        return cars.get(brand);
    }
}
配置文件:
<bean id="carFactory" class="com.spring.beans.InstanceCarFactory"></bean>
    <bean id="car2" factory-bean="carFactory" factory-method="getCar">
        <constructor-arg value="ford"></constructor-arg>
    </bean>
  
---------------------------------spring生命周期----------------------------------------------
           创建的时候,spring启动的时候所有的单例的bean都被创建。
          关闭的时候:工厂关闭。
顺序:构造器-----》set------>init---------->destory
在Bean中配置init-method和destory-method属性,为bean指定初始化和销毁方法。
lazy-init="true"  延迟加载。
--------------------------Bean作用域-------------------
<bean id="helloworld" class="com.spring.beans.HelloWorld" scope="singleton">  单例的 不写就是默认
scope="prototype"非单例的
单例:在容器创建的时候就创建了,只创建这一次。
非单例:在每次请求的时候创建一个新的bean实例。
--------------------自动装配-------
    <!-- 
        autowire:自动装载
        byType:将工厂中与目标组件的属性同类型的bean,赋值给对应属性
        byName:将工厂中与目标组件的属性同名的bean,赋值给对应属性
     -->
    <bean id="ioc49" class="com.c47.IOC.test.TestIOC3" autowire="byName"></bean>