面向切面编程的介绍

领先的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的设计是为了让覆盖更简单

有几种选项

  1. 设置一些Spring Boot的属性 有数百种可用的预定义属性(被Spring提供的@ConfigurationProperties / *AutoConfiguration类使用)
  2. 自己显式的定义Bean,则Spring Boot不会创建
  3. 显式禁用一些自动配置
  4. 更换依赖项

示例:外部数据库

配置一个外部数据库  -例如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(按照以下顺序)

  1. /config 工作文件夹的子级文件夹
  2. 工作文件夹
  3. config 在classpath中的config包
  4. 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开启的
  • 自动配置可以通过以下方式进行控制
  1. 属性
  2. 显示Bean定义
  3. 禁用自动配置
  4. 替换依赖版本

深入了解Spring(第二天)相关推荐

  1. Spring第二弹—–搭建与测试Spring的开发环境

    PS:Spring既可以使用在javaSE中,也可以使用在javaWeb中. 使用Spring需要的jar 下载spring(我下载的是2.5.6版本),然后进行解压缩,在解压目录中找到下面jar文件 ...

  2. Spring第二讲--利用组件注解符精简Spring配置文件

    一.上次学习的内容 上次的学习是第一次接触Spring,上次我们对pom文件相关添加了依赖,主要是对采用Spring配置文件管理Bean进行了学习 二.今天要学习的内容 (1)利用组件注解符精简Spr ...

  3. 【Spring】Spring第二天 - AOP 详解、动态代理设计模式(JDK和cglib)

    一.AOP AOP 和 Filter 能够实现的 功能相似. AOP 和 Filter 的区别: AOP拦截的是类中方法(切点),只要方法能够被Spring管理,那么这个方法就能够被拦截. Filte ...

  4. 初学Java ssh之Spring 第二篇

    上一篇我们成功搭建好了spring开发的环境,接下来一起看看spring有什么神奇的地方吧(本人也是新手,有不太对的地方希望大神给指出便于修改呢,谢谢大家). 之前听说spring是在对xml文件的应 ...

  5. 聊聊、Spring 第二篇

    之前写了一篇<Spring环境搭建一>,感觉写的很烂,也许是时间有限,写的很急.今天我想再写写 Spring 的环境搭建,因为 Spring 的模块是可以单独拿出来用的,所以有很多的模块不 ...

  6. 【Spring第二篇】IOC:控制反转

    IOC:控制反转 什么是IOC? ​ 举个例子,我们有一个UserDao接口类,并且有三个UserDao实现类,分别是MysqlUserDaoImpl.OracleUserDaoImpl.UserDa ...

  7. 小白学习spring第二天

    第8节:Spring配置文件模块化 1.配置文件模块化的业务背景,为什么要进行配置文件模块化2.配置文件模块化的具体实现方式一: 创建多个并列的配置文件方式二: 创建一个主配置,多个从配置,主配置当中 ...

  8. SSH框架之Spring第二篇

    1.1 基于注解的IOC配置既注解配置和xml配置要实现的功能都是一样的,都是要降低程序间的耦合.只是配置的形式不一样.1.2 环境搭建1.2.1 第一步:拷贝必备的jar包需要多拷贝一个spring ...

  9. Spring 第二遍 02 spring IOC应用

    2019独角兽企业重金招聘Python工程师标准>>> package com.dao;import java.util.List;import com.model.User;pub ...

  10. spring第二冲刺阶段第十三天

    修改乱码,运行成功 转载于:https://www.cnblogs.com/1756696425ss/p/10116795.html

最新文章

  1. 《评人工智能如何走向新阶段》后记(再续4)
  2. 请参阅:Chrome开发者工具中的悬停状态
  3. tensorflow_yolo-v3 Intel Realsense 视频流处理模块 opencv.videocapture()
  4. 《算法竞赛入门经典》习题3-1 得分(Score,ACM、ICPC Seoul 2005,UVa1585)
  5. 如何复位一个流的failbit和eofbit
  6. lodash源码分析之Hash缓存
  7. Effective Java之消除受检警告(二十四)
  8. Matlab绘图--包含各种标示符的输入方法
  9. 【Python】PyCharm中Matplotlib绘图不能显示UI效果的问题解决
  10. Docker基础操作,原来这才是正确打开Docker的新方式!
  11. 【Flink】Flink StreamingFileSink
  12. python源码中的学习笔记_第11章_模块与包
  13. JSP技术-01-语法及运行原理
  14. Async.js——Node世界中被依赖最多的库No.3
  15. grads插值_GrADS使用简介
  16. 高数教材班复习Hint(3.1-3.6)
  17. 核方法(kernel Method)
  18. TX-LCN优化介绍
  19. 前端学习——静态网页制作
  20. 3D模型【长方形蜂巢】

热门文章

  1. 年薪几十万的北漂生活是怎样的
  2. 细数google和百度
  3. 基于单片机的汽车防碰撞系统设计与实现
  4. 社区疫情防控平台需求工程--软件需求规格说明
  5. 快印客人工智能名片,7个销售新玩法
  6. 声音播放装置及其补偿方法 电容模式, 无电容模式(capless mode)
  7. 基于Python的校园二手物品交易平台的设计与实现
  8. oracle的aud文件是什么,oracle asm实例的aud文件问题
  9. Yale开放课程博弈论5
  10. 不用律师!在线工具使用人工智能复核合同