Spring学习笔记(持续更新...

SpringIOC

  • IOC: Inverse of Control 控制反转

    • 将原本在程序中手动创建 UserService 对象的控制权交由 Spring 框架管理。

      <!--UserService 的创建权交给了 Spring-->
      <bean id="userService" class="com.mizhitian.ioc.demo1.UserServiceImpl"> </bean>
      
    • 创建 UserService 对象控制权被反转到了 Spring 框架

  • DI: Dependency Injection 依赖注入

    • 在 Spring 创建这个对象的过程中,将则个对象所依赖的属性注入进去

      <!--UserService 的创建权交给了 Spring-->
      <bean id="userService" class="com.mizhitian.ioc.demo1.UserServiceImpl">
          <!-- 设置属性,DI依赖注入 -->
          <property name="name" value="李四"/>
      </bean>
      

Spring 工厂类 -- ApplicationContext

  • 无论你有没有调用该类的对象,加载配置文件的时候就将配置文件中所有单例模式生成的类实例化
  • 实现类
    • ClassPathXmlApplicationContex
      • 加载类路径下的配置文件
    • FileSystemXmlApplicationContext
      • 加载文件系统中的配置文件
  • 老版本的工厂类 --- BeanFactory

Spring的Bean管理

-- XML方式

  • 三种实例化 Bean 的方式

    • 使用类构造器实例化 -- 默认无参

      package com.mizhitian.ioc.demo2;
      public class Bean1 {
          public Bean1() {
              System.out.println("Bean1被创建了...");
          }
      }
      
      
      <!--第一种,无参构造器-->
      <bean id="bean1" class="com.mizhitian.ioc.demo2.Bean1"></bean>
      

      测试:

          @Test
          /**
           * 无参构造器实例化 Bean
           */
          public void demo1() {
      		//加载类路径下的配置文件就,创建 Spring 工厂
              ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
      		//通过工厂获得类的实例
              Bean1 bean1 = (Bean1) applicationContext.getBean("bean1");
          }
      
      
    • 使用静态工厂方法实例化 -- 简单工厂模式

      package com.mizhitian.ioc.demo2;
      
      public class Bean2Factory {
      
          public static Bean2 createBean2() {
              System.out.println("Bean2Factory的方法已经执行了。");
              return new Bean2();
          }
      }
      
      package com.mizhitian.ioc.demo2;
      
      public class Bean2 {
          
      }
      
      <!--第二种,静态工厂-->
      <bean id="bean2" class="com.mizhitian.ioc.demo2.Bean2Factory" factory-method="createBean2"></bean>
      

      测试:

          @Test
          /**
           * 静态工厂实例化 Bean
           */
          public void demo2() {
      //        创建工厂
              ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
              Bean2 bean2 = (Bean2) applicationContext.getBean("bean2");
          }
      
      
    • 使用实例工厂方法实例化 -- 工厂方法模式

      package com.mizhitian.ioc.demo2;
      //Bean3类的实例工厂
      public class Bean3Factory {
          public Bean3 createBean3() {
              System.out.println("Bean3Factory执行了...");
              return new Bean3();
          }
      }
      
      
      package com.mizhitian.ioc.demo2;
      
      public class Bean3 {
      
      }
      
      
      <!--第三种,实例工厂,非静态-->
      <bean id="bean3Factory" class="com.mizhitian.ioc.demo2.Bean3Factory"></bean>
      <bean id="bean3" factory-bean="bean3Factory" factory-method="createBean3"></bean>
      
      

      测试:

          @Test
          /**
           * 实例工厂,非静态方法实例化 Bean
           */
          public void demo3() {
      //        创建工厂
              ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
      //        通过容器获取 id 为 bean3 的实例化对象
              Bean3 bean3 = (Bean3) applicationContext.getBean("bean3");
          }
      

Spring 容器中 Bean 的配置

  • id 和 name

    • 一般情况下,装配一个 Bean 时,通过指定一个 id 属性作为 Bean 的名称
    • id 属性在 IOC 容器中必须是唯一的
    • name 值可以包含特殊字符
  • Bean 的作用域

    • singleton 单例模式

      • 在IOC 容器中仅存在一个 Bean 实例
          static String path = "applicationContext.xml";
      
          @Test
          public void demo1() {
              ApplicationContext applicationContext = new ClassPathXmlApplicationContext(path);
              Person person1 = (Person) applicationContext.getBean("person");
              Person person2 = (Person) applicationContext.getBean("person");
              System.out.println("======默认情况下是单例模式======");
              System.out.println(person1);
              System.out.println(person2);
          }
      /*
      output:
      ======默认情况下是单例模式======
      com.mizhitian.ioc.demo3.Person@612679d6
      com.mizhitian.ioc.demo3.Person@612679d6
      */
      

      显然 person1 和 person2 是同一个对象。

    • prototype

      • 每次调用个 getBean() 都会返回一个新的实例
          static String path = "applicationContext.xml";
      	@Test
          public void demo2() {
              ApplicationContext applicationContext = new ClassPathXmlApplicationContext(path);
              Person person1 = (Person) applicationContext.getBean("person2");
              Person person2 = (Person) applicationContext.getBean("person2");
              System.out.println("====== prototype 多例模式 ======");
              System.out.println(person1);
              System.out.println(person2);
          }
      
      /*
      output:
      ====== prototype 多例模式 ======
      com.mizhitian.ioc.demo3.Person@612679d6
      com.mizhitian.ioc.demo3.Person@11758f2a
      */
      

      显然 person1 和 person2 是两个不同的对象。

    • request

      • 每次 HTTP 请求都会创建一个新的 Bean,该作用域仅适用于 WebApplicationContext 环境
    • session

      • 同一个 HTTP Session 共享一个 Bean,不同的 HTTP Session 使用不同的 Bean。该作用域仅适用于 WebApplicationContext 环境。
posted @ 2021-01-30 20:20  海绵698  阅读(34)  评论(0)    收藏  举报