概述

  • 轻量级开源JavaEE框架,解决企业开发复杂性
  • 两个核心部分
    • IOC:控制反转,把创建对象过程交给Spring进行管理
    • AOP:面向切面,不修改源代码进行功能增强
  • 特点:方便解耦,简化开发、Aop编程支持、方便程序测试、方便和其他框架整合、降低Api使用难度、方便进行事物操作

image.png

IOC

基础概念、底层原理

  • 控制反转,把对象创建和对象之间的调用过程,交给Spring进行管理
  • 目的是可以降低耦合度
  • 底层原理用到xml解析、工厂设计模式、反射
  • 实现过程就是在工厂模式代码中 先对xml配置文件解析,获得class属性值,再通过反射创建对象,返回出去
  • IOC容器 本质就是一个对象工厂

    接口

    Spring提供IOC容器实现两种方式

  • BeanFactory:IOC容器基本实现,Spring内部使用接口,不提供开发人员进行使用

  • ApplicationContext:是BeanFactory接口的子接口,提供更多功能,由开发人员使用
  • 两个接口的区别是:
    • 两个接口都可以实现加载配置文件,创建对象,BeanFactory加载配置文件时不会创造对象,在获取对象时创建(用时创建);ApplicationContext加载配置文件时,就会将加载的配置文件中的对象创建。
    • ApplicationContext接口的逻辑是将耗时耗资源的过程放在服务器启动时执行
  • ApplicationContext子接口的主要实现类

    • FileSyetemXmlApplicationContext:文件路径
    • ClassPathXmlApplicationContext:类路径

      操作Bean管理(基于xml)

      Spring创建对象

      1. <bean id="user" class="com.bomb.spring5.User"></bean>
  • bean标签的属性 | 属性名 | 作用 | | —- | —- | | id | 唯一标识 | | class | 类全路径(包类路径) |

  • 创建对象,默认执行无参构造方法

    Spring属性注入

    注入方式分类

    1. <bean id="book" class="com.bomb.spring5.Book">
    2. <property name="bname" value="骆驼祥子"></property>
    3. <property name="bauthor" value="鲁迅"></property>
    4. </bean>
    1. <bean id="orders" class="com.bomb.spring5.Orders">
    2. <constructor-arg name="oname" value="电脑"></constructor-arg>
    3. <constructor-arg name="address" value="China"></constructor-arg>
    4. </bean>
    1. <!--可以简化基于xml配置方式-->
    2. <!--添加p名称空间在配置文件中-->
    3. <!--底层依然是set方法注入逻辑-->
    4. <beans xmlns="http://www.springframework.org/schema/beans"
    5. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    6. xmlns:p="http://www.springframework.org/schema/p"
    7. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    8. <bean id="book" class="com.bomb.spring5.Book" p:bname="丰乳肥臀" p:author="莫言"></bean>
    9. </beans>

    注入其他类型属性

    1. <property name="adress"><null/></property>
    1. <property name="adress">
    2. <value><![CDATA[<<包含特殊符号内容>>]]></value>
    3. </property>

    注入bean

    1. <bean id="userService" class="com.bomb.spring5.UserService">
    2. <!--注入userDao对象
    3. name属性:类里面属性名称
    4. ref属性:创建userDao对象bean标签id值
    5. -->
    6. <property name="userDao" ref="userDaoImpl"></property>
    7. </bean>
    8. <bean id="userDaoImpl" class="com.bomb.spring5.UserDaoImpl"></bean>
    1. <bean id="emp" class="com.bomb.spring5.bean.Emp">
    2. <!--设置两个普通属性-->
    3. <property name="ename" value="lucy"></property>
    4. <property name="gender" value="女"></property>
    5. <!--设置对象类型属性-->
    6. <bean id="dept" class="com.bomb.spring5.bean.Dept">
    7. <property name="dname" value="软件室"></property>
    8. </bean>
    9. </bean>
    1. <!--写法一,类外部bean方式-->
    2. <bean id="emp" class="com.bomb.spring5.bean.Emp">
    3. <!--设置两个普通属性-->
    4. <property name="ename" value="lucy"></property>
    5. <property name="gender" value="女"></property>
    6. <!--级联赋值-->
    7. <property name="dept" ref="dept"></property>
    8. </bean>
    9. <bean id="dept" class="com.bomb.spring5.bean.Dept">
    10. <property name="dname" value="软件室"></property>
    11. </bean>
    12. <!--写法二,需要在Emp类中设置get方法-->
    13. <bean id="emp" class="com.bomb.spring5.bean.Emp">
    14. <!--设置两个普通属性-->
    15. <property name="ename" value="lucy"></property>
    16. <property name="gender" value="女"></property>
    17. <!--级联赋值-->
    18. <property name="dept" ref="dept"></property>
    19. <property name="dept.dname" value="技术部"></property>
    20. </bean>
    21. <bean id="dept" class="com.bomb.spring5.bean.Dept">
    22. <property name="dname" value="软件室"></property>
    23. </bean>

    注入集合属性

    操作Bean管理(基于注解)