spring学习笔记一(跟着狂神学习)

1、Spring概述

1.1、简介

spring理念:使现有的技术更加容易使用

官方地址:https://spring.io/projects/spring-framework

官方下载地址(gethub):https://github.com/spring-projects/spring-framework

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

1.2 、优点:

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

1.3、组成

Spring框架是一个分层架构,由7个定义良好的模块组成。Spring模块构建在核心容器之上,核心容器定义了创建、配置和管理bean的方式

在这里插入图片描述

1.4、拓展

在这里插入图片描述

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

弊端:发展太久后违背了原来的理念,配置十分繁琐,人称:“配置地狱”

2、IOC理论推导

原来的调用service层调用dao层:

 UserDaoImpl userDao = new UserDaoImpl();
  • 用户不同的需求就需要修改代码实现对应的业务,在需求十分多的情况下,修改一次的成本代价十分昂贵

现在的调用service层调用dao层:

UserDao userDao;

public void setUserDao(UserDao userDao) {
    this.userDao = userDao;
}
  • 使用set方法提供外界一个接口,将程序控制权交给了调用者。

  • 之前,程序是主动创建对象,控制权在程序员手上。

  • 使用set注入后,程序不再具有主动性,而是变成被动的接受对象。

  • 降低耦合度,提高了程序的灵活性

这种思想,本质上解决了问题,程序员不用再去管理对象的创建。系统的耦合性大大降低,可以更专注在业务的实现上,这是IOC的原型。

3、IOC

一个bean代表一个对象,若使用原型,创建容器时会根据bean来创建对象

3.1、通过set方法给属性赋值(无参构造创建对象)

<bean id="user" class="com.bin.pojo.User">
    <property name="name" value="chen"/>
    <property name="age" value="18"/>
</bean>

3.2、通过无参构造创建对象:

<bean id="user" class="com.bin.pojo.User"/>

3.3、通过有参构造创建对象:

  1. 通过下标解析匹配参数:

    <bean id="user" class="com.bin.pojo.User">
        <constructor-arg index="0" value="chen"/>
        <constructor-arg index="1" value="18"/>
    </bean>
    
  2. 通过参数类型解析匹配参数:

    <bean id="user" class="com.bin.pojo.User">
        <constructor-arg type="java.lang.String" value="chen"/>
        <constructor-arg type="int" value="18"/>
    </bean>
    
  3. 通过参数名解析匹配参数:

    <bean id="user" class="com.bin.pojo.User">
        <constructor-arg name="name" value="chen"/>
        <constructor-arg name="age" value="18"/>
    </bean>
    

总结:在配置文件加载的时候,容器中管理的对象就已经初始化了。

4、spring的配置

4.1、别名

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

4.2、Bean的配置

<!--name也是别名,且可以取多个-->
<bean id="user1" class="com.bin.pojo.User" name="us,user3 u">    
	<property name="name" value="chena"/>
</bean>

4.3、import

  • 将多个xml配置文件并入到当前配置文件,如果有多个bean(id相同)相同只匹配一个

  • 每个文件的大小比一个文件要小的多,查找效率提高

  • 避免多人开发带来冲突

  • 可以根据功能、模块来分配

  • 更容易维护,不用在大量的bean中查找

5、依赖注入

5.1、构造器注入

  • 参考上面有参构造创建对象

5.2、set方式注入⭐

  • 依赖注入:Set注入
    • 依赖:bean对象的创建依赖容器
    • 注入:bean对象中的所有属性,由容器注入

【环境搭建】

  1. 复杂类型

    @Data
    public class Address {
        private String address;
    }
    
  2. 真实测试对象

    @Data
    public class Student {
        private String name;
        private Address address; 
        private String[] books;    
        private List<String> hobbys;    
        private Map<String,String> card;    
        private Set<String> games;    
        private String wife;    
        private Properties info;
    }
    
  3. beans.xml

    <bean id="student" class="com.bin.pojo.Student">
        <property name="name" value=""/>
    </bean>
    
  4. 测试类

    @Test
    public void test(){
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");    
        Student student = (Student) context.getBean("student");    
        System.out.println(student.getAddress());
    }
    

完善注入信息

5.3、拓展方式注入

可以使用p命名空间和c命名空间

xml配置:

<!--p命名空间注入,可以直接注入属性的值:property-->
<bean id="user1" class="com.bin.pojo.User" p:age="18" p:name="chen1"/>
<!--c命名空间注入,通过构造器注入:construct-args-->
<bean id="user2" class="com.bin.pojo.User" c:age="20" c:name="chen2"/>

测试:

@Test
public void test02(){
    ApplicationContext context = new ClassPathXmlApplicationContext("userBean.xml");    
    User user = context.getBean("user2", User.class);    
    System.out.println(user);
}

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

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

5.4、bean的作用域

ScopeDescription
singleton(默认)将每个 Spring IoC 容器的单个 bean 定义范围限定为单个对象实例。
prototype将单个 bean 定义的作用域限定为任意数量的对象实例。
request将单个 bean 定义的范围限定为单个 HTTP 请求的生命周期。也就是说,每个 HTTP 请求都有一个在单个 bean 定义后面创建的 bean 实例。仅在可感知网络的 Spring ApplicationContext中有效。
session将单个 bean 定义的范围限定为 HTTP Session的生命周期。仅在可感知网络的 Spring ApplicationContext上下文中有效。
application将单个 bean 定义的范围限定为ServletContext的生命周期。仅在可感知网络的 Spring ApplicationContext上下文中有效。
websocket将单个 bean 定义的范围限定为WebSocket的生命周期。仅在可感知网络的 Spring ApplicationContext上下文中有效。
  1. 单例模式(spring默认机制)

    <bean id="user2" class="com.bin.pojo.User" scope="singleton"/>
    
  2. 原型模式

    每次从容器中get一个bean时都会创建一个对象

    <bean id="user2" class="com.bin.pojo.User" scope="prototype"/>
    
  3. 其余的request、session、application这些在web开发中使用

spring笔记2
狂神自学网 spring笔记1
狂神自学网 spring笔记2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值