Spring 基础

Spring

1、简介

理念:使现有的技术更加容易使用,大杂烩,整合了现有的技术框架

SSM:SpringMVC+Spring+Mybatis

官网:https://spring.io/projects/spring-framework#overview

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

Github地址: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.2.5.RELEASE</version>
</dependency>

优点:

  • 开源免费框架
  • 轻量级,非入侵式框架 引入后对原来项目无影响
  • 控制反转IOC,面向切面编程AOP
  • 支持事务的处理,对框架整合的支持

组成

在这里插入图片描述

拓展

SpringBoot

  • 快速开发的脚手架
  • 基于SpringBoot可快速开发单个微服务
  • 约定大于配置

SpringCloud

  • 基于SpringBoot实现

弊端

发展了太久之后,违背了原有的理念,配置十分繁琐

2、IOC 控制反转

控制反转是一种通过描述(XML(beans)或注解)并通过第三方去生产或获取特定对象的方式。

在Spring中实现控制反转的是IOC容器,其实现方式是依赖注入(Dependency Injection,DI)

在配置文件加载的时候,容器中管理的对象进行初始化

创建对象的方式

  1. 使用无参构造创建对象
  2. 假设要使用有参构造,(下标,类型,参数名赋值)
<bean id="user" class="com.lucas.pojo.User">
<constructor-arg name="name" value="lucas"/>
</bean>

3、Spring配置

3.1、别名

<alias name="old" alias="new"/>   给对象赋别名,可以使用原名字和别名获取对象

3.2、Bean

id 对象名,唯一标识

class:包名+类型

name:别名,可以同时取多个

<bean id="" class="" name=", ,">
<property name="" value=""/>   参数
</bean>

3.3、Import

用于团队开发,可以将多个配置文件合并为一个

将各个人的beans.xml(名字随便取)合并为一个applicationContext.xml

<import resource="beans1.xml"/>
<import resource="beans2.xml"/>

4、依赖注入

4.1、构造器注入

4.2、Set方式注入

  • 依赖注入:set注入

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

    官方文档

    https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-collection-elements

    在这里插入图片描述

    注意点:p-namespace 和c-namespace 需要导入xml约束

4.3、作用域

https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-factory-scopes

在这里插入图片描述

单例模式 Spring默认机制

<bean id="accountService" class="com.something.DefaultAccountService"/>

<!-- the following is equivalent, though redundant (singleton scope is the default) -->
<bean id="accountService" class="com.something.DefaultAccountService" scope="singleton"/>

原型模式 每次从容器中get的时候都会产生新对象

<bean id="accountService" class="com.something.DefaultAccountService" scope="prototype"/>

其他只能用在web开发中

5、Bean的自动装配

Spring会在上下文中自动寻找,并自动给bean装配属性

在Spring中有三种装配方式:

  • 在xml中显式地配置
  • 在java显式配置
  • 隐式地自动装配

在这里插入图片描述

  • byname:保证所有bean的ID唯一,并且这个bean需要和自动注入的属性的set方法的值一致
  • bytype:保证所有bean的class唯一,并且这个bean需要和自动注入的属性的类型一致

使用注解实现,better than XML

在这里插入图片描述

须知:

  1. 导入约束
  2. 配置注解的支持
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">

    <context:annotation-config/>   注解的支持

</beans>

@Autowired

直接在属性上使用,也可以在set中使用

使用Autowired后不用编写set方法,前提是这个自动装配的属性在IOC容器中存在

@Autowired(required=false)

如果显式定义了Autowired的required属性为false,说明这个对象可以为null

@Qualifier(value=“xxx”)

自动装配环境复杂,无法通过一个@Autowired完成,则指定一个唯一的bean对象注入

@Resource(name="")

6、使用注解开发

6.1、bean

@Component

组件,放在类上 等价于

<bean id="" class=""/>

6.2、属性注入

@Value("")

<property name="" value=""/>

6.3、衍生注解

@Component有几个衍生注解,功能一样,在MVC三层架构中

  • Dao 层 @Repository
  • Service层 @Service
  • Controller层 @Controller

6.4、自动装配置

@Autowired

直接在属性上使用,也可以在set中使用

使用Autowired后不用编写set方法,前提是这个自动装配的属性在IOC容器中存在

@Autowired(required=false)

如果显式定义了Autowired的required属性为false,说明这个对象可以为null

@Qualifier(value=“xxx”)

自动装配环境复杂,无法通过一个@Autowired完成,则指定一个唯一的bean对象注入

@Resource(name="")

6.5、作用域

@Scope(“singleton”)

@Scope(“prototype”)

7、XML和注解

xml更加万能,维护简单

注解 维护相对复杂

xml用来管理bean,注解完成属性的注入

8、使用Java的方式配置Spring

xml配置->Java 类

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

9、代理模式

分类:

  • 静态代理
  • 动态代理

9.1、静态代理

角色分析:

  • 抽象角色:一般会使用接口或者抽象类来表示 接口
  • 真实角色:被代理的角色
  • 代理角色:代理真实角色
  • 客户:访问代理对象

好处:

  • 使真实角色的操作更加纯粹
  • 公共交给了代理角色,实现业务的分工
  • 公共业务扩展时方便管理

缺点:

  • 一个真实角色产生一个代理角色,代码翻倍

9.2、动态代理

  • 角色:和静态代理相同
  • 动态代理的代理类是动态生成的
  • 基于接口的动态代理,和基于类的动态代理

好处:

  • 一个动态代理类代理的是一个接口,一般就是对应的一类业务
  • 一个动态代理类可以代理多个类,只要实现同一个接口

10、AOP

横向编程思想,不影响之前代码

由代理引申而来

11、事务

确保完整性和一致性

ACID原则

真实角色

  • 客户:访问代理对象

好处:

  • 使真实角色的操作更加纯粹
  • 公共交给了代理角色,实现业务的分工
  • 公共业务扩展时方便管理

缺点:

  • 一个真实角色产生一个代理角色,代码翻倍

9.2、动态代理

  • 角色:和静态代理相同
  • 动态代理的代理类是动态生成的
  • 基于接口的动态代理,和基于类的动态代理

好处:

  • 一个动态代理类代理的是一个接口,一般就是对应的一类业务
  • 一个动态代理类可以代理多个类,只要实现同一个接口

10、AOP

面向切面编程

横向编程思想,不影响之前代码

由代理引申而来

11、事务

确保完整性和一致性

ACID原则

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lucas_ch

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值