Spring学习总结

目录

1、IOC本质

2、HelloSpring

3、IOC创建对象方式 

4、Spring配置

1、别名

2、Bean配置

3、import

5、依赖注入

1、构造器注入

2、set方法注入【重点】

3、拓展方式注入

4、bean的作用域

6、Bean的自动装配

使用注解实现自动装配

7、使用注解开发

1.bean

2.属性如何注入

3.衍生的注解

4.自动装配置

5.作用域

6.小结

 8、使用Java的方式配置Spring

9、代理模式

1.静态代理

2.动态代理

10、AOP

使用Spring实现AOP

11、Spring整合Mybais


Spring两大思想:IOC(控制反转),AOP(面向切面编程)

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

1、IOC本质

        控制反转loC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现loC的一种方法,也有人认为DI只是loC的另一种说法。没有loC的程序中,我们使用面向对象编程,对象的创建与对象间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制,控制反转后将对象的创建转移给第三方,个人认为所谓控制反转就是:获得依赖对象的方式反转了。
        采用XML方式配置Bean的时候,Bean的定义信息是和实现分离的,而采用注解的方式可以把两者合为一体,Bean的定义信息直接以注解的形式定义在实现类中,从而达到了零配置的目的。
        控制反转是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。在Spring中实现控制反转的是loC容器,其实现方法是依赖注入(Dependency Injection,Dl)。

通过IOC可以配置XML文件来修改需求,而不需要修改最底层的源码

4个接口的实现类

修改XML中属性 基本数据类型用value,引用类型比如String用ref

2、HelloSpring

导入相关jar包

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.3.13</version>
         </dependency>

编写实体类

配置XML文件

测试

3、IOC创建对象方式 

1、使用无参构造创建对象,默认

2、假设我们要使用有参构造创建对象

        1.下标赋值

         2.类型赋值

        3.参数名赋值

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

4、Spring配置

1、别名

2、Bean配置

3、import

import一般用于团队开发使用,他可以将多个配置文件导入合并为一个,在applicationContext.xml中用import直接配置导入,使用的时候直接用总的xml文件就可以了

5、依赖注入

1、构造器注入

详情参考第三点

2、set方法注入【重点】

        依赖注入:set注入

                        依赖:bean对象的创建依赖于容器

                        注入:bean对象中的所有熟悉由容器来注入

【环境搭建】

1.复杂类型

2.真实测试对象

 3.beans.xml

4.测试类

 完善注入信息

3、拓展方式注入

我们可以使用p命令空间和c命令空间进行注入

使用:

测试:

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

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

4、bean的作用域

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

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

3.其余的一些只能在web开发中用到 

6、Bean的自动装配

        自动装配是Spring满足bean依赖的一种方式

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

在Spring中有三种装配的方式

        1.在xml中显示配置

        2.在java中显示配置

        3.隐式的自动装配【重要】

【环境搭建】一个人有两只宠物,所以有3个实体类,实体类中宠物有各自的方法

ByName自动装配

        byname的时候,需要保证所有bean的id唯一,并且这个bean需要和自动注入的属性的set方法的值一致 

        bytype的时候,需要保证所有bean的class 唯一,并且这个bean需要和自动注入的属性的类型一致 

使用注解实现自动装配

使用注解须知:

        1.导入约束:context约束

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

<?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
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

    <!--开启注解的支持-->
    <context:annotation-config/>
</beans>

@Autowired

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

使用Autowired我们可以不用编写set方法,前提是这个自动装配的属性在IOC(Spring)容器中存在且符合名字(byname)

@Autowire 默认通过类型匹配(byType)如果我们想使用按名称装配,可以结合@Qualifier(value="xxx")注解一起使用【常用】
@Resource 默认通过名称装配(byName)后面可加括号(name="xxx")搜索具体的,如果找不到名字就按类型匹配,两个都找不到就报错

他们都是用来自动装配的,都可以放到属性字段上

7、使用注解开发

在Spring4后,要使用注解开发,必须要保证aop的包导入了。使用注解需要到处context约束,增加注解的支持

1.bean

2.属性如何注入

3.衍生的注解

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

dao:【@Repository】

service:【@Service】

controller:【@Controller】

这四个注解功能相同,都代表将某个类注册到spring容器中,装配Bean

4.自动装配置

5.作用域

@Scope("xxx")

6.小结

xml与注解:

        xml更加万能,适用于任何场合,维护简单方便

        注解不是自己的类是用不了,维护相对复杂

xml与注解最佳实践:

        xml只用来管理bean

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

        我们在使用的过程中,只需要注意一个问题:必须让注解生效,就需要开启注解的支持

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

 8、使用Java的方式配置Spring

完全不使用Spring的xml配置,全权交给Java来做

JavaConfig是Spring的一个子项目,在Spring4后它成为了一个核心功能

         @ComponentScan是和@Component配套使用,这里添加了@Bean注解,就可不使用@Component和@ComponentScan注解也可以实现功能,单独使用一个@Bean注解也可以实现功能

【重要】这种纯java的配置方式,在SpringBoot中随处可见

9、代理模式

代理模式是SpringAOP的底层【SpringAOP和SpringMVC】

代理模式分为静态代理动态代理

1.静态代理

角色分析:

        抽象角色:一般会使用接口或抽象类来解决

        真实角色:被代理的角色

        代理角色:代理真实角色。代理真实角色后,我们一般会做一些附属操作

        客户:访问代理对象的人

代理步骤

1.接口

2.真实角色

3.代理角色

4.客户端访问代理角色

代理模式的好处:

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

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

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

代理模式的缺点:

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

2.动态代理

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

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

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

        基于接口:JDK动态代理

        类:cglib

        java字节码实现:javasist

接口和真实角色

代理角色

ProxyInvocationHandler实现了 InvocationHandler接口,重写了当中的方法。生成一个代理类,里面参数第一个获得一个ClassLoader对象,第二个参数时获得真实对象(代理类)的接口,第三个参数就是自己本身

测试

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

动态代理的好处:

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

        公共就交给其他代理角色,实现了业务的分工

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

        一个动态代理类代理的是一个接口,一般就是对应的一类业务

        一个动态代理可以代理多个类,只要实现了同一个接口即可

10、AOP

使用Spring实现AOP

 导入jar包,xml中配置aop

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


<?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:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd">
</beans>

 方式一:使用原生API接口实现

       

方式二:自定义来实现AOP

测试类

 方式三:用注解实现

@Aspect 标注这个类是一个切面 
@Before 切入点位置

11、Spring整合Mybais

步骤:

1.导入相关jar包

        juint

        mybatis

        mysql数据库

        spring相关的

        aop织入

        mybatis-spring

2.编写配置文件

3.测试

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.3.13</version>
        </dependency>
        <!--spring操作数据库,还需要导入一个spring-jdbc-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.3.13</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
        </dependency>

        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.7</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.25</version>
        </dependency>

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

        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>2.0.6</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.22</version>
        </dependency>
    </dependencies>

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

编写接口和实体类

 

 数据库操作,这里是查询

mybatis原有的配置文件,这里全部交给spring来做了,只放一些setting或者设置的别名

用spring来配置mybatis

 接口实现类

总配置文件applicationContext.xml

测试

 

第二种简单的方式,代码编写少

 不同于第一种,接口的实现类将会变得简单,但是spring-mybatis.xml还是要认真配一定不可出错

 测试

12、声明式事务 

 1.事务回顾

         把一组业务当成一个业务来做,要么都成功,要么都失败

        事务在项目开发中十分重要,涉及到数据的一致性问题,不容马虎!

        确保完整性和一致性

事务的ACID原则:

        原子性

        一致性

        隔离性:多个业务可能操作同一个资源,防止数据损坏

        持久性:一旦事务提交,无论系统发生什么问题都不会再被影响,被持久化写入存储器中

2.Spring中的事务管理

        声明式事务:AOP

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

基于spring整合mybatis的项目来进行方法的增加

接口

mybatis操作数据库

 spring配置mabtis内容完成以后,在下方继续配置声明式事务

 当mybatis操作数据库的时候因为错误导致某一个操作未成功,则这次所有的操作将不会成功,这就是声明式事务的好处

测试

接口实现类中,对数据库的操作是添加3号,删除10号

数据库中数据

运行后的结果

运行后的数据库

在没有事务的时候,sql语句出现了错误,运行报错,但是数据依旧插入到了数据库中

原数据库

 错误的sql语句

 没有声明式事务

 

程序报错,但是依旧成功添加数据到数据库

在mybatis操作数据库的sql语句中出现错误,因为有声明式事务,这次操作的所有数据将不成功并且报错

原数据库 

错误的sql语句

添加了声明式事务

 接口实现类

程序依旧报错

数据库未修改成功 

文章部分内容转载自 狂神说 博客内容

终于,狂神说SSM及SpringBoot系列文章完更!!!_狂神说-CSDN博客_狂神springboot

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值