Spring-IoC 复习笔记

一、Spring IoC 容器的启动

想要学习 Spring IoC 一定是需要先知道怎么把 Spring 容器启动起来。根据开发环境的不同,Spring IoC 容器的启动方式也不同。

JavaSE 环境下容器的启动方式有三种,分别为:

ClassPathXmlApplicationContext:从 classpath(类的根路径)下加载配置⽂件(推荐使⽤)

FileSystemXmlApplicationContext:从磁盘绝对路径上加载配置⽂件(不推荐)

AnnotationConfigApplicationContext:纯注解模式下启动 Spring 容器

Java Web 环境下容器的启动方式有两种,分别为:

  1. 新纯注解模式下,web.xml 通过加载 Spring 配置文件进行启动
<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>spring-ioc-aop-xml</display-name>

  <!--设置 Spring IoC 配置文件-->
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
  </context-param>

  <!--添加 Spring web 容器启动监听-->
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

</web-app>
  1. 纯注解模式下,webxml 通过加载 Spring 配置类进行启动
<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>spring-ioc-aop-xml</display-name>

  <!--设置 ContextloaderListener 为通过配置类的方式启动 Spring-->
  <context-param>
    <param-name>contextClass</param-name>
    <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
  </context-param>

  <!--设置 Spring IoC 配置文件-->
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>com.idol.Config</param-value>
  </context-param>

  <!--添加 Spring web 容器启动监听-->
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

</web-app>

二、纯 xml 文件方式配置 Spring

通过纯 xml 配置文件实例化 Bean 的方式有三种:

  1. 通过构造函数实例化。该过程,可通过无参、有参构造函数实例化对象,同时可对属性的赋值。需要注意的是:如果多个对象都通过有参构造函数实例化对象,且彼此依赖。这种循环依赖问题的出现会导致对象初始化失败。
  2. 通过静态方法实例化。
  3. 通过实例化方法实例化。
<?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="employeeDao" class="com.idol.dao.impl.EmployeeDao"></bean>

    <bean id="employee" class="com.idol.pojo.Employee">
        <!--为属性设置默认值。 注意:通过 xml 为属性赋值时,被赋值的属性必须有 set 方法-->
        <property name="name" value="Tom"/>
    </bean>

    <bean id="company" class="com.idol.pojo.Company">
        <!--当属性的类型为对象引用时,我们可以使用 ref 属性,来为对象赋值-->
        <property name="boss" ref="employee"/>
    </bean>

    <!--实例化非空构造函数对象。 注意:实例化多个非空构造函数对象时,如果产生循环引用,则会倒导致系统错误!-->
    <bean id="employeeService" class="com.idol.service.impl.EmployeeService">
        <!--为构造函数中的对象引用赋值-->
        <constructor-arg name="employeeDao" ref="employeeDao"/>
    </bean>

    <!-- 多参数构造函数实例化对象 -->
    <bean id="constructorParameterBean" class="com.idol.pojo.ConstructorParameterBean">
        <!--通过参数索引赋值-->
        <constructor-arg index="0" value="有惨构造测试"/>
        <!--通过参数名赋值-->
        <constructor-arg name="myArray">
            <!--为数组类型赋值-->
            <array>
                <value>嘿嘿嘿</value>
                <value>哈哈哈</value>
                <value>嘻嘻嘻</value>
            </array>
        </constructor-arg>
        <!--为 List 赋值-->
        <property name="myList">
            <list>
                <value>唧唧唧</value>
                <value>嘎嘎嘎</value>
            </list>
        </property>
        <!--为 Map 添加引用类型的值-->
        <property name="myMap">
            <map>
                <entry key="employee" value-ref="employee"></entry>
                <entry key="company" value-ref="company"></entry>
            </map>
        </property>

        <!--为 Set 类型赋值-->
        <property name="mySet">
            <set>
                <value>aaa</value>
                <value>bbb</value>
            </set>
        </property>

        <!--为 Properties 类型赋值-->
        <property name="myProperties">
            <props>
                <prop key="ccc">ccc</prop>
                <prop key="ddd">ddd</prop>
            </props>
        </property>
    </bean>


    <!--  ↓↓↓↓  Bean 的实例化方式(二):通过静态方法实例化  ↓↓↓↓  -->
    <bean id="staticMethodInitObject" class="com.idol.pojo.StaticMethodInitObject" factory-method="getInstance"></bean>


    <!--  ↓↓↓↓  Bean 的实例化方式(三):通过实例化方法获取 Bean  ↓↓↓↓  -->
    <bean id="employeeBeanFactory" class="com.idol.pojo.EmployeeBeanFactory"></bean>
    <bean id="createdByFactroyEmployee" factory-bean="employeeBeanFactory" factory-method="createEmployeeBean"/>


    <!--  ↓↓↓↓  Bean 声明周期配置(默认 scope 为单例模式)  ↓↓↓↓  -->
    <bean id="prototypeScopeBean" class="com.idol.pojo.PrototypeScopeBean" scope="prototype"/>


    <!--  ↓↓↓↓  Spring 初始化与销毁 Bean 回调  ↓↓↓↓  -->
    <bean id="initMethodAndDestoryMethodBean" class="com.idol.pojo.InitMethodAndDestoryMethodBean" init-method="initCallBack" destroy-method="destoryCallBack"/>

</beans>

三、xml 与 注解相结合配置 Spring

  1. xml 与注解相结合的方式是企业级开发中经常会用到的方式。我们通常将来自第三方的对象通过 xml 的方式进行加载。而自定义的对象则通过注解的方式就行加载。
  2. 为了能添加了注解的定义的类进行加载,需要在 Spring 配置文件中开启包扫描。
  3. AOP 和声明式事务的相关内容通常也会被添加在 Spring 配置文件中。

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans  xmlns="http://www.springframework.org/schema/beans"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd
">

    <!--开启注解扫描,base-package指定扫描的包路径-->
    <context:component-scan base-package="com.idol"/>

    <!--引入外部资源文件-->
    <context:property-placeholder location="classpath:jdbc.properties"/>

    <!--第三方jar中的bean定义在xml中-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="${jdbc.driver}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>

</beans>

四、纯注解方式配置 Spring

随着 Spring Boot 的流行,纯注解的开发方式也变的更加流行。具体的注解用法就不做赘述,说一下需要注意的点:

  1. 如果同一个接口下存在多个实现类,则必须在实现类的注解中为该类设置别名。且在通过 @Autowired 注入该对象时,配合 @Qualifier("employeeDao1") 注解使用。
  2. 通过 @Bean 注解加载进 Spring 容器中的对象,如果想通过对象类名首字母小写的方式从 ApplicationContext 中获取对象,则必须在注解中为该类设置别名。
  3. 如果有多个 @Configuration 配置类,则可通过 @Import 注解汇集到一个配置对象中。

源码

源码下载

------------------------- 靡不有初 鲜克有终 -------------------------

猜你喜欢

转载自blog.csdn.net/Supreme_Sir/article/details/109165058