1. 一站式框架:管理项目中的对象。spring框架性质是容器(对象容器)
2. 核心是控制反转(IOC)和面向切面(AOP)
IOC:反转控制--将创建对象的方式反转
自己创建、维护对象-->由spring完成创建、注入
反转控制就是反转了对象的创建方式,从自己创建反转给了程序
DI:依赖注入--实现IOC需要DI做支持
注入方式:set、构造方法、字段 注入
注入类型:值类型(8大数据类型)、引用类型(对象) 注入
二、简单实现
1.导包
首先根据图找到需要的jar包,再导入日志包

导入包后项目结构如图所示

2.创建一个对象 bean
 User.xml
 User.xmlpackage com.dic.bean;
public class User {
    
    private String name;
    private String age;
    
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAge() {
        return age;
    }
    public void setAge(String age) {
        this.age = age;
    }
}
User.xml
3.配置核心 xml 文件
对名字、位置没有具体要求,一般命名为 applicationContext.xml 放置在 src 下
 applicationContext.xml
 applicationContext.xml<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" 
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd ">
    <!-- 将user对象交给spring -->
    <!-- 
        name:调用时用的名字
        class:路径
    -->
       <bean name="user" class="com.dic.bean.User"></bean>
        
       
</beans>
applicationContext.xml
4. junit 测试以下代码,控制台打印不为空且无报错即为成功
 Demo1.java
 Demo1.javapackage com.dic.text;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.dic.bean.User;
public class Demo1 {
    
    @Test
    public void fun1(){
        
        //1 创建容器对象
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        //2 向容器"要"user对象
        User u = (User) ac.getBean("user");
        //3 打印user对象
        System.out.println(u);
        
        
    }
}
Demo1.java
三、<bean>元素详解 注释都写在代码里,也可以直接看第四部分
1. 元素解释
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" 
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd ">
    <!-- bean元素:使用该元素描述需要spring容器管理的对象 -->
    <!-- 
        name:调用时用的名字
        class:路径
        id:与name属性作用一样但名称不可重复且不能使用特殊字符
        scope属性:
            singleton(默认值):单例对象,在spring容器中启动时创建,只存在一个
            prototype:多例原型,每次在获得时才会创建,每次都创建一个新的
    -->
    <bean name="user" class="com.dic.bean.User></bean>
</beans>
2. 模块化配置:即将bean分散在多个文件中配置,在 applicationContext.xml 中添加一句引用即可
<!-- 导入其他spring配置文件 --> <import resource="com/dic/bean/applicationContext.xml"/>
3. 属性注入之 set 注入
分为 set 注入、对象注入两种,在 xml 中注入内容如下
<!-- set注入  -->
     <bean name="user1" class="com.dic.bean.User1">
           <property name="name" value="tom"></property>
           <property name="age" value="18"></property>
     </bean>
     
  
<!-- 对象注入 -->
     <!-- 1. -->
     <bean name="car" class="com.dic.bean.Car">
           <property name="name" value="的健康的"></property>
           <property name="color" value="yellow"></property>
     </bean>
     <!-- 2. -->
     <bean name="user2" class="com.dic.bean.User2">
           <property name="name" value="tom"></property>
           <property name="age" value="18"></property>
           <property name="Car" ref="car"></property>
     </bean>
4. 属性注入之构造方式注入
1. 在 User3.java 中添加构造方法
public User3(String name, Car car) {
    System.out.println("构造方式");
    this.name = name;
    this.car = car;
}
2. 在 applicationContext.xml 中添加配置 注意赋值标签不一样
     <!-- 构造方法注入    -->
     <bean name="user3" class="com.dic.bean.User3">
           <constructor-arg name="name" value="嗯哼"></constructor-arg>
           <constructor-arg name="car" ref="car"></constructor-arg>
      </bean>
构造方式注意:出现同名参数时指定参数类型
<bean name="user3" class="com.dic.bean.User3">
           <!-- 出现同名参数 用type指定参数类型即可  -->
           <constructor-arg name="name" value="11" type="java.lang.Integer"></constructor-arg>
           <constructor-arg name="car" ref="car"></constructor-arg>
      </bean>
5. 复杂类型注入
复杂的类型注入,如:数组、list、map、properties
1 <!-- 复杂类型注入 使用set方式 --> 2 3 <bean name="user4" class="com.dic.bean.User4"> 4 <!-- array --> 5 <!-- 如果数组中只有一个值,也可使用 name value --> 6 <property name="arr"> 7 <array> 8 <value>tom</value> 9 <value>jerry</value> 10 <ref bean="user2"/> 11 </array> 12 </property> 13 <!-- list --> 14 <property name="list"> 15 <list> 16 <value>jack</value> 17 <value>rose</value> 18 <ref bean="user2" /> 19 </list> 20 </property> 21 <!-- map --> 22 <property name="map"> 23 <map> 24 <entry key="url" value="jdbc:mysql:///crm" ></entry> 25 <entry key="user" value-ref="user" ></entry> 26 <entry key-ref="user3" value-ref="user2" ></entry> 27 </map> 28 </property> 29 <!-- pro --> 30 <property name="pro"> 31 <props> 32 <prop key="driverClass">com.jdbc.mysql.Driver</prop> 33 <prop key="userName">root</prop> 34 <prop key="password">root</prop> 35 </props> 36 </property> 37 </bean>
四、代码整理

package com.dic.bean;
public class Car {
    
    private String name;
    private String color;
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getColor() {
        return color;
    }
    public void setColor(String color) {
        this.color = color;
    }
}
Car.java
package com.dic.bean;
public class User {
    
    private String name;
    private String age;
    
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAge() {
        return age;
    }
    public void setAge(String age) {
        this.age = age;
    }
}
User.java
package com.dic.bean;
public class User1 {
    
    private String name;
    private String age;
    
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAge() {
        return age;
    }
    public void setAge(String age) {
        this.age = age;
    }
}
User1.java
package com.dic.bean;
public class User2 {
    
    private String name;
    private String age;
    private Car car;
    
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAge() {
        return age;
    }
    public void setAge(String age) {
        this.age = age;
    }
    public Car getCar() {
        return car;
    }
    public void setCar(Car car) {
        this.car = car;
    }
}
User2.java
package com.dic.bean;
public class User3 {
    
    private String name;
    private String age;
    private Car car;
    
    
    public User3(String name, Car car) {
        System.out.println("构造方式");
        this.name = name;
        this.car = car;
    }
    
    
    //出现同参数名 
    public User3(Integer name, Car car) {
        System.out.println("同名参数构造方式");
        this.name = name+"";
        this.car = car;
    }
}
User3.java
package com.dic.bean;
import java.util.List;
import java.util.Map;
import java.util.Properties;
public class User4 {
    
    private Object[] arr; 
    private List list;
    private Map map;
    private Properties pro;  //实际上就是一个map
    
    
    
    public Object[] getArr() {
        return arr;
    }
    public void setArr(Object[] arr) {
        this.arr = arr;
    }
    public List getList() {
        return list;
    }
    public void setList(List list) {
        this.list = list;
    }
    public Map getMap() {
        return map;
    }
    public void setMap(Map map) {
        this.map = map;
    }
    public Properties getPro() {
        return pro;
    }
    public void setPro(Properties pro) {
        this.pro = pro;
    }
    
}
User4.java
package com.dic.text;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.dic.bean.User;
import com.dic.bean.User1;
import com.dic.bean.User2;
import com.dic.bean.User3;
public class Demo1 {
    
    @Test
    public void fun1(){
        
        //1 创建容器对象
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        //2 向容器"要"user对象
        User u = (User) ac.getBean("user");
        //3 打印user对象
        System.out.println(u);
        
        User1 u1 = (User1) ac.getBean("user1");
        System.out.println(u1);
        
        User2 u2 = (User2) ac.getBean("user2");
        System.out.println(u2);
        
        
        User3 u3 = (User3) ac.getBean("user3");
        System.out.println(u3);
        
    }
}
Demo1.java
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" 
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd ">
    <!-- bean元素:使用该元素描述需要spring容器管理的对象 -->
    <!-- 
        name:调用时用的名字
        class:路径
        id:与name属性作用一样但名称不可重复且不能使用特殊字符
        scope属性:
            singleton(默认值):单例对象,在spring容器中启动时创建,只存在一个
            prototype:多例原型,每次在获得时才会创建,每次都创建一个新的
    -->
    <bean name="user" class="com.dic.bean.User"></bean>
    
    
    <!-- set注入  -->
       <bean name="user1" class="com.dic.bean.User1">
           <property name="name" value="tom"></property>
           <property name="age" value="18"></property>
       </bean>
       
    <!-- 对象注入 -->
       <!-- 1. -->
       <bean name="car" class="com.dic.bean.Car">
           <property name="name" value="的健康的"></property>
           <property name="color" value="yellow"></property>
       </bean>
       <!-- 2. -->
       <bean name="user2" class="com.dic.bean.User2">
           <property name="name" value="tom"></property>
           <property name="age" value="18"></property>
           <property name="Car" ref="car"></property>
       </bean>
       
       
     <!-- 构造方法注入    -->
        <bean name="user3" class="com.dic.bean.User3">
           <!-- 出现同名参数 用type指定参数类型即可  -->
           <constructor-arg name="name" value="11" type="java.lang.Integer"></constructor-arg>
           <constructor-arg name="car" ref="car"></constructor-arg>
        </bean>
       
       
     <!-- 复杂类型注入  使用set方式   -->
  
         <bean name="user4" class="com.dic.bean.User4">
             <!-- array -->
                 <!-- 如果数组中只有一个值,也可使用 name value   -->
                 <property name="arr">
                     <array>
                         <value>tom</value>
                         <value>jerry</value>
                         <ref bean="user2"/>
                     </array>
                 </property>           
             <!-- list -->
                 <property name="list">
                     <list>
                         <value>jack</value>
                         <value>rose</value>
                         <ref bean="user2" />
                     </list>
                 </property>     
             <!-- map -->
                 <property name="map">
                     <map>
                        <entry key="url" value="jdbc:mysql:///crm" ></entry>
                        <entry key="user" value-ref="user"  ></entry>
                        <entry key-ref="user3" value-ref="user2"  ></entry>
                     </map>
                 </property>
             <!-- pro -->
                 <property name="pro">
                     <props>
                        <prop key="driverClass">com.jdbc.mysql.Driver</prop>
                        <prop key="userName">root</prop>
                        <prop key="password">root</prop>
                    </props>
                 </property>
         </bean>
    
    
    
    
    <!-- 导入其他配置文件
           <import resource="com/dic/bean/applicationContext.xml"/>
       -->
       
</beans>
applicationContext.xml
 
        