最新理解
IOC是整个Spring的核心,AOP是在IOC实现的基础上的锦上添花。
IOC是将目标类作为BEAN交给Spring去管理,AOP是在拿到BEAN对象的时候,提前执行、环绕执行、最终执行的方法。

一、Spring概述

Spring 是个java企业级应用的开源开发框架。Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用。Spring 框架目标是简化Java企业级应用开发,并通过POJO为基础的编程模型促进良好的编程习惯。

一.Spring的优势

1、方便解耦,简单开发

通过Spring提供的Ioc容器,可以将对象间的依赖关系交由Spring进行控制,避免过度程序耦合,可以更加专注于上层的应用。

2、AOP变成的支持

通过Spring的AOP功能,方便进行切面的编程,许多不容易实现的功能可以使用AOP进行轻松的实现。

3、声明式事务的支持

例如@Transactional
通过声明的方式灵活地进行事务管理,提高开发效率和质量。

4、方便程序的测试

这块我还没有体会

5、方便集成各种优秀框架

可以集成其他的框架

6、降低JAVAEE API的使用难度

Spring对JDBC、JAVAMAIL和远程调用进行了封装,降低了这些API的使用难度。

二、IOC(Inversion of control,控制反转)

一.什么是IOC

IOC是一个技术思想,而不是一个技术实现。

描述的是:JAVA对象创建和管理的问题
例:需要在类A中调用类B的非静态方法

传统方式:在类A中NEW一个类B的对象(A依赖于B)。
IOC方式:不需要自己去NEW对象,而是从容器(IOC容器)中获取,不需要自己创建。

在IOC方式下,类A丧失了创建和管理对象的权力,得到一个福利是不用考虑对象的创建和管理,因为容器会帮我们创建和管理好。

二.什么是IOC容器

Spring提供了IOC容器的两种实现方式:(两个接口)
这两个接口的作用是相似的,都能加载XML文件通过工厂的过程去创建对象
主类

import domain.User;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestDemo {
    public static void main(String[] args) {
        //BeanFactory beanFactory = new ClassPathXmlApplicationContext("bean.xml");
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");
        User user = applicationContext.getBean("User", User.class);
        user.setName("麟之");
        user.setAge(1);
        System.out.println(user.toString());
    }
}

User

package domain;

public class User {

    private String name;

    private Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

XML配置

<?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.xsd" >
    <bean id="User" name="User" class="domain.User" ></bean>
</beans>

1、BeanFactory

BeanFactory是spring的原始接口,针对原始结构的实现类功能比较单一,BeanFactory接口实现的容器,特点是在每次获取对象时才会创建对象。
BeanFactory在启动的时候不会去实例化Bean,中有从容器中拿Bean的时候才会去实例化;
在这一步的时候才开始创建对象

User user = applicationContext.getBean("User", User.class);

2、ApplicationContext

继承了BeanFactory接口,拥有BeanFactory的全部功能,并且扩展了很多高级特性.

  1. 国际化(MessageSource)
  2. 访问资源,如URL和文件(ResourceLoader)
  3. 载入多个(有继承关系)上下文 ,使得每一个上下文都专注于一个特定的层次,比如应用的web层
  4. 消息发送、响应机制(ApplicationEventPublisher)
  5. AOP(拦截器)

ApplicationContext在启动的时候就把所有的Bean全部实例化了。它还可以为Bean配置lazy-init=true来让Bean延迟实例化;

ApplicationContext 包含 BeanFactory 的所有特性,通常推荐使用前者。但是也有一些限制情形,比如移动应用内存消耗比较严苛,在那些情景中,使用更轻量级的 BeanFactory 是更合理的。绝大多数的情况下ApplicationContext是首选。

三.IOC操作Bean管理(XML配置)

1、Bean管理是什么?

Bean管理指的是两个操作,创建对象和注入属性。

2、XML配置文件配置基本信息

(1).基于XML方式创建对象

在Spring配置文件中,使用bean标签,并在里面添加对应的属性就可以实现对象的创建。
Bean中有很多的属性

  1. ID属性: 等同于别名,唯一的标识。
  2. Class属性:创建对象的类的全路径
  3. Name属性:用来为id创建一个或多个别名。它可以是任意的字母符合。多个别名之间用逗号或空格分开。
  4. autowire:自动装配,默认为true
  5. lazy-init:懒加载,默认为default,用来定义这个Bean是否实现懒初始化。如果为“true”,它将在BeanFactory启动时初始化所有的SingletonBean。反之,如果为“false”,它只在Bean请求时才开始创建SingletonBean。
  6. scope:scope属性表示bean的作用范围,scope有4个值:
    singleton:表示整个IOC容器共享一个Bean,也就是说每次说每次通过getBean获取的bean都是同一个。
    prototype:每次对该bean请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean()方法)时都会创建一个新的bean实例。
    request:每次HTTP请求将会生成各自的bean实例
    session:每次会话请求对应一个bean实例
    singleton和prototype经常使用,request和session基本不使用。
(2).基于XML方式注入属性

XML注入方式有两种:普通的SET注入和带参构造注入
普通SET注入

package domain;

public class Stu {
    private Integer id;
    private String name;
    private  String stuClass;

    public void setId(Integer id) {
        this.id = id;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setStuClass(String stuClass) {
        this.stuClass = stuClass;
    }

    public Integer getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public String getStuClass() {
        return stuClass;
    }

    public Stu(Integer id, String name, String stuClass) {
        this.id = id;
        this.name = name;
        this.stuClass = stuClass;
    }

    @Override
    public String toString() {
        return "Stu{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", stuClass='" + stuClass + '\'' +
                '}';
    }
}
<?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.xsd" >
    <bean id="User" name="User" class="domain.User" >
        <property name="name" value="麟之"></property>
        <property name="age" value="1"></property>
    </bean>
</beans>

带参构造注入

package domain;

public class Stu {
    private Integer id;
    private String name;
    private  String stuClass;
    public Stu(Integer id, String name, String stuClass) {
        this.id = id;
        this.name = name;
        this.stuClass = stuClass;
    }
    @Override
    public String toString() {
        return "Stu{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", stuClass='" + stuClass + '\'' +
                '}';
    }
}
<?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.xsd" >
    <bean id="Stu"  class="domain.Stu" >
        <constructor-arg name="id" value="1"></constructor-arg>
        <constructor-arg name="name" value="麟之"></constructor-arg>
        <constructor-arg name="stuClass" value="1年纪"></constructor-arg>
    </bean>
</beans>
(3).XML注入其他类型属性

设置NULL值

<?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.xsd">
    <bean id="User" name="User" class="domain.User">
        <property name="name" value="麟之"></property>
        <property name="age">
            <null></null>
        </property>
    </bean>
</beans>

包含特殊符号
可以进行转义或者使用CDATA

<?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.xsd">
    <bean id="User" name="User" class="domain.User">
        <property name="name">
            <value>
                <![CDATA[<<麟之>>]]>
            </value>
        </property>
        <property name="age" value="1">
        </property>
    </bean>
</beans>
(4).XML注入外部bean
package controller;

import service.userService;

public class userController {

    //创建userService类型,并生成SET方法
    private userService userservice;

    public void setUserservice(userService userservice) {
        this.userservice = userservice;
    }

    public void addUser() {
        userservice.addUser();
    }
}
<?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.xsd">

    <bean id="userServiceImpl" class="service.userServiceImpl"></bean>

    <bean id="userController" class="controller.userController">
        <!--将userServiceImpl注入到userController中-->
        <property name="userservice" ref="userServiceImpl"></property>
    </bean>
</beans>
package service;
public interface userService {
    void addUser();
}
package service;
public class userServiceImpl implements userService{
    public void addUser() {
        System.out.println("添加用户");
    }
}
(5).XML注入内部bean和级联赋值
<?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.xsd">
    <!--注入内部BEAN-->
    <bean id="Stu" class="domain.Stu">
        <!--普通属性-->
        <property name="id" value="1"></property>
        <property name="name" value="麟之"></property>
        <!--设置对象类型属性-->
        <property name="school">
            <bean id="School" class="domain.School">
                <property name="ID" value="110"></property>
                <property name="NAME" value="GXEZ"></property>
            </bean>
        </property>
    </bean>
</beans>

也可以这样写
    <bean id="Stu" class="domain.Stu">
        <!--普通属性-->
        <property name="id" value="1"></property>
        <property name="name" value="麟之"></property>
        <!--设置对象类型属性-->
        <property name="school" ref="School"></property>
    </bean>
    <bean id="School" class="domain.School">
        <property name="ID" value="110"></property>
        <property name="NAME" value="GXEZ"></property>
    </bean>
package domain;

public class School {
    private Integer ID;
    private String NAME;

    public void setID(Integer ID) {
        this.ID = ID;
    }

    public void setNAME(String NAME) {
        this.NAME = NAME;
    }
}

package domain;

public class Stu {

    private Integer id;
    private String name;
    private  String stuClass;
    //对象形式表示
    private School school;
    public void setId(Integer id) {
        this.id = id;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void setStuClass(String stuClass) {
        this.stuClass = stuClass;
    }
    public void setSchool(School school) {
        this.school = school;
    }
    @Override
    public String toString() {
        return "Stu{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", stuClass='" + stuClass + '\'' +
                ", school=" + school +
                '}';
    }
}
(6).XML注入集合属性

注入数组类型
注入LIST集合类型
注入MAP集合类型
注入SET集合类型
这些我写在一个XML配置文件中了

package domain;

import java.util.List;
import java.util.Map;
import java.util.Set;

public class Student {
    private Integer id;
    private String Name;
    private String[] courses;

    private List<String> listTest;

    private Map<String, String> mapTest;

    private Set<String> setTest;

    public void setId(Integer id) {
        this.id = id;
    }
    public void setName(String name) {
        Name = name;
    }
    public void setCourses(String[] courses) {
        this.courses = courses;
    }
    public void setListTest(List<String> listTest) {
        this.listTest = listTest;
    }
    public void setMapTest(Map<String, String> mapTest) {
        this.mapTest = mapTest;
    }
    public void setSetTest(Set<String> setTest) {
        this.setTest = setTest;
    }
    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", Name='" + Name + '\'' +
                ", courses=" + Arrays.toString(courses) +
                ", listTest=" + listTest +
                ", mapTest=" + mapTest +
                ", setTest=" + setTest +
                '}';
    }
}
<?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.xsd">
    <!--集合类型属性注入-->
    <bean id="Student" class="domain.Student">
        <property name="id" value="1"></property>
        <property name="name" value="麟之"></property>
        <!--数组类型属性注入-->
        <property name="courses">
            <array>
                <value>数学</value>
                <value>ENGLISH</value>
            </array>
        </property>
        <property name="listTest">
            <list>
                <value>贝塔</value>
                <value>丹儿子</value>
            </list>
        </property>

        <property name="mapTest">
            <map>
                <entry key="KEY1" value="1"></entry>
                <entry key="KEY2" value="2"></entry>
                <entry key="KEY3" value="3"></entry>
            </map>
        </property>
        <!--set类型属性注入-->
        <property name="setTest">
            <set>
                <value>你</value>
                <value>好</value>
                <value>啊</value>
            </set>
        </property>
    </bean>
</beans>
(7).XML注入对象集合属性
package domain;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class Student {
    private Integer id;
    private String Name;
    private School[] courses;

    private List<School> listTest;

    private Map<Integer, School> mapTest;

    private Set<School> setTest;

    public void setId(Integer id) {
        this.id = id;
    }
    public void setName(String name) {
        Name = name;
    }
    public void setCourses(School[] courses) {
        this.courses = courses;
    }
    public void setListTest(List<School> listTest) {
        this.listTest = listTest;
    }
    public void setMapTest(Map<Integer, School> mapTest) {
        this.mapTest = mapTest;
    }
    public void setSetTest(Set<School> setTest) {
        this.setTest = setTest;
    }
    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", Name='" + Name + '\'' +
                ", courses=" + Arrays.toString(courses) +
                ", listTest=" + listTest +
                ", mapTest=" + mapTest +
                ", setTest=" + setTest +
                '}';
    }
}
package domain;
public class School {
    private Integer ID;
    private String NAME;
    public void setID(Integer ID) {
        this.ID = ID;
    }
    public void setNAME(String NAME) {
        this.NAME = NAME;
    }
    @Override
    public String toString() {
        return "School{" +
                "ID=" + ID +
                ", NAME='" + NAME + '\'' +
                '}';
    }
}
<?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.xsd">

    <!--集合类型属性注入-->
    <bean id="Student" class="domain.Student">
        <property name="id" value="1"></property>
        <property name="name" value="麟之"></property>
        <!--数组类型属性注入-->
        <property name="courses">
            <array>
                <ref bean="School1"></ref>
                <ref bean="School2"></ref>
            </array>
        </property>
        <property name="listTest">
            <list>
                <ref bean="School1"></ref>
            </list>
        </property>

        <property name="mapTest">
            <map>
                <entry key="1" value-ref="School1"></entry>
            </map>
        </property>
        <!--set类型属性注入-->
        <property name="setTest">
            <set>
                <ref bean="School1"></ref>
                <ref bean="School2"></ref>
            </set>
        </property>
    </bean>

    <bean id="School1" class="domain.School">
        <property name="ID" value="1"></property>
        <property name="NAME" value="lqyz"></property>
    </bean>

    <bean id="School2" class="domain.School">
        <property name="ID" value="2"></property>
        <property name="NAME" value="gxrz"></property>
    </bean>
</beans>

3、工厂Bean(FactoryBean)

Spring中有两种类型的Bean,一种是普通的bean,另一种是工厂bean(FactoryBean)

1.普通Bean(定义什么类型返回什么类型)

在bean标签中定义Class中的类型,返回的就是该类型。

2.工厂Bean(定义类型与返回类型不一定相同)

在bean标签中定义Class中的类型,返回的可能是其他类型。

3.工厂Bean创建步骤
(1).创建类

让该类作为工厂Bean,并实现FactoryBean接口

(2).实现FactoryBean接口的方法

实现FactoryBean接口的方法

4.代码演示
import domain.Student;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestDemo {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean6.xml");
        Student student = applicationContext.getBean("MyBean", Student.class);
        System.out.println(student.toString());
    }
}

package factoryBean;

import domain.Student;
import org.springframework.beans.factory.FactoryBean;

public class MyBean implements FactoryBean<Student> {
    @Override
    public Student getObject() throws Exception {
        Student student = new Student();
        student.setId(1);
        student.setName("麟之");
        return  student;
    }
    @Override
    public Class<?> getObjectType() {
        return null;
    }
    @Override
    public boolean isSingleton() {
        return false;
    }
}
<?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.xsd">
    <bean id="MyBean" class="factoryBean.MyBean"></bean>
</beans>

4、Bean的作用域

在Spring中,可以设置创建Bean实例是单实例还是多实例。
默认情况下是单例的。
设置Spring是单实例还是多实例对象
scope:scope属性表示bean的作用范围,scope有4个值:
singleton:表示整个IOC容器共享一个Bean,也就是说每次说每次通过getBean获取的bean都是同一个。
prototype:每次对该bean请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean()方法)时都会创建一个新的bean实例。
request:每次HTTP请求将会生成各自的bean实例
session:每次会话请求对应一个bean实例
singleton和prototype经常使用,request和session基本不使用。

5、Bean的生命周期(从对象创建到销毁的过程)

  1. 通过构造器创建Bean实例(无参构造)
  2. 为Bean的属性设置值和对其他Bean引用(调用SET方法)
  3. 添加后置处理器之后,初始化之前有一个操作。
  4. 调用Bean的初始化方法(需要进行配置)
  5. 添加后置处理器之后,初始化之后有一个操作。
  6. bean对象可以被获取到
  7. 当容器关闭的时候,调用Bean的销毁方法。(需要进行配置)
1.Bean生命周期代码演示(未添加后置处理器)
package bean;

public class Orders {
    private Integer id;
    private String orderName;

    @Override
    public String toString() {
        return "Orders{" +
                "id=" + id +
                ", orderName='" + orderName + '\'' +
                '}';
    }
    
    public Orders() {
        System.out.println("第1步,无参构造,创建Bean实例");
    }

    public void setId(Integer id) {
        System.out.println("第2步,SET设置属性,id");
        this.id = id;
    }

    public void setOrderName(String orderName) {
        System.out.println("第2步,SET设置属性,orderName");
        this.orderName = orderName;
    }

    //创建初始化方法
    public void initMethod() {
        System.out.println("第3步,初始化,initMethod");
    }

    //创建销毁方法
    public void destoryMethod() {
        System.out.println("第5步,销毁,destoryMethod");
    }
}

import bean.Orders;
import domain.Student;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestDemo {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext  classPathXmlApplicationContext = new ClassPathXmlApplicationContext("bean7.xml");

        Orders orders = classPathXmlApplicationContext.getBean("Orders", Orders.class);
        System.out.println("第4步,获取创建Bean的实例对象");
        System.out.println(orders.toString());
        //手动让Bean销毁
        classPathXmlApplicationContext.close();
    }
}
<?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.xsd">
    <bean id="Orders" class="bean.Orders" init-method="initMethod" destroy-method="destoryMethod">
        <property name="id" value="110"></property>
        <property name="orderName" value="订单"></property>
    </bean>
</beans>
2.Bean生命周期代码演示(添加后置处理器)
package bean;

public class Orders {
    private Integer id;
    private String orderName;

    @Override
    public String toString() {
        return "Orders{" +
                "id=" + id +
                ", orderName='" + orderName + '\'' +
                '}';
    }
    public Orders() {
        System.out.println("第1步,无参构造,创建Bean实例");
    }
    public void setId(Integer id) {
        System.out.println("第2步,SET设置属性,id");
        this.id = id;
    }
    public void setOrderName(String orderName) {
        System.out.println("第2步,SET设置属性,orderName");
        this.orderName = orderName;
    }
    //创建初始化方法
    public void initMethod() {
        System.out.println("第4步,初始化,initMethod");
    }

    //创建销毁方法
    public void destoryMethod() {
        System.out.println("第7步,销毁,destoryMethod");
    }
}
package bean;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;

public class OrderPost implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("第3步,初始化之前的操作");
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("第5步,初始化之后的操作");
        return bean;
    }
}
import bean.Orders;
import domain.Student;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestDemo {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext  classPathXmlApplicationContext = new ClassPathXmlApplicationContext("bean7.xml");

        Orders orders = classPathXmlApplicationContext.getBean("Orders", Orders.class);
        System.out.println("第6步,获取创建Bean的实例对象");
        System.out.println(orders.toString());
        //手动让Bean销毁
        classPathXmlApplicationContext.close();
    }
}
<?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.xsd">
    <bean id="Orders" class="bean.Orders" init-method="initMethod" destroy-method="destoryMethod">
        <property name="id" value="110"></property>
        <property name="orderName" value="订单"></property>
    </bean>
    <!--配置后置处理器,会给该xml配置文件中所有的BEAN都添加后置处理器-->
    <bean id="OrderPost" class="bean.OrderPost" ></bean>
</beans>

6、XML配置自动装配(根据属性名称或者属性类型自动将匹配的属性值进行注入)

<?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.xsd">
    <bean id="123" class="autowire.Dept">
        <property name="deptId" value="1"></property>
        <property name="deptName" value="test"></property>
    </bean>
<!--    <!–根据类型自动装配,相同类型的Bean不能定义多个–>-->
<!--    <bean id="Emp" class="autowire.Emp" autowire="byType"></bean>-->
    <!--根据名称自动装配,要和private  Dept dept;-->
    <bean id="Emp" class="autowire.Emp" autowire="byName">
        <property name="id" value="1"></property>
        <property name="dept" ref="123"></property>
    </bean>
</beans>

7、XML配置引入外部文件

1.直接进行配置Druid数据库连接池
<?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.xsd">
    <bean id="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="${jdbc.driverclass}"></property>
        <property name="url" value="${jdbc.url}"></property>
        <property name="username" value="${jdbc.username}"></property>
        <property name="password" value="${jdbc.password}"></property>
    </bean>
</beans>
2.引入外部属性文件配置数据库连接池

将外部的properties属性文件引入到Spring配置文件中

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
  http://www.springframework.org/schema/beans/spring-beans.xsd
  http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    <!--引入外部属性文件-->
    <context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder>
    <bean id="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="${jdbc.driverclass}"></property>
        <property name="url" value="${jdbc.url}"></property>
        <property name="username" value="${jdbc.username}"></property>
        <property name="password" value="${jdbc.password}"></property>
    </bean>
</beans>
jdbc.driverclass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test
jdbc.username=root
jdbc.password=xxxx

四、IOC操作Bean管理(注解配置)

使用注解的目的是简化XML配置,毕竟XML配置真的挺繁琐的。

一、Spring针对Bean管理中创建对象提供的注解

@Component、@Service、@Controller、@Repository,这四个注解是等价的,都可以创建Bean实例,但是一般写的地方不同
@Component:普通的,不知道写啥就写这个
@Service:Service层(业务逻辑层)
@Controller:用在Controller中(WEB层)
@Repository:用在DAO层

二、基于注解方式实现对象的创建

1、引入依赖

<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>5.2.9.RELEASE</version>
        </dependency>

2、开启组件扫描

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
  http://www.springframework.org/schema/beans/spring-beans.xsd
  http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    <!--开启组件扫描-->
    <context:component-scan base-package="annocation"></context:component-scan>
</beans>

3、创建类

value默认值是类名称,首字母小写,也可以写在上面。

package annocation.service;

import org.springframework.stereotype.Service;
//value等价于 bean中的ID
@Service(value = "orderService")
public class OrderService {
    public void add() {
        System.out.println("OrderService.add");
    }
}

4、注解扫描的细节设置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
  http://www.springframework.org/schema/beans/spring-beans.xsd
  http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    <!--开启组件扫描-->
    <!--use-default-filters="false"表示不使用默认的FILTER,而是自动配置-->
    <context:component-scan base-package="annocation" use-default-filters="false">
        <!--意思是,在annocation只扫描带有Controller注解的类-->
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>
</beans>

5、注解属性的注入

  • @Autowired
    根据属性类型进行自动装配
    @Autowired(required=true),其实默认就是,表示注入的时候,该bean必须存在,否则就会注入失败。
    @Autowired(required=false):表示忽略当前要注入的bean,如果有直接注入,没有跳过,不会报错。
  • @Qualifier
    根据属性名称进行注入,如果要使用,必须和@Autowired一起使用。
  • @Resource
    可以根据类型注入,也可以根据名称注入。
  • @Value
    值类型注入
@Value(value="麟之")
private String name;

6、纯注解开发

1.创建配置类,替换XML的配置文件
import annocation.service.OrderService;

import config.SpringConfig;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class TestDemo {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfig.class);

        OrderService orderService = applicationContext.getBean("OrderService", OrderService.class);
        orderService.add();
    }

package config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration//作为配置类,替换XML文件
@ComponentScan(basePackages = "annocation")//设置扫描路径
public class SpringConfig {

}