Java阶段二Day13

Java阶段二Day13

今天开始是学习后端框架SSM(Spring、SpringMVC、MyBatis)

网站

  • 前端:页面的展示(美丽的外表)
  • 后端:功能的展示(实际的业务)

Spring

  • 本质来讲是一种生态,一个家族,其下有许多子框架(SpringFramework、SpringBoot、SpringCloud…)基于项目的复杂度、不同功能的要求拆分不同的子框架,每个框架都有独特的作用。

  • 如:

    • SpringFramework:整个Spring家族里面的,最核心的、偏底层的工程(本质上SSM中第一个S说的是 SpringFramework)
    • SpringBoot:可以快速搭建项目的集成环境、解决依赖关系
  • 注意:SpringMVC是 SpringFramework的子工程

  • 具体详情可参考官方文档:Spring官方文档

SpringFramework

Spring指的是Spring Framework,通常我们称之为Spring框架。Spring框架是一个分层的面向切面的Java应用程序的一站式解决框架,它是Spring技术栈的核心和基础,是为了解决企业级引用开发的复杂性而创建的。

核心模块

  • IoC:Inverse of Control的简写,为 控制反转,指把创建对象交给Spring进行管理。
  • AOP:Aspect Oriented Programming 的简写,为 面向切面编程。AOP用来封装多个类的公共行为,将那些与业务无关,却为业务模块共同调用的逻辑封装起来,减少系统的重复代码,降低模块间的耦合度。另外,AOP还解决一些系统层面上的问题,比如日志、事务、权限等。

特点

  • 控制反转:IoC,反转资源获取方向;把自己创建的资源、向环境索取资源变为环境将资源准备好,我们享受资源注入。
  • 面向切面编程:AOP,在不修改源代码的基础上增强代码功能。
  • 容器:Spring IoC是一个容器,因为它包含并管理组件对象的生命周期;组件享受到了容器化的管理,替程序员屏蔽了组件创建过程中的大量细节,极大降低了使用门槛,大幅度提高了开发效率。
  • 一站式:在IOC和AOP的基础上可以整合各种企业应用的开源框架和优秀的第三方库,而且在Spring旗下的项目已经覆盖了广泛领域,很多方面的功能性需求可以在Spring Framework 的基础上全部使用Spring来实现。

使用Spring创建项目

  • 在pom.xml中,引入spring相关依赖

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.3.24</version>
    </dependency>
    
  • 创建类,创建属性和方法

    package com.liner.spring.begin;
    
    public class User {
        private String username;
    
        // 无参构造
        public User(){
            System.out.println("0:无参构造执行了~~~");
        }
    
        public void add(){
            System.out.println("HelloWorld");
        }
    }
    
  • resources中,通过xml配置文件,告知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"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <bean id="user" class="com.liner.spring.begin.User"></bean>
    
    </beans>
    
  • 进行测试

    package com.liner.spring.begin;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class UserTest {
    
        public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
            /**
             方式1:通过spring创建 java bean 对象
             1.加载spring配置文件(bean.xml)
             2.获取spring创建好的对象
             3.打印测试(调add方法)
             */
            ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
            User user = (User) context.getBean("user");
            System.out.println("user = " + user);
            user.add();
    
            /** 方式2:new方式创建java对象 */
            User user2 = new User();
            System.out.println("user2 = " + user2);
            user2.add();
    
            //spring的底层是通过反射的方式
            /** 方式3:反射方式创建java对象   
             1.获取class对象
             2.调用方法进行创建
             */
            Class zz = Class.forName("com.liner.spring.begin.User");
            User user3 = (User) zz.newInstance();
            System.out.println("user3 = " + user3);
            user3.add();
        }
    }
    

对象存储

存放到容器中,查看源码,DefaultListableBeanFactory.java,第164行,可以查看 BeanDefinition 的源码,有类的描述信息,是否初始化的状态等等
在这里插入图片描述

  • key:唯一标识
  • value:类的定义(描述信息)

创建对象的方式

  • new方式创建
  • 反射方式创建
  • 交给spring来创建

IoC容器

  • IoC 是 Inversion of Control 的简写,译为 控制反转
  • Spring通过IoC容器来管理所有的Java对象的实例化和初始化,控制着对象与对象之间的依赖关系。我们将由IoC容器管理的Java对象成为 Spring Bean,它与使用关键字 new 创建的Java对象没有任何区别。
  • IoC容器是Spring框架中最重要的核心组件之一,它贯穿了Spring从诞生到成长的整个过程

控制反转

  • 控制反转是一种思想
    • 对象的创建权利交出去,交给第三方容器负责
    • 对象和对象之间的关系维护权交出去,交给第三方容器负责
  • 通过依赖注入 DI 的方式实现

依赖注入

  • DI (Dependency Injection):依赖注入,依赖注入实现了控制反转的思想,是指Spring创建对象的过程中,将对象依赖属性通过配置进行注入
  • 依赖注入常见的实现方式有两种:set注入构造器注入
  • 所以 IoC 是一种控制反转的思想,而 DI 是对IoC的一种具体实现

IoC容器的实现

在这里插入图片描述

  • BeanFactory:这是IoC容器的基本实现,是Spring内部使用的接口。面向Spring本身,不提供给开发人员使用。

  • ApplicationContextBeanFactory的子接口,提供了更多高级特性,面向Spring的使用者,几乎所有场合都使用ApplicationContext,而不是底层的BeanFactory

  • ApplicationContext的主要实现类:

    类型 说明
    ClassPathXmlApplicationContext 通过读取类路径下的xml格式配置文件创建IoC容器对象
    FileSystemApplicationContext 通过文件系统路径读取xml格式配置文件创建IoC容器对象

基于XML管理bean

获取bean方式

  • 通过id获取:context.getBean(“id属性值”)
  • 通过类型获取:context.getBean(类名.class)
  • 通过id类型获取:context.getBean(“id属性值”, 类名.class) 【为了精准常用此方法获取bean】

注意:当根据类型获取bean时,要求IoC容器中指定类型的bean只能有一个,当配置两个时会抛出异常:NoUniqueBeanDefinitionException: expected single matching bean but found 2: studentImp1,studentImp2
在这里插入图片描述

xml配置文件中的标签

  • bean标签,主要是创建java bean对象

    <bean id = "xxx" class = "xxx.xxx.xxx"></bean>
    
  • property标签,通过set方法注入属性值

    <property name = "" value = ""></property>
    
  • constructor-arg标签,通过构造器注入属性值

    <constructor-arg name = "" value = ""></constructor-arg>
    

特殊值处理注入

  • 字面量赋值:

    <!-- 使用value属性给bean的属性赋值时,spring会把value的属性值看作是字面量 -->
    <property name="number" value="1016"></property>
    
  • null值:

    <null></null>
    
  • xml实体:

    < > 在XML文档中具有特殊含义,在注入属性值时不能够随便使用,用XML实体 &lt&gt 来代替

    <constructor-arg name="description" value="&lt;真好看啊电影&gt;"></constructor-arg>
    
  • CDATA区:

    CDATA区,是xml中一种特有的写法,在CDATA区中可以包含特殊符号表示方式:<![CDATA[内容]]> ,在内容区域可以存放普通字符和特殊符号

    <constructor-arg name="description">
        <!-- CDATA区存放数据,可通过 CD + Tab键自动补全格式 -->
        <value><![CDATA[<真好看啊>]]></value>
    </constructor-arg>
    
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇

)">
下一篇>>