spring5学习记录

2021-4-13:Spring5
一:Spring简介
可能用到的包:
在这里插入图片描述

<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.3.5</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.3.5</version>
</dependency>

二:Spring优点

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

总结:是一个轻量级控制反转和面向切面编程的框架

**
三:Spring的组成
Spring7大模块
学习路线:
构建,协调,连接
SpringBoot->SpringCloud->SpringCloudDataFlow
SpringBoot:
一个快速开发的脚手架;
基于其可以快速开发单个微服务;
约定大于配置
SpringCloud:
是基于SpringBoot实现的

需要掌握Spring+SpringMVC

IOC理论推导:
1:UserDao接口
2:UserDaoImpl实现类
3:UserService业务接口
4:UserServiceImpl业务实现类
传统的写法:
创建maven项目:
在这里插入图片描述
在这里插入图片描述

导入jar包,删除src
在这里插入图片描述
新建子模块:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
jar包导入情况如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在dao层接口类写方法:
在这里插入图片描述
在其实现类里面实现方法:
在这里插入图片描述
在业务层写上方法:
在这里插入图片描述
在其实现类实现方法并且引入dao层:
在这里插入图片描述
写测试类进行测试:
在这里插入图片描述
运行结果如下:
在这里插入图片描述
若在dao层增加一个实现类:
在这里插入图片描述
用户如果想使用,则必须修改业务层:
在这里插入图片描述
在这里插入图片描述
若用户请求继续更改:增加实现类
在这里插入图片描述
还需要继续修改业务层:
在这里插入图片描述
最后 运行结果如下:
在这里插入图片描述
在之前的业务中,用户的需要可能会影响我们原来的代码,我们需要根据用户的需要来修改原来的代码。这样会破坏程序的完整性
在这里插入图片描述

 private UserDao userDao;

    /*以下利用set进行动态实现值的注入*/

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

我们使用一个set接口实现,就发生了变化:
之前,程序时主动创建对象,控制权在程序员手上;
使用了set注入以后,程序不再具有主动性,而是变成了被动的接受对象。
在这里插入图片描述
在这里插入图片描述
若再增加实现类,也不需要修改业务层,而是调用即可:
在这里插入图片描述
在这里插入图片描述

好处:这种思想,从本质上解决了问题,我们不用再去管理对象的创建,系统的耦合性大大降低,可以更加专注的在业务的实现上,这就是IoC的原型。
在这里插入图片描述
IoC的本质:
是一种设计 思想 ,DI(依赖注入)是实现IoC的一种方式
在这里插入图片描述
在这里插入图片描述
书写HelloSpring:
新建子模块:
在这里插入图片描述
在子模块编写实体类:
在这里插入图片描述

public class Hello {
    private String str;
    }

新建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">
    <!--使用Spring来 创建对象,在Spring这些都称为Bean-->
    <bean id="hello" class="com.cxq.pojo.Hello">
        <property name="str" value="Spring"/>
    </bean>

</beans>

在这里插入图片描述
思考问题:
Hello对象的创建者:Spring
Hello对象的属性设置者:Spring容器
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如修改 spring-01-ioc的方法:
在这里插入图片描述
修改 代码:
在这里插入图片描述
为:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
4:IoC创建对象的方式
在这里插入图片描述
在这里插入图片描述
将类注册到bean里面:
在这里插入图片描述
在这里插入图片描述
这是一个调试程序的方法:
在这里插入图片描述
在这里插入图片描述
1:使用无参构造方法创建对象,是默认方式!
2:使用有参构造方法创建对象,分别是:
下标赋值 类型赋值 参数名赋值
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
总结:在配置文件加载的时候,容器中管理的对象就已经初始化了!
5:Spring配置
5.1:别名
如果添加了别名,我们也可以使用别名获取到这个对象
在这里插入图片描述
在这里插入图片描述

  <alias name="user" alias="userName"/>

新建实体类,以及生成有参构造函数和set方法,可一个自己写的show方法:

public class UserT {
    private String name;

    public UserT(String name) {
        this.name = name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void show(){
        System.out.println("name="+name);
    }
}

在bean里面进行装配:
在这里插入图片描述

在这里插入图片描述

5.2:Bean的配置

  <!--
    id:bean的唯一标识符,也就是相当于我们学的对象名
    class:bean对象所对应的全限定名:包名+类名
    name:也是别名,而且name可以取多个别名
    -->
    <bean id="userT" class="com.cxq.pojo.UserT" name="user2,u2,u3">
        <constructor-arg name="name" value="常晓建"/>
    </bean>

通过不同的别名也可以跑起来
在这里插入图片描述

5.3:import
这个,一般用于团队开发使用,他可以将多个配置文件,导入合并为一个。
即:假如现在项目中有多个人开发,这三个人负责不同的类开发,不同的类需要注册在不同的bean中,我们可以利用import将所有人的beans.xml文件合并为一个总的文件。使用的时候,直接使用总的配置就可以了。
在这里插入图片描述
applicationContext.xml

 <import resource="beans.xml"/>
    <import resource="beans2.xml"/>
    <import resource="beans3.xml"/>

6:DI(依赖注入)
6.1:构造器注入
6.2:set方式注入(重点)
依赖注入:set注入
什么是依赖,依赖什么东西?
答案是:bean对象的创建依赖于容器
什么是注入,注入什么东西?
答案是:bean对象中的所有属性,由容器来注入
【环境搭建】:
1:复杂类型

public class Address {
    /*来一个地址属性,以及get  set方法*/
    private String address;
    }

2:真实测试对象

public class Student {
    /*基本类型name 通过value赋值*/
    private String name;
    /*引用类型address 通过ref赋值*/
    private Address address;
    /*数组类型books */
    private String[] books;
    /*List集合类型*/
    private List<String> hobbys;
    private Map<String,String> card;
    private Set<String> games;
    /*空指针*/
    private String wife;
    private Properties info;
    }

在这里插入图片描述
在这里插入图片描述
第一步:创建两个实体类:学生类和地址类,学生类需要注入很多方法
在这里插入图片描述

public class Address {
    /*来一个地址属性,以及get  set方法*/
    private String address;

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}
public class Student {
    /*基本类型name 通过value赋值*/
    private String name;
    /*引用类型address 通过ref赋值*/
    private Address address;
    /*数组类型books */
    private String[] books;
    /*List集合类型*/
    private List<String> hobbys;
    private Map<String,String> card;
    private Set<String> games;
    /*空指针*/
    private String wife;
    private Properties info;
    }
    省略get set tostring方法

第二步:beans.xml配置文件,使用bean去创建对象
在这里插入图片描述

    <bean id="student" class="com.cxq.pojo.Student">
        <!--第一种:普通值注入,直接使用value类型就可以-->
        <property name="name" value="常晓倩"/>
    </bean>

默认无参构造函数注入

第三步:测试类
在这里插入图片描述
拆分窗口,方便操作:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
将address的toString方法修改为address.tostring
在这里插入图片描述
测试:正确,所有的值注入成功(binggo)
在这里插入图片描述
在这里插入图片描述
成功:
在这里插入图片描述
完善注入信息的代码:

<!--引用类型,在此处声明,在下面注入-->
    <bean id="address" class="com.cxq.pojo.Address">
        <property name="address" value="西安"/>
    </bean>
    <bean id="student" class="com.cxq.pojo.Student">
        <!--第一种:普通值注入,直接使用value类型就可以-->
        <property name="name" value="常晓倩"/>
        <!--第二种:Bean注入,使用ref-->
        <property name="address" ref="address"/>
        <!--数组注入:array-->
        <property name="books">
            <array>
                <value>红楼梦</value>
                <value>水浒传</value>
                <value>西游记</value>
                <value>三国演义</value>
            </array>
        </property>
        <!--List集合注入:list-->
        <property name="hobbys">
            <list>
                <value>听歌</value>
                <value>看电影</value>
                <value>运动</value>
                <value>敲代码</value>
            </list>
        </property>
        <!--Map集合:map->entry(key value)-->
        <property name="card">
            <map>
                <entry key="身份证" value="123456789"/>
                <entry key="银行卡" value="987654321"/>
            </map>
        </property>
        <!--Set:set->value-->
        <property name="games">
            <set>
                <value>LOL</value>
                <value>BOB</value>
                <value>COC</value>
            </set>
        </property>
        <!--null注入->null-->
        <property name="wife">
            <null/>
        </property>
        <!--Properties注入:props->prop(key)-->
        <property name="info">
            <props>
                <prop key="username">晓倩</prop>
                <prop key="password">123</prop>
            </props>
        </property>
    </bean>

6.3:拓展方式注入
1:p命名空间(对应set注入)
在这里插入图片描述
在这里插入图片描述
在外面导入junit的包,进行测试时候使用
在这里插入图片描述

<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.13.2</version>
    <scope>test</scope>
</dependency>

在这里插入图片描述
在这里插入图片描述

2:c命名空间(对应构造器注入)
第一步:导入c命名空间

xmlns:c="http://www.springframework.org/schema/c"

使用之前需要在实体类里面加入有参数和无参数的构造器方法
在这里插入图片描述

  public User() {
    }

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

在配置文件中使用c命名空间注入
在这里插入图片描述

  <!--c命名空间注入,可以通过构造器注入:construct-args-->
    <bean id="user2" class="com.cxq.pojo.User" c:name="凯凯凯" c:age="25"/>

在这里插入图片描述

 @Test
    public void test2(){
        /*1:获取上下文拿到容器空间,new一个CPX*/
        ApplicationContext context=new ClassPathXmlApplicationContext("userbeans.xml");
        /*2:getBean,构造id值为user的bean对象
        * 3:后面加了另一个参数,user.class就不用了进行强制类型转换了*/
        User user=context.getBean("user", User.class);
        /*4:有了toString方法,可以进行打印输出:user.sout即可*/
        System.out.println(user);
        /*getBean,构造id为user2的bean对象*/
        User user2=context.getBean("user2",User.class);
        System.out.println(user2);

    }

注意点:p命名和c命名不能直接使用,需要导入xml约束

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值