java企业级开发复习

初识Spring框架

spring框架优点:

  • 非侵入式:业务逻辑纯净,不会出现框架代码,保证了spring框架的快速移植。
  • 降低耦合度:对象创建以及依赖关系由框架管理
  • 支持AOP编程序:集中处理通用任务,减少冗余
  • 支持声明式事务,省去手动编程的繁琐。

spring5的七大模块

核心容器模块(Core Container):支撑性作用,其他模块基石

  • Beans模块:提供BeanFactory,创建和管理Bean对象
  • Core模块:提供基本组成成分,包括IoC和DI
  • Context模块:基于Beans和Core模块,负责管理Bean的生命周期,依赖注入等。核心接口ApplicationContext,继承自BeanFactory
    img
  • SpEL模块:支持SpEL表达式语言

数据访问及继承模块Data Access/Integreation:用于访问和操作数据库数据

  • JDBC模块:提供JDBC抽象层,消除了冗长的JDBC配置代码。
  • ORM模块:为主流对象关系映射API提供集成层,继承主流对象关系映射框架。
    ORM:提供面向对象语言和关系型数据库之间映射(对象->表)(属性->字段)
    常见框架:MyBatis,Hibernate
  • OXM模块:提供对XML映射的抽象层支持,JAXB,Castor
  • JMS模块:用于传递消息,包含消息生产和消费
    消息传递指在不同和程序,系统,进程之间传递信息。
  • Transactions模块:事物管理

Web模块:基于ApplicationContext,提供和Web应用各种工具类

  • Web模块:针对WEb开发的集成特性,如大部分文件上传功能
  • Servlet模块:提供了Spring的模型((M),视图(V),控制器(C)以及Web应用程序的REST Web服务实现
  • WebSocket模块:Spring4.0新增,提供和WebSocket和SockJs实现,STOMP支持
    SockJs:实现浏览器与服务器实时通信的JavScipt库,解决一些老旧浏览器不支持WebSocket,若支持WebSocket则直接使用,否则提供其他协议,确保各种环境下都能实现实时通信。
  • Portlet模块:类似Servlet模块功能,提供Portlet环境下MVC实现

其他模块:
AOP模块:提供面向切面编程的支持,定义方法拦截器和切入点,将代码按照功能分离,降低耦合度。
Aspects模块:提供与AspectJ集成的支持
AspectJ是AOP的java实现,是一个独立的AOP框架。
Instrumentation模块:提供类工具的支持,实现了类加载器
Messaging模块:Spring4.0新增的模块,提供对消息传递体系和协议的支持。
Test模块:提供了对程序单元测试和集成测试的支持

入门案例:

  • 在maven项目中,加载四个基础包以及spring依赖包:
    四个基础包就是core模块下的四个子模块
    img
    依赖包:
    img
  • 定义pojo类:HelloSpring,属性和方法
  • src/main/resources目录下新建applicationContext.xml,注册HelloSpring为Bean,可在xml中为bean的属性赋值
    img
  • 使用单元测试,提供框架得到bean对象
    img

控制反转和依赖注入

控制反转(IoC):设计原则,降低代码之间耦合度。对象由Ioc容器统一管理,需要对象直接从容器获取,将对象的控制权从应用程序转移至IoC容器。

依赖注入(DI):spring框架创建对象时,动态将其依赖的对象注入到Bean组件中,构造方法注入或setter注入。

构造方法注入

spring容器调用构造方法注入被依赖的实例,spring读取配置信息后,通过反射调用示例的构造方法。
img
img

元素表示构造方法的参数,定义时候不分顺序
name:关联属性名
value:属性值
type:属性类型

setter注入

最主流,简单,直观,被注入类声明setter方法,通过setter方法注入值。
注意Users类需要为每个属性提供setter方法。
img
img

关于DAO层和Mapper层:
DAO层:
核心思想是数据访问逻辑和业务逻辑分离,DAO层提供抽象接口。
通常以业务实体为单位操作数据库,如getUserById,saveOrder 粒度较大。
通常不直接编写SQL语句,而是调用更底层的数据访问层。

Mapper层:
主要源于MyBatis框架。用于将SQL语句与Java代码分离。
侧重对表的操作,粒度较细。
需要直接编写SQL

实际项目中:若使用MyBatis框架,可以只用Mapper层;若一些大型项目,也可能同时使用DAO层和Mapper层。

若存在Bean之间的依赖关系,使用Setter注入的话,需要在applicationContext.xml配置文件中:注意ref参数
img

spring框架的Bean管理

(可能考设计模式:工厂,代理,单例)

IoC容器

常用方法了解即可
img

BeanFactory接口spring提供了几个实现类:

XmlBeanFactory,读取XML文件配置信息生成接口实例
img

ApplicationContext接口建立在BeanFactory接口基础上,丰富了接口特性
img

Bean的配置

Spring支持xml和properties两种格式,实际开发中最常用xml。xml文件根元素是可包含多个子元素,每个可以注册一个Bean

img
class指定的是实现类,scope只要求singleton 和 prototype(原型)

img

普通Bean通常只需要指定id(或者name)和class两个属性
img

Bean的实例化

构造方法实例化(不考)

创建类
img

配置applicationBean1.xml文件
img

测试
img

静态工厂实例化(也不考)

创建类
img

创建工厂类,定义静态方法返回一个类对象
img

配置applicaationBean2.xml
bean的 class写的是工厂的类路径 factory-method写的是工厂的静态方法
img

实例工厂实例化

创建类
img

创建实例工厂类,需要无参构造方法,定义普通工厂方法返回类对象
img

配置applicationBean3.xml文件
工厂和类都需要注册为Bean
类的factory-bean 指定为工厂的id
类的factory-method 指定为工厂的方法名
img

测试,直接getBean即可,调用工厂过程是透明的
img

Bean作用域

只要求单例和原型
img

作用域在applicationContext.xml中指定
img

Bean的装配方式

两种基于xml的装配方式:属性setter注入构造方法注入

这是最早看到的,通过 ref 指定依赖

属性方法注入
Bean必须满足以下两点:

  • Bean类必须提供默认无参构造
  • Bean类必须为需要注入的属性提供对应的setter方法
    (合理推测,底层是先调用无参构成生成对象,再通过setter方法初始化)

构造方法注入:
使用构造方法注入,需要在配置文件中通过元素的子元素指定构造方法的参数,其value属性指定参数的值

基于注解的装配

若Bean数量过多,xml配置过于臃肿,维护困难。

常用注解,只要求红字
img

关于@Autowired和@Resource的区别
@Autowired

  • spring特有注解,用于spring容器依赖注入
  • 注入方式:默认按类型注入,匹配到多个,则继续按照名称匹配。可以通过@Qualifier注解显式指定按名称注入
  • 可用于构造函数,方法,字段,参数
  • 有一个required属性,默认为true,表示bean必须存在容器中,否则抛出异常

@Resource

  • JavaEE标准注解
  • 默认按名称注入,找不到则会按类型注入
  • 通常用于字段和方法
  • 找不到bean,则注入null

基于注解装配开发流程:

导入依赖
@Transaction(事务管理) 和 @Async(异步方法调用)通过AOP实现的
img

配置applicationContext.xml 引入context约束,启动自动扫描
context约束:涉及命名空间机制,命名空间为了避免xml元素和属性名冲突。在spring配置里,不同功能模块对应不同的命名空间,context命名空间包含了上下文相关配置元素,如组件扫描等等。简单说,只有引入命名空间,才可以使用命名空间下的标签。
img

定义实体类,注意Scope是注解而非属性
img

定义DAO层
img

定义DAO实现类
使用Repository注册为Bean
img

定义Service层
img

实现Service层
使用Service注册为Bean,并且指定Bean的id
img

定义controller层
img

自动装配

这是另一种装配方式,与xml或注解方式无关。
img

Bean的生命周期

指的是Bean实例从被创建,到初始化,到销毁的过程。
singleton方式,spring能管理Bean的全生命周期
prototype方式,spring只负责创建bean实例

两个重要时间节点
Bean初始化后
Bean销毁前

对两个重要时间节点监控,可以自定义一些处理

  • 注解方式:@PostConstruct 和 @PreDestroy
    @PostConstruct 在Bean所有属性被设置好并且Spring容器完成对Bean的初始化后
    img

  • xml方式,在applicationStudent.xml中,需要引入Contxt约束

SpringAOP

AOP介绍

概述:面向切面编程,将相同业务逻辑的代码横向隔离,将重复的业务逻辑抽取到独立模块中,降低了横向业务逻辑之间的耦合,提高程序的重用性和开发效率。
(这里的横向指,各个业务模块的横切,各模块中部分相同的代码)

AOP的术语

  • 切面(Aspect):关注点形成的类(关注点指的是类中的重复代码),通常指被封装的,用于横向插入系统的功能类(如事务管理,日志记录)。在实际开发中,切面类需要在配置文件中通过标签指定。

  • 连接点(Joinpoint):指程序执行过程中某个特定的节点,如某方法调用时,或处理异常时。通常时一个方法的执行。
    (spring框架中通常不直接指定连接点,而是通过指定切入点间接指定连接点)

  • 切入点(Pointcut):当某个连接点满足预先指定的条件时,AOP定位到连接点,在连接点出插入切面,此连接点变成了切入点。

  • 通知/增强处理(Advice):插入的切面程序代码。可以理解为切面中的方法,就是切面的具体实现。

  • 目标对象(Target):指的是被插入切面的方法,即包含主业务逻辑的类对象。

  • 织入(Weaving):将切面代码插入到目标对象上,生成代理对象的过程。织入时间点可以为编译时,类加载时,运行时。编译时织入为静态代理,运行时植入为动态代理。

  • 代理(Proxy):通知应用到目标对象后,程序动态创建的通知对象,成为代理。代理类可以是和原类具有相同接口的子类,也可能是原类的子类,可以采用调用原类相同的方式调用代理类。

AOP的实现机制

这里只讨论JDK动态代理实现

SpringAOP默认使用JDK动态代理,提供lang.reflect.Proxy类实现的。
JDK动态代理可以实现无侵入式的代码扩展,可以再不修改源码的情况下增强某些方法。

必须先定义接口,因为jdk动态代理只能代理接口
img

实现类
img

切面类
img

代理对象的调用处理类,必须先实现invocationHandler接口。代理对象一般不直接处理函数调用,而是委托调用处理类对象的invoke方法调用。
img
img

newProxyInstance方法的三个参数,此方法用于返回代理对象。
img

img

关于类加载器
类加载器负责将java类的字节码文件加载到JVM中,使类可以再运行时被使用。

类加载器采用双亲委派机制,当一个类加载器收到类加载请求时候,首先把请求委派给父类加载器完成。每个层次加载器均如此,最后所有类加载请求会被传达到顶岑启动类加载器。只有当父类加载器自己无法完成加载时(搜索范围中没有找到要加载的类),子加载器才会尝试自己加载。

  • 启动类加载器:
    本地代码实现(如C++),是java类加载器最顶层。
    负责加载java核心类库,如java.lang,java.util等,这些类库位于JRE的lib目录下

  • 扩展类加载器:
    它是启动类加载器的子类
    负责加载JRE的lib/ext目录下的类库,这些类库是Java的标准扩展类

  • 应用程序类加载器
    它是扩展类加载器的子类
    负责加载用户类路径上指定的类库,一般是自己编写的Java类和第三方库

  • 自定义类加载器
    可以通过继承java.lang.ClassLoader类来创建自己的类加载器。

基于xml的AOP实现

xml配置xml基础知识

img

配置切面:
aop:aspect,将已定义的Bean转化为切面Bean,所以得先定义一个普通的SpringBean。 通过ref属性引用Bean,配置aop:aspect时,通常指定id和ref两个属性。
img
img

配置切入点:
aop:pointcut,可作为aop:configaop:aspect的子元素。
作为config元素子元素,说明是全局切入点,被所有切面共享。
作为aspect元素子元素,说明是切面切入点。
img

切入点表达式:
execution(访问修饰符 返回值类型 类路径 方法名 (方法参数) 抛出的异常类型)
eg: * com.itheima.demo03.UserDaoImpl.*(..)

配置通知:
img

xml配置aop练习:

导入AspectJ框架
img

创建接口,并创建实现类
img
img

创建通知类,定义通知。注意参数:JoinPoint,包含切入点的相关消息。
img

配置application.xml文件,引入AOP命名空间
需要将切面类注册为普通Bean,才可以在 <aop:aspect ref = "xmlAdvice">引用
img

测试类
img

基于注解的AOP实现

基本注解

img

案例练习

定义切面类,用@Aspect声明为切面
在切面类中定义一个无返回值的空切入点函数,用@Pointcut注解声明切入点
在通知函数上,通过不同通知方式注解,为通知函数指定增强方式,需要调用定义切入点的无参函数作为参数。
img

在xml文件中,引入AOP命名空间。
将userDao 即增强的目标类和切面类,注册为bean
启动AspectJ框架的自动代理功能(红字),也可以在启动类上加注解@EnableAspectJAutoProxy
img

关于启动类和配置类问题(未完成)

配置类是干嘛的,如何关联配置类和要配置的东西呢
启动类是特殊的配置类吗组件扫描注解,自动配置注解是啥
img

Spring的数据库编程

Spring的事务管理概述

posted @ 2025-04-21 17:15  violet0evergarden  阅读(9)  评论(0)    收藏  举报