SMM框架学习日志——Spring详述

本文详细介绍了Spring框架,包括它的起源、优点、组成和拓展。Spring以其轻量级、非侵入式特性,以及对IOC和AOP的支持,成为Java开发的首选框架。文章深入讲解了IOC理论、依赖注入的各种方式、Spring配置、AOP的实现,以及如何整合Mybatis和声明式事务管理。此外,还探讨了代理模式的重要性和在SpringAOP中的应用。
摘要由CSDN通过智能技术生成

1、Spring5

1.1 简介

  • Spring makes programming Java quicker, easier, and safer for everybody. Spring’s focus on speed, simplicity, and productivity has made it the world’s most popular Java framework.

  • Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架。

  • 2002,首次推出了Spring框架的雏形:interface21框架

  • spring理念:使现在的技术更加简化,解决企业应用开发的复杂性

  • SSH:Struct2+Spring+Hibernate

  • SSH:SpringMVC+Spring+Mybatis

官网:https://docs.spring.io/spring/docs/current/spring-framework-reference/overview.html#overview

官方下载地址:https://repo.spring.io/release/org/springframework/spring/

GitHub:https://github.com/spring-projects/spring-framework

使用Spring需要导入的依赖

<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.2.0.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<!--spring事务-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.2.0.RELEASE</version>
</dependency>

1.2 优点

  • Spring是一个开源的免费的框架(容器)
  • Spring是一个轻量级的、非入侵式的框架
  • 控制反转(IOC),面向切面编程(AOP)
  • 支持事务的处理,对框架整合的支持

总结一点:Spring就是一个轻量级控制反转(IOC),面向切面编程(AOP)的框架

1.3 组成

C:\Users\GAGAY\AppData\Roaming\Typora\typora-user-images\image-20200823133615492.png

1.4 拓展

现代的Java开发,说白了就是基于Spring的开发
在这里插入图片描述

  • SpringBoot
    • 一个快速开发的脚手架
    • 基于SpringBoot可以快速开发某个微服务
    • 约定大于配置
  • SpringCloud
    • SpringCloud是基于SpringBoot实现的

SpringBoot是关键,而要学会SpringBoot的前提就是要掌握Spring和SpringMVC

2、IOC理论

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

依赖注入理解:使用Set方法动态的注入接口,然后将接口具体的实现控制权交给用户,这样程序的耦合性大大降低!程序员也就能更加专注业务层的实现。

个人理解:当Dao层的一个接口包含多个实现类时,在业务层直接调用这些实现类是十分繁琐的,因为随着用户要求增多,改动业务层代码非常麻烦,所以我们可以写一个set方法动态注入dao接口,然后将接口的具体实现交给用户来实现,这样就会简化程序的耦合。

在这里插入图片描述

3、HelloSpring

步骤:

  1. 编写实体类

    package com.xiaojing.pojo;
    
    public class Hello {
         
        private String str;
    
        public void setStr(String str) {
         
            this.str = str;
        }
    
        public String getStr() {
         
            return str;
        }
    
        @Override
        public String toString() {
         
            return "Hello " + str;
        }
    }
    
  2. 配置beans.xml

    <?xml version="1.0" encoding="UTF8"?>
    <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
            https://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <!--
        id:变量名
        class:new的对象
        property:配置属性
        -->
        <bean id="hello" class="com.xiaojing.pojo.Hello">
            <property name="str" value="Spring"/>
        </bean>
        <!--
        ref:在Spring容器里创建好的对象
        value:具体的值
        -->
    </beans>
    
  3. 测试

    ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
    Hello bean = (Hello) context.getBean("hello");
    System.out.println(bean.toString());
    

在整个过程中,hello对象的创建和其属性的设置都由Spring容器来实现

这个过程就叫控制反转:

控制:在传统程序中,对象的创建由程序自身来创建,使用Spring后,对象由Spring容器来创建

反转:程序不创建对象,而是被动的接收对象,即从Spring容器中取出对象

依赖注入:使用set方法来注入

4、IOC创建对象的方式

  1. 默认使用无参构造

  2. 假设需要使用有参构造

    1. 下标赋值

      <!--第一种方法:下标赋值-->
      <constructor-arg index="0" value="张小敬"/>
      
    2. 类型赋值

      <!--第二种方式:(不推荐使用) 类型赋值-->
      <constructor-arg type="java.lang.String" value="张小敬"/>
      
    3. 属性名赋值

      <!--第三种方式:属性名赋值-->
      <constructor-arg name="name" value="张小敬"/>
      

总结:在加载beans.xml文件的时候,对象就已经创建了,我们可以直接在容器里取

5、Spring配置

5.1 bean

  • id:bean的唯一标识符,相当于变量名
  • class:bean对象所对应的类全名
  • name:别名,可以同时取多个别名

5.2 import

使用import将多个beans.xml文件合并为一个,多用于协同开发

6、依赖注入

6.1 构造器注入

IOC创建对象的方式中已说过

6.2 Set方法注入(重点)

  • 依赖:对象的创建依赖Spring容器
  • 注入:对象的属性依赖Spring容器注入

测试一下各种注入方式:

  1. 写一个含多种数据类型的实体类

    public class Address {
         
        private String addr;
        private int code;
    }
    
    public class Student {
         
        private String name;
        private Address addr;
        private String[] books;
        private List<String> hobbies;
        private Map<String,Integer> grades;
        private Set<String> relation;
        private Properties info;
    }
    
  2. 注入方式杂烩

    <bean name="student" class="com.xiaojing.pojo.Student">
        <!--1、普通值注入-->
        <property name="name" value="张小敬"/>
        <!--2、引用对象注入-->
        <property name="addr">
            <bean class="com.xiaojing.pojo.Address">
                <constructor-arg name="addr" value="Sichuan University"/>
                <constructor-arg name="code" value="519"/>
            </bean>
        </property>
        <!--3、数组注入-->
        <property name="books">
            <array value-type="java.lang.String">
                <value>大泼猴</value>
                <value>三体</value>
                <value>剑来</value>
            </array>
        </property>
        <!--4、Map注入-->
        <property name="grades">
            <map>
                <entry key="数学" value="125"/>
                <entry key="语文" value="108"/>
                <entry key="英语" value="132"/>
                <entry key="理综" value="250"/>
            </map>
        </property>
        <!--5、List注入-->
        <property name="hobbies">
            <list>
                <value>打游戏</value>
                <value>听音乐</value>
                <value>看剧</value>
                <value>唱歌</value>
            </list>
        </property>
        <!--6、properties注入-->
        <property name="info">
            <props>
                <prop key="birth">1997-08-17</prop>
                <prop key="height">171</prop>
                <prop key="weight">65</prop>
            </props>
        </property>
        <!--7、set注入-->
        <property name="relation">
            <set>
                <value>parents</value>
                <value>friends</value>
                
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值