深入了解Spring(第二天)
面向切面编程的介绍
领先的AOP技术
ASpect J
- 最早的AOP技术(1995年推出第一个版本)
- 一个完整的面向切面编程语言 使用字节码编程进行切面编织
Spring AOP
- 基于Java的AOP框架,集成了Aspect J 使用动态代理进行切面编织
- 专注于使用AOP解决企业问题
AOP
意为:面向切面编程,通过预编译放式和运行期动态代理实现程序功能统一维护的一种技术
AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的种行生范型。
利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
将业务逻辑中的横切关注点 通过切面的方式分离出来,在指定位置执行的过程
横切关注点是什么?
通用功能是在你的应用程序中许多地方都需要的
实例:
- 日志和跟踪
- 事务管理
- 安全
- 缓存
- 错误处理
- 性能监测
- 自定义业务规则
两个关注点说明
核心关注点:与核心业务息息相关的,缺少的话无法完成核心功能的逻辑
横切关注点:与核心业务无关,在多处业务中通用,缺少的话仍保证核心功能正常使用的逻辑
案例
版本1
版本2
版本3
创建@Aspect类
核心AOP概念
- 连接点 :程序执行过程中的一个点,例如方法的调用,或抛出异常
- 切入点 : 选择一个或者多个连接点的表达式
- Advice : 在选择的每个连接点执行代码
- 切面 :一个包括了切入点和Advice的模块
- 编织 : 将切面与主要代码进行结合的技术
前置Advice
使用@Before注解
返回之后Advice示例
使用带有returning属性的@AfterReturning注解
抛出异常之后Advice示例
使用带有throwing属性的@AfterThrowing注解 仅当抛出正确类型的异常时才会调用Advice
@AfterThrowing的Advice不会停止异常的传播 但是它可以抛出一个类型不同的异常
后置Advice示例
使用@After 注解 无论目标是否抛出异常,都会被调用
环绕Advice示例
使用@Around注解和一个ProceedingJoinPoint 继承自JoinPoint并增加了proceed()方法
标识符,表达式
常见的插入点标识符
execution(<方法模式>) 该方法必须匹配模式
- 可以串联起来创建复合切入点 a. &&(与),||(或),!(非) b. execution(<方法模式1>) || execution(<方法模式2>)
- 方法模式 : [修饰符] 返回值类型 [类的类型]方法名称(参数列表) [throws 异常类型]
示例表达式
通配符:
- * -匹配1次(返回值类型,包,类,方法名,参数)
- . -匹配0次或多次(参数或包)
命名切入点注解
Spring Boot
什么是Spring Boot?
一个用于Spring项目的有主见的运行时支持不同的项目类型,例如Web和Batch。帮你处理大多数低级的、可预测的设置
它不是一个代码生成器,也不是IDE插件
为什么使用Spring Boot?
- 为所有Spring开发提供更快、更广泛的入门体验
- 开始即有意见,但当需求开始偏离默认值时,应迅速退出
- 提供一系列项目的大类所共有的非功能性功能
- 嵌入式服务器、安全性、度量、运行状况检查和外部化配置等
怎么管理依赖?
- 现代Java应用程序需要大量的依赖项——如何确保它们兼容? Spring Boot JARs,Spring JARs,常见的第三方JAR等
- Spring Boot的父级或Starters来拯救这个问题 利用现有的依赖管理方案
- 建议使用现代的依赖管理工具进行精细的依赖管理 支持Maven、Gradle、Ivy
Spring Bootw父级POM
定义了关键依赖的版本 内部使用dependencyManagement部分 通过spring-boot-dependencies作为一个父级
Spring Boot “Starter”依赖
轻松引入多个协调的依赖项 包括“Transitive”依赖项
测试“Starter”依赖
通用测试库
可用的Starters
- 不是必需的,但强烈建议用于入门
- 通用的Java企业框架的协调依赖项 挑选你项目中需要的starters
通过@EnableAutoConfiguration启用自动配置
在Spring的Java配置类上使用@EnableAutoConfiguration注解 Spring Boot会自动创建它认为你需要的Beans
便捷用法:@SpringBootApplication
常见用法是同时使用@EnableAutoConfiguration、@SpringBootConfiguration和@ComponentScan
自动配置示例:DataSource,JdbcTemplate
@Conditional注解(允许条件下创建Bean)
@EnableAutoConfiguration中存在此注解
允许条件性的创建Bean 仅当其它Bean存在(或不存在)时创建
还有其它的:
@ConditionalOnClass、@ConditionalOnProperty . ..
@ConditionalOnMissingBean,@ConditionalOnMissingClass
这些自动配置类在哪里指定的
- @EnableAutoConfiguration 读取工厂文件 (spring-boot-autoconfigure/META-INF/spring.factories)
- 列出Boot使用的自动配置 可能被覆盖
- 在定义的Bean显式的创建之后处理自动配置类 你定义的Bean总是优先于自动配置
控制Spring Boot自动配置
Spring Boot的设计是为了让覆盖更简单
有几种选项
- 设置一些Spring Boot的属性 有数百种可用的预定义属性(被Spring提供的@ConfigurationProperties / *AutoConfiguration类使用)
- 自己显式的定义Bean,则Spring Boot不会创建
- 显式禁用一些自动配置
- 更换依赖项
示例:外部数据库
配置一个外部数据库 -例如MySQL 确保项目定义了JDBC驱动的依赖项
示例:配置日志级别
Boot能控制日志级别 只需要在application.properties里设置
与大多数日志框架一起使用 Java Util Logging、Logback、log4J、Log4J2
在哪里定义Spring Boot特定属性?
使用application.properties / yml
- 尽早读取:以作用到所有自动配置的可能性
- 某些属性不能在其它属性文件中设置 例如日志级别
-记住:这些文件中的任何设置都很容易被覆盖
Spring Boot用于Web应用程序
使用spring-boot-starter-web 确保Spring Web和Spring MVC都在classpath
Spring Boot自动配置
- 设置一个DispatcherServlet
- 设置内部配置以支持控制器
- 设置默认的资源位置(images,CSS,JavaScript)
- 设置默认的Message Converters
- 还有更多更多
Fat JARs和Spring Boot插件
一个“fat”JAR包含了它所有的依赖项 能直接使用java -jar 命令运行
从而创建 将插件添加到你的Maven POM或Gradle Build文件中 以通常的方式构建jar gradle assemble或mvn package
WAR或JAR
- 默认情况下,JAR和WAR格式都可以从Command Line运行 基于嵌入式的Tomcat(或Jetty)JARs
- 然而,当在传统的Web容器中运行WAR时,嵌入的Tomcat JAR会导致冲突
- 最佳实践:在传统容器构建WAR时,将Tomcat的依赖关系标记为peovided
Spring Boot插件-Maven
它的作用 扩展package以创建fat JAR 添加spring-boot:run以运行你的应用程序
Spring Boot的属性
外部化属性:application.properties
- 开发人员通常将属性外置到文件中 可以通过@PropertySource轻松完成 但开发人员对文件的命名/存储位置不同
- Spring Boot查找application.properties 以通常的方式提供给Environment 和 @Value 将需要的任何属性放在这里 -Boot会自动找到并加载它们
application.properties的位置
Spring Boot会在这些位置查找application.properties(按照以下顺序)
- /config 工作文件夹的子级文件夹
- 工作文件夹
- config 在classpath中的config包
- classpath根目录
基于这些文件创建PropertiesSource
Profiles和application.properties
Spring Boot将根据application-{profile}.properties惯例查找Profile特定属性
YAML支持
Spring Boot还支持YAML配置 更加简洁、缩进的文本格式(与JSON相似)
默认情况下会查找application.yml(在相同的位置) 缩进必须是2个空格 不要使用TAB来缩进
Profiles和application.yml
Profile特定属性可以放在一个文件里
“---”表示单独的逻辑文件
@ConfigurationProperties
使用@ConfigurationProperties来捕获属性
Spring Boot的@ConfigurationProperties允许开发人员将属性,尤其是具有层次结构的属性映射到一个类中
总结
- 属性可以在application.properties / yml 文件中设置
- Spring Boot的自动配置是通过@EnableAutoConfiguration开启的
- 自动配置可以通过以下方式进行控制
- 属性
- 显示Bean定义
- 禁用自动配置
- 替换依赖版本
深入了解Spring(第二天)相关推荐
- Spring第二弹—–搭建与测试Spring的开发环境
PS:Spring既可以使用在javaSE中,也可以使用在javaWeb中. 使用Spring需要的jar 下载spring(我下载的是2.5.6版本),然后进行解压缩,在解压目录中找到下面jar文件 ...
- Spring第二讲--利用组件注解符精简Spring配置文件
一.上次学习的内容 上次的学习是第一次接触Spring,上次我们对pom文件相关添加了依赖,主要是对采用Spring配置文件管理Bean进行了学习 二.今天要学习的内容 (1)利用组件注解符精简Spr ...
- 【Spring】Spring第二天 - AOP 详解、动态代理设计模式(JDK和cglib)
一.AOP AOP 和 Filter 能够实现的 功能相似. AOP 和 Filter 的区别: AOP拦截的是类中方法(切点),只要方法能够被Spring管理,那么这个方法就能够被拦截. Filte ...
- 初学Java ssh之Spring 第二篇
上一篇我们成功搭建好了spring开发的环境,接下来一起看看spring有什么神奇的地方吧(本人也是新手,有不太对的地方希望大神给指出便于修改呢,谢谢大家). 之前听说spring是在对xml文件的应 ...
- 聊聊、Spring 第二篇
之前写了一篇<Spring环境搭建一>,感觉写的很烂,也许是时间有限,写的很急.今天我想再写写 Spring 的环境搭建,因为 Spring 的模块是可以单独拿出来用的,所以有很多的模块不 ...
- 【Spring第二篇】IOC:控制反转
IOC:控制反转 什么是IOC? 举个例子,我们有一个UserDao接口类,并且有三个UserDao实现类,分别是MysqlUserDaoImpl.OracleUserDaoImpl.UserDa ...
- 小白学习spring第二天
第8节:Spring配置文件模块化 1.配置文件模块化的业务背景,为什么要进行配置文件模块化2.配置文件模块化的具体实现方式一: 创建多个并列的配置文件方式二: 创建一个主配置,多个从配置,主配置当中 ...
- SSH框架之Spring第二篇
1.1 基于注解的IOC配置既注解配置和xml配置要实现的功能都是一样的,都是要降低程序间的耦合.只是配置的形式不一样.1.2 环境搭建1.2.1 第一步:拷贝必备的jar包需要多拷贝一个spring ...
- Spring 第二遍 02 spring IOC应用
2019独角兽企业重金招聘Python工程师标准>>> package com.dao;import java.util.List;import com.model.User;pub ...
- spring第二冲刺阶段第十三天
修改乱码,运行成功 转载于:https://www.cnblogs.com/1756696425ss/p/10116795.html
最新文章
- 《评人工智能如何走向新阶段》后记(再续4)
- 请参阅:Chrome开发者工具中的悬停状态
- tensorflow_yolo-v3 Intel Realsense 视频流处理模块 opencv.videocapture()
- 《算法竞赛入门经典》习题3-1 得分(Score,ACM、ICPC Seoul 2005,UVa1585)
- 如何复位一个流的failbit和eofbit
- lodash源码分析之Hash缓存
- Effective Java之消除受检警告(二十四)
- Matlab绘图--包含各种标示符的输入方法
- 【Python】PyCharm中Matplotlib绘图不能显示UI效果的问题解决
- Docker基础操作,原来这才是正确打开Docker的新方式!
- 【Flink】Flink StreamingFileSink
- python源码中的学习笔记_第11章_模块与包
- JSP技术-01-语法及运行原理
- Async.js——Node世界中被依赖最多的库No.3
- grads插值_GrADS使用简介
- 高数教材班复习Hint(3.1-3.6)
- 核方法(kernel Method)
- TX-LCN优化介绍
- 前端学习——静态网页制作
- 3D模型【长方形蜂巢】