Spring整理

Spring

本笔记是在学习狂神说java的B站视频记录的。

简介

历史

2002 —— 雏形interface21框架

作者 —— Rod Johnson,Spring Framework创始人

spring 理念 ——使现有技术更加容易使用,本身是一个大杂烩,整合了现有的技术框架

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

下载Github:https://github.com/spring-projects/spring-framework

文档:https://docs.spring.io/spring-framework/docs/5.2.11.RELEASE/spring-framework-reference/core.html#spring-core

优点

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

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

组成

spring组成图

扩展

现代化的java开发就是基于spring的开发

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

弊端

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

IOC理论推导

  1. UserDao接口
  2. UserDaoImpl实现类
  3. UserService业务接口
  4. UserServiceImpl业务实现接口

之前,程序是主动创建对象

使用set()注入,程序由主动变被动接收对象

IOC是一种设计思想,依赖注入DI是IOC的一种实现

IOC解耦图

HelloSpring

xml里配置<bean class="xxx"></bean>

对象由spring创建、管理、装配

new 是走无参构造创建对象

ApplicationContext context = new ClassPathXmlApplication(beans.xml);

context.getBean();

IOC创建对象方式

1.使用默认的无参构造

2.假设要使用有参构造创建对象

  • 下标赋值

      <constructor-arg index="0" value="24"></constructor-arg>
      <constructor-arg index="1" value="zhaoyt"></constructor-arg>
    
  • 通过类型

    • 参数名(name="属性名")

spring容器相当于"婚介所"

Spring配置

别名

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

bean的配置

id 唯一标识 相当于对象名

class:bean对象所对应的全限定名:包名+类名

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

<bean id="user" class="com.zyt.pojo.User" name="user2"></bean>

import

一般用于团队开发,配置多个文件,合并为一个总的。

applicationContext.xml

<import resource="bean1.xml"/>
<import resource="bean2.xml"/>

依赖注入

1.构造器注入

2.set方式注入(重点)

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

3.拓展方式注入

  • p命名空间
 xmlns:p="http://www.springframework.org/schema/p"
<!--p命名空间注入,可以直接注入属性的值-->
<bean id="user" class="com.zyt.pojo.User" p:name="zyt" p:age="24"/>
  • c命名空间
xmlns:c="http://www.springframework.org/schema/c"
 <!--c命名空间-->
<bean id="user2" class="com.zyt.pojo.User" c:age="18" c:name="zhaoyt"/>

bean作用域

1.单例模式(Spring默认机制)

<bean id="user2" class="com.zyt.pojo.User" c:age="18" c:name="zhaoyt" scope="singleton"/>

2.原型模式:每次从容器中get的时候,都会产生一个新的对象

<bean id="user1" class="com.zyt.pojo.User" p:name="zyt" p:age="24" scope="prototype"/>

3.其余的request、session、application这些只能在web开发中使用到。

Bean自动装配

  • 自动装配是Spring满足bean依赖的一种方式
  • Spring会再上下文中自动寻找,并自动给bean装配属性

在Spring中有三种装配方式

​ 1.在xml中显示的配置

​ 2.在java中显示的配置

​ 3.隐式的自动装配

1.byName

<!--byName:会自动在容器上下文查找,和自己对象set方法后面对应的值beanid-->
<bean id="people" class="com.zyt.pojo.People" autowire="byName">
    <property name="name" value="zyt" />
</bean>

2.byType

<!--byType:会自动在容器上下文查找,和自己对象属性类型相同的bean-->
<bean id="people" class="com.zyt.pojo.People" autowire="byType">
    <property name="name" value="zyt" />
</bean>

小结:

  • byName的时候,需要保证所有bean的id唯一,并且这个bean需要和自动注入的属性的set方法的值一致!
  • byType的时候,需要保证所有bean的class唯一,并且这个bean需要和自动注入的属性的类型一致!

使用注解实现自动装配

要使用注解须知:

​ 1.导入约束,context约束

​ 2.配置注解的支持:<context:annotation-config/>

<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(Spring)容器中存在,且符合名字byName!

@Resource和@Autowired的区别

  • 都是用来自动装配的,都可以放在属性字段上
  • @Autowired 通过byType方式实现,而且必须要求这个对象存在【常用】
  • @Resource默认通过byName的方式实现,如果找不到名字,则通过byType实现!如果两个都找不到的情况下,就报错!【常用】
  • 执行顺序不同:@Autowired 通过byType的方式实现。@Resource默认通过byName的方式实现。

使用注解开发

spring4之后,要使用注解开发,必须保证aop的包导入了

aop依赖包

使用注解需要导入约束,增加约束的支持

1.bean

2.属性如何注入

  • @Componet:组件,放在类上,说明这个类被Spring管理了,就是bean!

    等价于<bean id="people" class="com.zyt.pojo.People"/>

<context:component-scan base-package="com.zyt.pojo"/>
  • @Value("xxx"):相当于 <property name="name" value="zyt"/>

3.衍生的注解

​ @Component有几个衍生注解,在web开发中,会按照mvc三层架构分层!

  • dao层【@Repository】

    • service层【@Service】

    • controller层【@Controller】

      这四个注解功能都是一样的,都是将某个类注册到spring中,bean装配

4.自动装配

@Nullable //可以使字段为null
@Autowired(required = false)//required属性用作说明这个对象可以为null,否则为空
@Qualifier(value = "cat222")//与Autowired配合使用,指定一个唯一的bean对象注入
@Resource(name="dog")//加name指定bean,功能强大一些

5.作用域

@Scope("singleton")

6.小结

  • xml更加万能,适用于任何场合!维护简单方便
  • 注解 不是自己类使用不了,维护相对复杂!

xml与注解的最佳实践

  • xml用来管理bean;

  • 注解只负责完成属性的注入;

  • 必须要让注解生效,就需要开启注解支持【重点】

    <!--开启注解的支持-->
    <context:annotation-config/>
    <!--指定要扫描的包,这个包下的注解就会生效-->
    <context:component-scan base-package="com.zyt"/>
    

使用java的方式配置spring

java类替代xml的bean

@Configuration 代表是一个配置类,相当于beans.xml

@Bean,注册一个bean,相当于bean标签,方法名字相当于id属性,返回类型相当于class属性

@Import也相当于import标签

ApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);

这种纯java的配置方式,在springboot中随处可见

代理模式

为什么要学习代理模式?因为这就是SpringAOP的底层!

中介:

代理图

代理模式分类:

  • 静态代理

  • 动态代理

静态代理

角色分析:

  • 抽象角色:一般会使用接口或者抽象类来解决
  • 真实角色:被代理的角色
  • 代理角色:代理真实角色,代理后一般会做一些附属操作
  • 客户:访问代理对象的人

代理模式的好处

  • 可以使真实角色的操作更加纯粹,不用去关注一些公共的业务。

  • 公共也就交给代理角色,实现了业务的分工。

  • 公共业务发生扩展的时候,方便集中管理

缺点

  • 一个真实角色就会产生一个代理角色,代码量会翻倍,开发效率变低!

加深印象

AOP机制图

动态代理

  • 动态代理和静态代理角色一样

  • 动态代理的代理类是动态生成的,不是我们直接写好的!

  • 动态代理分为两大类:基于接口的动态代理,基于类的动态代理

    • 基于接口——JDK动态代理【我们在这里使用】
    • 基于类——cglib
    • java字节码——Javassist

需要了解两个类:Proxy 代理、InvocationHandler:调用处理程序

动态代理的好处:

  • 静态的好处都有
  • 一个动态代理类代理的是一个接口,一般就是对应一类业务
  • 一个动态代理类可以代理多个类,只要是实现了同一个接口即可

AOP

什么是AOP

Aspect Oriented Programming 面向切面编程,通过预编译方法和运行期动态代理实现程序功能的统一维护的一种技术。

aop技术

AOP在spring中的作用

提供声明式事务;允许用户自定义切面

  • 横切关注点:跨越应用程序多个模块的方法或功能
  • 切面(Aspect):类
  • 通知(Advice):类中的方法
  • 目标(Target):被通知对象
  • 代理(Proxy):向目标对象应用通知之后创建的对象
  • 切入点(PointCut):切面通知执行的“地点”的定义
  • 连接点(JointPoint):与切入点匹配的执行点
自定义切面

SpringAOP中,通过Advice定义横切逻辑,Spring中支持5种类型的Advice:

前置通知、后置通知、环绕通知、异常抛出通知、引介通知

通知方式

使用Spring实现AOP

【重点】使用AOP织入,需要导入一个依赖包

    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.9.2</version>
    </dependency>

方式一:使用Spring API接口【主要是springAPI接口实现】

 <aop:config>
        <!--切入点:expression表达式,execution(要执行的位置!)-->
        <aop:pointcut id="pointcut" expression="execution(* com.zyt.service.UserServiceImpl.*(..))"/>
        <!--执行环绕增加!-->
        <aop:advisor advice-ref="log" pointcut-ref="pointcut"/>
        <aop:advisor advice-ref="afterLog" pointcut-ref="pointcut"/>
    </aop:config>

方式二:自定义来实现AOP【主要是切面定义】

<bean id="diy" class="com.zyt.diy.DiyPointcut"/>
    <aop:config>
        <!--自定义切面,ref要引用的类-->
        <aop:aspect ref="diy">
            <!--切入点-->
            <aop:pointcut id="point" expression="execution(* com.zyt.service.UserServiceImpl.*(..))"/>
            <!--通知-->
            <aop:before method="before" pointcut-ref="point"/>
            <aop:after method="after" pointcut-ref="point"/>
        </aop:aspect>
    </aop:config>

方式三:使用注解实现!

@Aspect //标注这个类是一个切面
@Before //前置通知
@After //后置通知
@Around //环绕通知
//运行结果:
/*   环绕前
    signaturevoid com.zyt.service.UserService.add()
    ===========方法执行前===========
    增加一个用户
    环绕后
    null
    ===========方法执行后===========
*/

整合Mybatis

步骤:

  1. 导入相关jar包
    • junit
    • mybatis
    • mysql数据库
    • spring相关
    • aop织入
    • mybatis-spring【new】
  2. 编写配置文件
  3. 测试

回忆mybatis

  1. 编写实体类

    User

  2. 编写核心配置文件

    mybatis-config.xml

  3. 编写接口

    UserMapper

  4. 编写xml文件

    UserMapper.xml

  5. 测试

    MyTest

【遇到问题——映射绑定报错】org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)

用maven的build将xml文件加载进来

    <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>

Mybatis-Spring

  1. 编写数据源
  2. sqlSessionFactory
  3. sqlSessionTemplate(核心)
  4. 需要给接口加实现类
  5. 将自己写的实现类注入到spring中

声明式事务

  1. 回顾事务
  • 把一组业务当成一个业务来做;要么都成功,要么都失败!
  • 事务在项目开发中,十分重要,涉及到数据的一致性问题,不能马虎!
  • 确保完整性和一致性

事务ACID原则

  • 原子性
  • 一致性
  • 隔离性
    • 多个业务可能操作同一个资源,防止数据损坏
  • 持久性
    • 事务一旦提交,无论系统发生什么问题,结果都不会再被影响,被持久化的写到存储器中!

2.spring中的事务

  • 声明式事务:AOP
  • 编程式事务,需要在代码中,进行事务的管理

思考:

为什么需要事务?

  • 如果不配置事务,可能存在数据提交不一致的情况下;
  • 如果我们不在spring去配置声明式事务,我们就需要在代码中手动配置事务!
  • 事务在项目的开发中十分重要,设计到数据的一致性和完整性问题,不容马虎!
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,188评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,464评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,562评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,893评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,917评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,708评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,430评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,342评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,801评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,976评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,115评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,804评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,458评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,008评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,135评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,365评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,055评论 2 355

推荐阅读更多精彩内容