spring 入门详解超

article/2025/9/15 14:50:05

一.什么是spring

1.简介:Spring是一个开源的设计层面框架,解决了类与类之间的彻底解耦,它将面向接口的编程思想贯穿整个系统应用。

2.spring核心:

        IOCInverse of Control 控制反转):将bean的创建权和引用权(DI(依赖注入))交给  spring容器。容器中的bean安不安全与spring没有关系,spring并没有对容器中的bean做处理,安全性取决于bean本身。

        AOPAspect Oriented Programming 面向切面编程):对共同的连接点进行切面。

3.实际开发三层架构:

        表现层(controller):提供了与Spring MVC等框架的整合;

        业务层(service):可以管理事务、记录日志等;

        持久层(dao)提供了与Mybatis、Hibernate等框架的整合。

二.spring IOC XML入门

1.使用xml对简单数据类型引用

导入spring依赖

<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.10.RELEASE</version></dependency>
</dependencies>

先创建一个pojo模板类

 在resources下新建一个applicationContext.xml文件

(1)空参构造创建对象

这种方式,容器通过无参构造创建对象,name="name"通过Book对象中的setter方法设置值。

        也可以通过p空间命名方法赋值

测试,获取bean的三种方式:

 结果:

-----false
-----《射雕英雄传》

(2)也可以通过有参构造创建对象,并对属性赋值

        按构造方法的参数一一对应进行赋值 

        按参数类型进行赋值

        按参数位置进行赋值

 2.使用xml对引用数据类型引用(ref)

先创建一个类BookDaoImpl

再创建一个BookServiceImpl类,含有BookDao的引用,并有setter方法

 xml配置两个类

 

 测试:

 结果:

book save

 3.使用xml对引用数据类型的自动装配

        按类型,ioc容器中被装配的对象只能有一个,不然会报错。

         按名称装配,BookServiceImpl中的引用必须要有这个引用的setter方法。

 4. 使用xml工厂创建对象  

        (1)静态工厂

 

       (2) 实例工厂创建对象

 

 

        (3)动态工厂创建对象

 

 

  4. 使用xml创建集合成员属性的对象

        先创建一个pojo模板对象

         配置xml

  5. 使用xml创建数据库连接池

               resources创建jdbc.properties

                 

三.获取容器的几种方式

1.ApplicationContext 应用上下文容器取(从类路径中加载) :

new ClassPathXmlApplicationContext("bean1.xml", "bean2.xml");

new ClassPathXmlApplicationContext("applicationContext.xml");

但要注意bean的生命周期要为singleton,也就是说,不管没有getBean(), 使用上下文容器获取bean,就会实例化该bean。

2. ApplicationContext (从文件系统中加载):

new FileSystemXmlApplicationContext("D:\\applicationContext.xml");

文件路径为绝对路径,且注意使用转义符,直接使用“C:\sjt\idea\code\spring\springinterface\src”, 会报错,需要将“\”转义。

3.XmlWebApplicationContext (从web系统中加载):在tomcat启动时就会加载,此处不做说明,在web应用中说明。

4.AnnotationConfigApplicationContext:

new AnnotationConfigApplicationContext(Spring_Config.class)是通过注解加载到,下面会讲解

5.使用bean工厂:

new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));

spring-config.xml文件中配置的bean不会被实例化,即光实例化容器,并不会实例化bean 而是在执行以下代码时才会被实例化,即使用bean的时候。

 四.spring ioc注解入门

一.spring注解介绍(简化xml麻烦的配置):

        1.@Component :没有指定名称的时候,默认名称是bean名称的首字母小写名称。

         2.@Component衍生出三个注解,就是为了区分三层架构。

                (1)@Controller:用于表现层bean定义。

                (2)@Service:用于业务层bean定义。

                (3)@Repository:用于数据层bean定义。

        3.@Autowired:用于注入对象。

           注意1:自动装配基于反射设计创建对象并暴力反射对应属性为 私有属性初始化数据,因此无需提供setter方法。 注意2:自动装配建议使用无参构造方法创建对象(默认),如果不提供对应构造方法,请提供唯一的构造方法。

        4.@Qualifier

           使用@Qualifier注解开启指定名称@Component("bookDao")装配bean: 用于多态 @Qualifier("bookDao") 注意:@Qualifier注解无法单独使用,必须配合@Autowired注解使用。

        5.@Value:用于对简单数据类型引用进行赋值。

        6.@Bean:提供一个获取管理对象的方法,并声明bean,@Bean修饰的方法形参根据类型自动装配。

        7.@Configuration:用于声明是一个配置类。

        8.@ComponentScan({"com.dengzhihong"}):扫描包下的注解。

        9.@PropertySource({"classpath:jdbc.properties"}):声明文件数据源。

        10.@Import({jdbcConfig.class,MybatisConfig.class}):用于导入其他配置类,一般在spring-config,spring容器配置类中导入其他配置类。

五.代码具体演示

这里暂不使用springMvc容器。

导入pom依赖

        <dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.9.RELEASE</version></dependency><dependency><groupId>javax.annotation</groupId><artifactId>javax.annotation-api</artifactId><version>1.3.2</version><scope>compile</scope></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.12</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.46</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.1</version></dependency><!--spring整合mybatis--><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.2.9.RELEASE</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>2.0.5</version></dependency>

一.jdbcConfig配置类,由spring容器创建数据类连接池对象:

二.MybatisConfig配置类,由spring容器创建SQLSessionFactoryBean对象:

三.Spring_Config配置类,Spring容器入口:

四.jdbc.properties文件

 五.dao层

@AutoWired对 bookMapper引用自动装配mapper接口对象。

六.mapper接口

 七.pojo模板对象,省略setter和getting方法

 八.service层对象

 测试:

 结果:

BookDaonull
null
BookDao我是dao
jdbc:mysql://localhost:3306/springdb
BookService
BookDao我是dao
jdbc:mysql://localhost:3306/springdb

相信大家对,ioc容器自动装配有了一定的了解了,你的引用不需要再new了,由spring容器通过@AutoWired标识,自动从容器中装配。

六.AOP面向切面编程

一.什么是面向切面编程呢?

  • AOP(Aspect Oriented Programming)面向切面编程,一种编程范式,指导开发者如何组织程序结构。

  • 作用:在不惊动原始设计的基础上为其进行功能增强。简单的说就是在不改变方法源代码的基础上对方法进行功能增强。

  • Spring理念:无入侵式/无侵入式。

  • 实现:AOP运用的是动态代理模式。

    aop简介:

  • 连接点(JoinPoint):正在执行的方法,例如:select()、delete()、show()等都是连接点。

  • 切入点(Pointcut):进行功能增强了的方法,例如:delete()方法,select(),show()方法没有被增强所以不是切入点,但是是连接点。

    • 在SpringAOP中,一个切入点可以只描述一个具体方法,也可以匹配多个方法

      • 一个具体方法:com.dengzhihong.AOP.dao包下的BookDao接口中的无形参无返回值的delete()方法

      • 匹配多个方法:需要设置切入点表达式,由  *或..和+占位符表示。

  • 通知(Advice):在切入点前后执行的操作,也就是增强的共性功能

    • 在SpringAOP中,功能最终以方法的形式呈现

  • 通知类:通知方法所在的类叫做通知类

  • 切面(Aspect):描述通知与切入点的对应关系,也就是哪些通知方法对应哪些切入点方法。

二.规则则:

     设置切入点:

         1.描述切入点通常描述接口,而不描述实现类

        2.访问控制修饰符针对接口开发均采用public描述(可省略 )

        3.包名书写尽量不使用..匹配,效率低,常用*做单个包描述匹配,或精准匹配

        4.返回值类型对于增删改类使用精准类型加速匹配,对于查询类使用*通配快速描述

        5.接口名/类名书写名称与模块相关的采用*匹配,例如UserService书写成*Service,绑定业               务层接口名

        6.通常不使用异常作为匹配规则

    三. 切入点表达式:

         1、 *:单个独立的任意符号,可以独立出现,也可以作为前缀或者后缀的匹配符出现                         execution(public * com.itheima.*.UserService.find*(*))

         2、 .. :多个连续的任意符号,可以独立出现,常用于简化包名与参数的书写                                       execution(public User com..UserService.findById(..))

         3、+:专用于匹配子类类型 execution(* *..*Service+.*(..))

四.由下列方式来定义或者通过 &&、 ||、 !、 的方式进行组合:

  • execution:用于匹配方法执行的连接点;
  • within:用于匹配指定类型内的方法执行;
  • this:用于匹配当前AOP代理对象类型的执行方法;注意是AOP代理对象的类型匹配,这样就可能包括引入接口也类型匹配;
  • target:用于匹配当前目标对象类型的执行方法;注意是目标对象的类型匹配,这样就不包括引入接口也类型匹配;
  • args:用于匹配当前执行的方法传入的参数为指定类型的执行方法;
  • @within:用于匹配所以持有指定注解类型内的方法;
  • @target:用于匹配当前目标对象类型的执行方法,其中目标对象持有指定的注解;
  • @args:用于匹配当前执行的方法传入的参数持有指定注解的执行;
  • @annotation:用于匹配当前执行方法持有指定注解的方法;

七.AOP入门案例

一.在spring容器配置类中开启aop功能

 二.创建一个BookDao接口及其实现类BookDaoImpl

 

 三.创建通知类BookAdvice,并在类上注解@Component ,设置切面类 @Aspect

前置通知:在切入点方法执行之前执行

 测试:

 结果:

我是前置通知

delete

三.后置通知:在切入点方法执行之后执行,无论切入点方法内部是否出现异常,后置通知都会执行。

四.环绕通知(重要)

 

五.带返回值的通知

连接点:

通知类:

 测试:

 结果:

接口全类名interface com.dengzhihong.AOP.dao.BookDao 方法名:select
aroundSelect前环绕
select
aroundSelect后环绕
110

六.返回值后通知:在切入点方法执行之后执行,如果切入点方法内部出现异常将不会执行。

 注意:JoinPoint参数必须在第一,否则会报错。

结果:

select
afterReturning advice ...10 [10]

七.异常后通知:在切入点方法执行之后执行,只有当切入点方法内部出现异常之后才执行。

 八.通知类初始化bean

1. Spring容器启动

2. 读取所有切面配置中的切入点

3. 初始化bean,判定bean对应的类中的方法是否匹配到任意切入点 - 匹配失败,创建原始对象 - 匹配成功,创建原始对象(目标对象)的代理对象

4. 获取bean执行方法 - 获取的bean是原始对象时,调用方法并执行,完成操作 - 获取的bean是代理对象时,根据代理对象的运行模式运行原始方法与增强的内容,完成操作

测试:

结果:

com.dengzhihong.AOP.dao.impl.BookDaoImpl@53f6fd09
class com.sun.proxy.$Proxy24

由此可知,连接点的执行实际上是通过他的代理类执行的,底层是动态代理。

目标对象(Target):被代理的对象,也叫原始对象,该对象中的方法没有任何功能增强。

代理对象(Proxy):代理后生成的对象,由Spring帮我们创建代理对象。

八.事务@Transactional注解

事务的作用:

1.一般事务:在数据层保障一系列的数据库操作同成功同失败 。

2.spring事务:在数据层业务层保障一系列的数据库操作同成功同失败。

3.事务最好还是配置在业务层,只有配置在业务层,才会出异常时,自动回滚

4.配置在dao层的话,只是数据库操作时异常会回滚

5.配置到web层的话,也可以,但是引起异常的情况就更多,除非安全性特别高。而且controller层只支持注解式的事务

直接上代码:

一.Spring整合Mybatis相关代码(依赖、MybatisConfig)省略。

二.设置事务管理器transactionManager(将事务管理器添加到IOC容器中)

 三.开启注解式事务驱动

 四.在service层接口处添加事务注解

 注意:

  1. Spring注解式事务通常添加在业务层接口中而不会添加到业务层实现类中,降低耦合

  2. 注解式事务可以添加到业务方法上表示当前方法开启事务,也可以添加到接口上表示当前接口所有方法开启事务

五.mapper接口

六.service接口实现类

 测试A给B转100块:

数据库表

 

结果 :

出现异常:Exception in thread "main" java.lang.ArithmeticException: / by zero

事务回滚,账号不变。

九.事务的传播行为

一.什么是事务的传播行为:在开始当前事务之前,一个事务上下文已经存在,此时有若干选项可以指定一个事务性方法的执行行为。

方法必须是public修饰符,否则注解不会生效。

在TransactionDefinition定义传播行为的常量:

1.TransactionDefinition.PROPAGATION_REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。这是默认值。
2.TransactionDefinition.PROPAGATION_REQUIRES_NEW:创建一个新的事务,如果当前存在事务,则把当前事务挂起。
3.TransactionDefinition.PROPAGATION_SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
4.TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,则把当前事务挂起。
5.TransactionDefinition.PROPAGATION_NEVER:以非事务方式运行,如果当前存在事务,则抛出异常。
6.TransactionDefinition.PROPAGATION_MANDATORY:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
7.TransactionDefinition.PROPAGATION_NESTED:如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于第1条

例子:

在transfer()方法中开启了事务(接口中),那么方法内的UserMapper.outMoney()和UserMapper.InMoney(),log()方法就会加入到transfer()方法事务中,三个方法要么同时成功,要么同时失败。


 

 我们希望log()方法也加入到两个转钱方法中,那么需要开启一条新事务。

 这样就

二.Spring事务的回滚机制:

1.Spring的AOP即声明式事务管理默认是针对unchecked exception回滚。如果一个方法,不仅作为切点添加了异常切面,而且还添加了事务,那么当这个方法抛出异常时,总是切面先捕获到异常,并且吞掉了这个异常。而事务是捕获不到这个异常的,因此事务是不生效的。

2.Spring的事务边界是在调用业务方法之前开始的,业务方法执行完毕之后来执行commit or rollback(Spring默认取决于是否抛出runtimeException)。

3.如果你在方法中有try{}catch(Exception e){}处理,那么try里面的代码块就脱离了事务的管理,若要事务生效需要在catch中throw new RuntimeException ("xxx")。

4.对于RuntimeException类型异常或者Error错误,Spring事务能够进行回滚操作。但是对于编译器异常,Spring事务是不进行回滚的,所以需要使用rollbackFor来设置要回滚的异常。

十.bean的生命周期

这张图是我拿大佬的,读书人只能说是拿(滑稽保命)

 大佬的Spring bean生命周期

十一.spring拓展接口


http://chatgpt.dhexx.cn/article/yG7XmW5K.shtml

相关文章

Spring框架入门详解

Spring 为什么引入Spring框架 为了提高开发效率和实现模块之间的高聚合低耦合&#xff0c;所以引入了Spring框架 高聚合低耦合 高内聚 内聚是指模块内的联系&#xff0c;各个元素之间紧密联系共同完成任务&#xff0c;模块内的联系越紧密越好&#xff0c;这样可以提高他们…

Spring详解(小白教程,大佬勿入,勿喷。)

1.Spring概述 Spring是什么&#xff1f; 在resource目录下创建子包需要用/ 如&#xff1a;com/baidu/userMapper.xml Spring是分层的 Java SE/EE应用 full-stack 轻量级开源框架&#xff0c; 以 IoC&#xff08;Inverse Of Control&#xff1a;反转控制&#xff09;和 AOP&…

spring aop详解

1.前言 spring aop是一个面向切面的编程&#xff0c;在自己第一遍学习的时候&#xff0c;感觉aop没有什么作用&#xff0c;但是真实接触下来&#xff0c;感觉spring aop还是很有用途的&#xff0c;感觉自己之前的想法太年轻了。 2.概念 Spring 提供了两种AOP 的实现&#xf…

详解Spring

Spring SSH框架中Struts2:是基于Web层&#xff0c;Hibernate&#xff1a;是基于持久化的&#xff0c;Spring:业务层&#xff0c;管理bean&#xff0c;它是一个容器&#xff0c;List,map&#xff0c; Set这里的内容&#xff0c;是适合已经学过了Spring的人供复习参考的..... Spr…

Spring详解简介

1、Spring的简介 Spring的英文翻译为春天&#xff0c;可以说是给Java程序员带来了春天&#xff0c;因为它极大的简化了开发。我得出一个公式&#xff1a;Spring 春天 Java程序员的春天 简化开发。最后的简化开发正是Spring框架带来的最大好处。 Spring是一个开放源代码的设计…

spring 详细讲解

有人说&#xff0c;“Java程序员都是Spring程序员”&#xff0c;老三不太赞成这个观点&#xff0c;但是这也可以看出Spring在Java世界里举足轻重的作用。 基础 1.Spring是什么&#xff1f;特性&#xff1f;有哪些模块&#xff1f; Spring Logo 一句话概括&#xff1a;Spring…

JAVA框架Spring 全面详解(学习总结)

Spring 1.Spring 全面详解 1.1简介 ◆ Spring&#xff1a;春天 给软件行业带来了春天 ◆ 2002&#xff0c;首次推出了Spring框架的雏形&#xff1a;interface21框架 ◆ Spring框架即是以interface21框架为基础经过重新设计&#xff0c;并不断丰富其内涵&#xff0c;于2004…

Spring的事务详解

事务简介 事务在逻辑上是一组操作&#xff0c;要么执行&#xff0c;要不都不执行。主要是针对数据库而言的&#xff0c;比如说 MySQL。 为了保证事务是正确可靠的&#xff0c;在数据库进行写入或者更新操作时&#xff0c;就必须得表现出 ACID 的 4 个重要特性&#xff1a; 原…

java系列之Spring详解

一、Spring简介 1.1 简介 关于spring的简介&#xff0c;可以查看百度百科&#xff0c;下面内容部分来自百度百科 Spring框架是针对软件开发过程中的复杂性而创建的。其使用javaBean来完成以前只可能由EJB完成的事情。 2002年&#xff0c;Rod Jahnson首次推出了Spring框架雏形…

Spring全面详解

—————版本Spring5.x————— ——编译器IntelliJ IDEA 2020.2.3 —— <-- 该文章有点老旧&#xff0c;停止了更新&#xff0c;请查看Spring5最新文章&#xff0c;目前已经书写完成 --> Spring5全面详解 它会持续更新&#xff0c;你所看到的不是最终版本。 如…

Spring-全面详解(学习总结)

Spring 1.简介 1.1.简介 简介 Spring : 春天 —>给软件行业带来了春天 2002年&#xff0c;Rod Jahnson首次推出了Spring框架雏形interface21框架。 2004年3月24日&#xff0c;Spring框架以interface21框架为基础&#xff0c;经过重新设计&#xff0c;发布了1.0正式版。 …

spring超全面详解

spring概述 Spring 是于2003年兴起的一款轻量级的,非侵入式的IOC和AOP的一站式的java开发框架 为简化企业级应用开发而生. 1.轻量级: 就是指spring核心功能的jar包不大 2.非侵入式: 我们的业务代码不需要继承或实现spring中任何的类或接口 3.IOC: 控制反转 就是把创建…

Spring全面详解(学习总结)

Spring FrameWork一、 前言二、IOC(控制反转)2.1 对于IOC的理解2.2如何使用IOC2.3配置文件的解读2.4IOC容器创建bean的两种方式2.5从IOC容器中取bean2.6bean的属性如果包含特殊字符 三、DI(依赖注入)四、Spring中的bean五、Spring中的继承六、Spring的依赖七、Spring读取外部资…

查看Linux的用户权限(转载)

&#xff08;转&#xff09;Linux查看用户及其权限管理 查看用户 请打开终端&#xff0c;输入命令&#xff1a; $ who am i或者 $ who mom likes输出的第一列表示打开当前伪终端的用户的用户名&#xff08;要查看当前登录用户的用户名&#xff0c;去掉空格直接使用 whoami …

linux查看登录用户

1&#xff0c;w w,显示目前登入系统的用户信息 -f  开启或关闭显示用户从何处登入系统。 -h  不显示各栏位的标题信息列。 -l  使用详细格式列表&#xff0c;此为预设值。 -s  使用简洁格式列表&#xff0c;不显示用户登入时间&#xff0c;终端机阶段作业和程序所耗费…

Linux下查看当前用户和所属用户组方法总结

1、查看当前用户 &#xff08;1&#xff09;whoami &#xff08;2&#xff09;id -un &#xff08;3&#xff09;who -H &#xff08;4&#xff09;who&#xff08;查看当前登陆的所有用户&#xff0c;和who -H功能差不多&#xff09; 2、查看当前用户所属的组 &#xff08…

linux如何查看所有的用户和组信息?

首先打开终端&#xff08;这里是Ubuntu系统&#xff09;&#xff0c;其他的打开命令界面即可 然后输入命令行cat /etc/passwd&#xff0c;直接按下回车键即可 然后这里就会显示很多的信息&#xff0c;所有的用户都在这里面了 然后就是查看所有的组&#xff0c;同样的方法…

linux 查看用户信息

目录 /etc/passwd id命令 whois命令 whoami命令 who命令 w命令 finger命令 vlock命令 /etc/passwd 有的用户信息在根目录 /etc/passwd 文件内&#xff0c;而passwd的所有权限是root用户及root组用户&#xff0c;所有想要查看所有用户&#xff0c;需要root用户登录系统…

linux查看所有用户命令

1、Linux里查看所有用户 (1)在终端里.其实只需要查看 /etc/passwd文件就行了. (2)看第三个参数:500以上的,就是后面建的用户了.其它则为系统的用户. 或者用cat /etc/passwd |cut -f 1 -d : 2、用户管理相关命令 useradd命令 useradd 选项 用户名 -d 目录,指定用户主目录,如…

Linux命令之查看登录用户列表users

概述 users 命令 用于显示当前登录系统的所有用户的用户列表。每个显示的用户名对应一个登录会话。如果一个用户有不止一个登录会话&#xff0c;那他的用户名将显示相同的次数。 注&#xff1a;该命令与 who、w 类似。不过该命令只会显示登录用户名&#xff0c;信息简略。 语法…