Spring学习笔记(新)

Spring框架概述

Spring是什么:

它是一个容器,是整合其他框架的框架,它的核心是IOC和AOP,它由20多个模块构成,在很多领域都提供优秀的解决方案。是可以在javaSE/EE中使用的轻量级框架。

Spring的特点

1、轻量级
由20多个模块构成,每个jar包都很小,小于1M,核心包在3M左右。对代码无污染。
2、面向接口编程
使用接口,就是面向灵活,项目的可扩展性、可维护性都极大的提高了。因为:接口不关系实现类的类型,使用时接口指向实现类,切换实现类即可切换整个功能。
3、AOP:面向切面编程
就是将公共的,通用的,重复的代码单独开发,在需要的时候反织回去,底层的原理是动态代理。
4、整合其他框架
它整合后使其他框架更易用。

什么是IOC

控制反转IOC是一个概念,一种思想,由Spring容器进行对象的创建和依赖注入,程序员在使用时直接取出使用。
正转:由程序员进行对象的创建和依赖注入称为正转,程序员说了算。
即程序员创建对象,程序员进行赋值。

反转:由Spring容器创建对象和依赖注入称为反转,将控制权从程序员手中夺走,交由Spring容器,称为反转。
Spring容器负责对象的创建。
正转程序员说了算,反转容器说了算。
配置pom.xml文件:

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.example</groupId>
  <artifactId>springStudy01</artifactId>
  <version>1.0-SNAPSHOT</version>



  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    <!--添加Spring依赖-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.2.5.RELEASE</version>
    </dependency>


  </dependencies>

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

基于xml的IOC

1、创建对象

2、给创建的对象赋值。
A。使用setter注入
注入分为简单类型注入和引用类型注入。
简单类型注入值使用value属性。
引用类型注入值使用ref属性。
必须要注意:使用setter注入必须提供无参的构造方法,必须提供setXXX()方法

B。使用构造方法注入
Student stu =new Student();
a.使用构造方法的参数名称进行注入值。

<bean id="school" class="com.study.pojo3.School">
       <constructor-arg name="name" value="电子科技大学"></constructor-arg>
       <constructor-arg name="address" value="cd"></constructor-arg>
   </bean>

b.使用构造方法的参数下标注入值。

<!--创建学生的对象,使用构造方法的参数下标注入值-->
<bean id="stu" class="com.study.pojo3.Student">
    <constructor-arg index="0" value="小一"></constructor-arg>
    <constructor-arg index="1" value="33"></constructor-arg>
    <constructor-arg index="2" ref="school"></constructor-arg>
</bean>

c.使用默认的构造方法的参数的顺序注入值。

 <!--创建学生的对象,使用默认的构造方法的参数顺序-->
    <bean id="stuSquence" class="com.study.pojo3.Student">
        <constructor-arg value="小二"></constructor-arg>
        <constructor-arg  value="56"></constructor-arg>
        <constructor-arg  ref="school"></constructor-arg>
    </bean>

项目案例

使用三层架构进行用户的插入操作。
界面层,业务逻辑层,数据访问层。

Spring会接管三层架构中哪些对象的创建?

非Spring接管下的三层项目构建:
实体类
数据访问层(接口。实现)
业务逻辑层(接口。实现)
页面层

基于注解的IoC

也成为DI,它是IOC的具体实现的技术。
用注解来进行创建对象并依赖注入。
1、创建对象的注解
@Component:可以创建任意对象。
@Controller:专门用来创建控制器的对象,这种对象可以接受用户的请求,可以返回处理结果的客户端。
@Service:专门用来创建业务逻辑层的对象,负责向下访问数据访问层,处理完毕后的结果返回给界面层。
@Repository:专门用来创建数据访问层的对象,负责数据库中的增删改查所有操作。
2、依赖注入的注解
值类型注入:
@Value:专门用来给简单类型注入值。
引用类型注入:
A。@Autowired:使用类型注入值,从整个bean工厂中搜索同源类型的对象进行注入。
B。@Autowired
@Qualifier:使用名称注入值,从整个bean工程中搜索相同名称的对象进行注入。

面向切面编程

什么是切面:公共的,通用的,重复的功能称为切面,面向切面编程就是将切面提取出来,单独开发,在需要调用的方法中通过动态代理的方式进行织入。

手写AOP框架

业务:图书购买业务。
切面:事务
1、第一个版本,业务和切面紧耦合在一起,没有拆分。
2、第二个版本,使用子类代理的方式拆分业务和切面。
3、第三个版本,使用静态代理,拆分业务和切面,此时切面紧耦合在业务中。
4、第四个版本,使用静态代理,拆分业务和业务接口,切面和切面接口。
5、第五个版本,使用动态代理完成第四个版本的优化。

Spring支持的AOP实现

Before、After、Throws、Around

AOP常用术语:

1、切面:就是那些重复的,公共的,通用的功能称为切面,例如:日志,事务,权限
2、连接点,就是目标方法,因为在目标方法中要实现目标方法的功能和切面功能。
3、切入点(Pointcut):多个连接点构成切入点,切入点可以是一个目标方法,可以是一个类中的所有方法,可以是某个包下的所有类中的方法。
4、目标对象:操作谁,谁就是目标对象
5、通知:来指定切入的时机,是在目标方法执行前还是执行后还是出错时,还是环绕目标方法切入切面功能。

AspectJ框架

是一个优秀的面向切面的框架,它扩展了java语言,提供了强大的切面实现。它因为是基于java语言开发的,所以无缝扩展。
易学易用。
AspectJ常见通知类型:
前置通知Before、后置通知AfterReturning,最终通知After、环绕通知Around、定义切入点@Pointcut
AspectJ的切入点表达式:
规范的公式:
execution(访问权限 方法返回值 方法声明(参数) 异常类型)
简化后的公式:
execution(方法返回值 方法声明(参数))
用到的符号:
*代表任意个任意的字符(通配符)
… 如果出现在方法的参数中,则代表任意参数
如果出现在路径中,则代表本路径及其所有子路径

 <!--添加AspectJ依赖-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aspectj</artifactId>
      <version>5.2.5.RELEASE</version>
    </dependency>

AspectJ的前置通知@Before
在目标方法执行前切入切面功能,在切面方法中不可以获得目标方法的返回值,只能得到目标方法的签名。
实现的步骤:
1、创建业务接口
2、创建业务实现
3、创建切面类
4、在applicationContext.xml文件中进行切面绑定

SM框架整合的步骤

1、建表
2、新建项目
3、修改目录
4、修改pom.xml文件,添加相关的依赖
5、添加mybatis模板
6、添加SqlMapConfig.xml文件
7、添加applicationContext_mapper.xml
8、添加applicationContext_service.xml
9、添加Users实体类,Account实体类
10、添加mapper包,添加UsersMapper接口和UsersMapper.xml文件并开发。
11、添加service包,添加UsersService接口和UsersServiceImpl实现类。
12、添加测试类进行功能测试

Spring的两种事务处理方式

1、注解式的事务
使用@Transactional注解完成事务控制,此注解可添加到类上,则对类中所有方法执行事务的设定,此注解可添加到方法上,只是此方法执行事务的处理。
2、声明式事务:在配置文件中添加一次,整个项目都遵循事务的设定。
Spring事务的五大隔离级别:
1、DEFAULT:采用 DB 默认的事务隔离级别
2、READ_UNCOMMITTED:未提交读
3、READ_COMMITTED:已提交读
4、REPEATABLE_READ:可重复读
5、SERIALIZABLE:串行读
Mysql默认的事务隔离级别是可重复读。
Oracle默认系统事务隔离级别是已提交读。

为什么添加事务管理器

JDBC:Connection con.commit() ; con.rollback();
MyBatis:SqlSession sqlSession.commit();sqlSession.rollback();
Hibernate:Session session.commit();session.rollback();

事务管理器用来生成相应技术的连接+执行语句的对象。
如果用mybatis框架,必须使用DataSourceTracsactionManager类完成处理。

事务的传播特性:
多个事务之间的合作,互斥等都可以通过设置事务的传播特性来解决。
事务的传播特性有七种:

  • PROPERGATION_MANDATORY 表示方法必须运行在一个事务中,如果当前事务不存在,就抛出异常

  • PROPAGATION_NESTED 表示如果当前事务存在,则方法应该运行在一个嵌套事务中。否则,它看起来和 PROPAGATION_REQUIRED 看起来没什么俩样

  • PROPAGATION_NEVER 表示方法不能运行在一个事务中,否则抛出异常

  • PROPAGATION_NOT_SUPPORTED 表示方法不能运行在一个事务中,如果当前存在一个事务,则该方法将被挂起

  • PROPAGATION_REQUIRED(增删改必用) 表示当前方法必须运行在一个事务中,如果当前存在一个事务,那么该方法运行在这个事务中,否则,将创建一个新的事务

  • PROPAGATION_REQUIRES_NEW 表示当前方法必须运行在自己的事务中,如果当前存在一个事务,那么这个事务将在该方法运行期间被挂起

  • PROPAGATION_SUPPORTS 表示当前方法不需要运行在一个是事务中,但如果有一个事务已经存在,该方法也可以运行在这个事务中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

mingshengda

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

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

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

打赏作者

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

抵扣说明:

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

余额充值