Spring个人概述,核心配置文件(.xml)里的bean标签什么时候被实例化,获取对象的两种方式,Bean的范围说明,beans.xml就是spring框架提供的容器(管理Bean Bean就是对象 必须通过类 类必须可能进行实例化)

源码获取github

1.Spring个人概述

  • Spring是轻量级别开源的框架(重量级别EJB),解决并发也比较优秀

  • 重点:Spring是一个 IoC(DI) 和 AOP 的 容器框架(JAVAEE框架的集合):它主要是管理Bean的生命周期使用

    XML完成对Bean的实例化

    注解也是完成对Bean的实例化操作

  • Spring是一站式服务

    • 什么是IoC?

    • 控制反转:控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。

    • 注入方式:https://zhidao.baidu.com/question/489516951.html

    • 举例子说明控制反转

    和尚是一个编剧写剧本,当我写该剧本的时候,我并不需要考虑谁合适演,但是我应该有权利决定谁来演
    导演出现,编剧将选人物的权利移交出去,控制权移交出去
    出品人出现,导演将选人物的权利移交出去,控制权移交出去
    点餐
    最开始:自己去食堂,自己去打菜,自己吃
    外卖出现:只是需要发送一个请求告知外卖小哥,我想吃什么,那么外卖小哥为我们服务,将需要的菜取回来给我们品尝
    java体现
    容器框架(Bean的生命周期创建 使用 销毁)
    管理Bean,也就是创建对象(也就是注入)(就不用我们自己new创建对象了)

2.项目结构

3.Spring环境搭建

框架流程都是:先找jar包=>入口文件(核心配置文件beans.xml官方推荐的名字是applicationContext.xml)=>使用API调用过程=>测试

4.jar包

pom.xml加入依赖

<dependencies>
  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
  </dependency>

  <!-- https://mvnrepository.com/artifact/org.springframework/spring-aop -->
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aop</artifactId>
    <version>4.3.6.RELEASE</version>
  </dependency>
  <!-- https://mvnrepository.com/artifact/org.springframework/spring-aspects -->
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aspects</artifactId>
    <version>4.3.6.RELEASE</version>
  </dependency>
  <!-- https://mvnrepository.com/artifact/org.springframework/spring-beans -->
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-beans</artifactId>
    <version>4.3.6.RELEASE</version>
  </dependency>
  <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>4.3.6.RELEASE</version>
  </dependency>
  <!-- https://mvnrepository.com/artifact/org.springframework/spring-context-support -->
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>4.3.6.RELEASE</version>
  </dependency>
  <!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>4.3.6.RELEASE</version>
  </dependency>
  <!-- https://mvnrepository.com/artifact/org.springframework/spring-expression -->
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-expression</artifactId>
    <version>4.3.6.RELEASE</version>
  </dependency>
  <!-- https://mvnrepository.com/artifact/org.springframework/spring-tx -->
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
    <version>4.3.6.RELEASE</version>
  </dependency>

</dependencies>

5.核心配置文件(入口)

User.java

package com.hs.model;

public class User {

   private String user_name;
   private Integer user_id;


   public String getUser_name() {
      return user_name;
   }

   public void setUser_name(String user_name) {
      this.user_name = user_name;
   }

   public Integer getUser_id() {
      return user_id;
   }

   public void setUser_id(Integer user_id) {
      this.user_id = user_id;
   }
}

beans.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">
   <!--beans.xml就是spring框架提供的容器-->
   <!--管理Bean Bean就是对象 必须通过类 类必须可能进行实例化-->
   <!--下面那个代码相当于 java代码 HashMap map1 = new HashMap(); HashMapjava内置的类 -->
   <!--<bean id="map1" class="java.util.HashMap"></bean>-->

   <!--static User u1 = new User();只有一个new对象,Bean的范围说明——scope="singleton"默认为单例模式,scope可以不用写-->
   <bean id="u1" class="com.hs.model.User" scope="singleton"/>
   <!--User u2 = new User(); prototype多例模式,需要对象就new一个,每个不同-->
   <bean id="u2" class="com.hs.model.User" scope="prototype"/>
</beans>

6.使用API调用过程

获取对象两种方式:

User user = (User) ac.getBean("u1");
User user = ac.getBean("u1", User.class);

ObjectTest.java

读取核心配置文件 == 发现了Bean标签就会对class对应的类进行实例化操作

ApplicationContext ac = new ClassPathXmlApplicationContext(“beans.xml”);

/** * 同一个类的实例化对象比较 */
   @Test
   public void test01() {
// 1.读取核心配置文件 == 发现了Bean标签就会对class对应的类进行实例化操作
      ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
// u1就是bean标签里的id的名字
      User user1 = ac.getBean("u1", User.class);
      User user2 = ac.getBean("u2", User.class);
      System.out.println(user1);
      System.out.println(user2);
      System.out.println(user1==user2);   //false
      System.out.println(user1.equals(user2));    //false
   }

7.bean的范围说明

ObjectTest.java

/** * Bean的范围说明——默认为单例模式 */
   @Test
   public void test02() {
// 1.读取核心配置文件 == 发现了Bean标签就会对class对应的类进行实例化操作
      ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");

      User user1 = ac.getBean("u1", User.class);
      User user2 = ac.getBean("u1", User.class);
      System.out.println(user1);
      System.out.println(user2);
      System.out.println(user1==user2);   //true
      System.out.println(user1.equals(user2));    //true
   }

   /** * Bean的范围说明——设置多例模式 */
   @Test
   public void test03() {
// 1.读取核心配置文件 == 发现了Bean标签就会对class对应的类进行实例化操作
      ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");

      User user1 = ac.getBean("u2", User.class);
      User user2 = ac.getBean("u2", User.class);
      System.out.println(user1);
      System.out.println(user2);
      System.out.println(user1==user2);   //false
      System.out.println(user1.equals(user2));    //false
   }