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读取配置信息后,通过反射调用示例的构造方法。


name:关联属性名
value:属性值
type:属性类型
setter注入
最主流,简单,直观,被注入类声明setter方法,通过setter方法注入值。
注意Users类需要为每个属性提供setter方法。


关于DAO层和Mapper层:
DAO层:
核心思想是数据访问逻辑和业务逻辑分离,DAO层提供抽象接口。
通常以业务实体为单位操作数据库,如getUserById,saveOrder 粒度较大。
通常不直接编写SQL语句,而是调用更底层的数据访问层。
Mapper层:
主要源于MyBatis框架。用于将SQL语句与Java代码分离。
侧重对表的操作,粒度较细。
需要直接编写SQL
实际项目中:若使用MyBatis框架,可以只用Mapper层;若一些大型项目,也可能同时使用DAO层和Mapper层。
若存在Bean之间的依赖关系,使用Setter注入的话,需要在applicationContext.xml配置文件中:注意ref参数

spring框架的Bean管理
(可能考设计模式:工厂,代理,单例)
IoC容器
常用方法了解即可

BeanFactory接口spring提供了几个实现类:
XmlBeanFactory,读取XML文件配置信息生成接口实例

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

Bean的配置
Spring支持xml和properties两种格式,实际开发中最常用xml。xml文件根元素是

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

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

Bean的实例化
构造方法实例化(不考)
创建类

配置applicationBean1.xml文件

测试

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

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

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

实例工厂实例化
创建类

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

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

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

Bean作用域
只要求单例和原型

作用域在applicationContext.xml中指定

Bean的装配方式
两种基于xml的装配方式:属性setter注入和构造方法注入
这是最早看到的,通过
属性方法注入
Bean必须满足以下两点:
- Bean类必须提供默认无参构造
- Bean类必须为需要注入的属性提供对应的setter方法
(合理推测,底层是先调用无参构成生成对象,再通过setter方法初始化)
构造方法注入:
使用构造方法注入,需要在配置文件中通过
基于注解的装配
若Bean数量过多,xml配置过于臃肿,维护困难。
常用注解,只要求红字

关于@Autowired和@Resource的区别
@Autowired
- spring特有注解,用于spring容器依赖注入
- 注入方式:默认按类型注入,匹配到多个,则继续按照名称匹配。可以通过@Qualifier注解显式指定按名称注入
- 可用于构造函数,方法,字段,参数
- 有一个required属性,默认为true,表示bean必须存在容器中,否则抛出异常
@Resource
- JavaEE标准注解
- 默认按名称注入,找不到则会按类型注入
- 通常用于字段和方法
- 找不到bean,则注入null
基于注解装配开发流程:
导入依赖
@Transaction(事务管理) 和 @Async(异步方法调用)通过AOP实现的

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

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

定义DAO层

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

定义Service层

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

定义controller层

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

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动态代理只能代理接口

实现类

切面类

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


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


关于类加载器
类加载器负责将java类的字节码文件加载到JVM中,使类可以再运行时被使用。
类加载器采用双亲委派机制,当一个类加载器收到类加载请求时候,首先把请求委派给父类加载器完成。每个层次加载器均如此,最后所有类加载请求会被传达到顶岑启动类加载器。只有当父类加载器自己无法完成加载时(搜索范围中没有找到要加载的类),子加载器才会尝试自己加载。
-
启动类加载器:
本地代码实现(如C++),是java类加载器最顶层。
负责加载java核心类库,如java.lang,java.util等,这些类库位于JRE的lib目录下 -
扩展类加载器:
它是启动类加载器的子类
负责加载JRE的lib/ext目录下的类库,这些类库是Java的标准扩展类 -
应用程序类加载器
它是扩展类加载器的子类
负责加载用户类路径上指定的类库,一般是自己编写的Java类和第三方库 -
自定义类加载器
可以通过继承java.lang.ClassLoader类来创建自己的类加载器。
基于xml的AOP实现
xml配置xml基础知识

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


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

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

xml配置aop练习:
导入AspectJ框架

创建接口,并创建实现类


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

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

测试类

基于注解的AOP实现
基本注解

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

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

关于启动类和配置类问题(未完成)
配置类是干嘛的,如何关联配置类和要配置的东西呢
启动类是特殊的配置类吗组件扫描注解,自动配置注解是啥








浙公网安备 33010602011771号