【书籍篇】Spring实战第4版 第1部分 Spring的核心
Spring实战第4版 第1部分 Spring的核心
- 一. 简化Java开发
- 1. 四大关键策略
- 2. spring容器
- 2.1 bean工厂
- 2.2 应用上下文
- 二. 装配Bean
- 1. spring配置
- 2. 混合配置
- 三. 高级装配
- 1. profile配置
- 2. 激活profile
- 3. 条件化的Bean
- 4. 处理自动装配的歧义性
- 4.1 设置首选
- 4.2 限定符
- 4.3 自定义限定符
- 5. Bean的作用域
- 5.1 Spring作用域
- 5.2 会话和请求作用域
- 5.2.1 问题
- 5.3 作用域代理
- 5.4 运行时值注入
- 四. 面向切面的Spring
一. 简化Java开发
1. 四大关键策略
- 基于POJO的轻量级和最小侵入性编程
- 过依赖注入和面向接口实现松耦合
- 给予切面和惯例进行声明式编程
- 通过切面和模板减少样式模板
2. spring容器
2.1 bean工厂
- 由org.springframework.beans.factory.BeanFactory接口定义
- 是最简单赌到容器,提供基本的DI支持。
2.2 应用上下文
- 由org.springframework.context.ApplicationContext接口定义。
- 基于bean工厂构建,提供框架级别的服务。
二. 装配Bean
1. spring配置
- xml配置
- javaConfig配置
- 自动化配置
- 组件扫描
- 自动装配(存在歧义性)
2. 混合配置
@Import({TestDemo.class, TestDemo2.class})
@ImportResource("testDemo.xml")
@Configuration
public class DemoConfig {...
}
<xml version="1.0" encoding="UTF-8"><beans ...><bean class="com.wpj.DemoConfig" /><import resource="testDemo.xml" /></beans>
</xml>
三. 高级装配
1. profile配置
@Profile("dev")
public class DemoConfig{...
}@Profile("prod")
public DataSource getMysqlDataSource() {...
}
<xml version="1.0" encoding="UTF-8"><beans ... profile="dev"><bean>...</bean></beans><beans ... profile="prod"><bean>...</bean></beans>
</xml>
2. 激活profile
# 如果没有设置active的只就会查到default值,如果均没有设置就会创建所有没有定义profile的bean
spring:profiles:default: ...active: ...## 有多种方式设置这两个属性
1. 作为DispatcherServlet的初始化参数
2. 作为Web应用赌到上下文参数
3. 作为JDNI条目
4. 作为环境变量
5. 作为JVM赌到系统属性
6. 在集成测试类上,使用@ActiveProfiles注解设置
<!-- 举例 web.xml中 -->
<xml version="1.0" encoding="UTF-8"><web-app version="2.5" ...><!-- 为上下文设置默认的profile--><context-param><param-name>spring.profiles.default</param-name><param-value>dev</param-value></context-param><!-- 为Servlet设置默认的profile--><servlet><servlet-name>...</servlet-name><servlet-class>...</servlet-class><init-param><param-name>spring.profiles.default</param-name><param-value>dev</param-value></init-param></servlet></web-app>
</xml>
3. 条件化的Bean
// 只有配置文件中配置了magic属性才会初始化DemoBean
@Bean
@Conditional(DemoCondition.class)
public DemoBean createBean() {return new BemoBean();
}public interface Condition {boolean matches(ConditionContext ctxt, AnotatedTypeMetadata metadata);
}public class DemoCondition implements Condition {public boolean matches(ConditionContext ctxt, AnotatedTypeMetadata metadata) {Environment env = context.getEnvironment();return env.containsProperty("magic");}
}
4. 处理自动装配的歧义性
4.1 设置首选
// 通过设置首选(primary避免自动装配的歧义性,同一类型只能设置一个,多个无效)
@Bean
@Primary
public class DemoConfig implements Config {...
}@Bean
@Primary
public DataSource getMysqlDataSource() {return new DataSource();
}
<xml version="1.0" encoding="UTF-8"><beans ...><bean id="..." class="..." primary="true"/></beans>
</xml>
4.2 限定符
// 通过Qualifier注解,将spring容器实例化出来的id为demoBean的实例注入进来
@Autowired
@Qualifier("demoBean")
public void setDemoBean(DemoBean demoBean) {this.demoBean = demoBean;
}
4.3 自定义限定符
略。。。详细可从书中p82获知
5. Bean的作用域
5.1 Spring作用域
单例(singleton)
原型(prototype)
会话(session)
请求(request)
@Component
// @scope("prototype")
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) // 建议使用常量
public class Demo {...
}@Bean
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public DataSource getMysqlDataSource() {return new DataSource();
}
<xml version="1.0" encoding="UTF-8"><beans ...><bean id="..." class="..." primary="true" scope="prototype" /></beans>
</xml>
5.2 会话和请求作用域
@Component
@Scope(value=WebApplicationContext.SCOPE-SESSIONproxyModed=scopedProxyMode.INTERFACES // 解决将会话或请求作用域的bean注入到单例bean中所遇到的问题
)
public DataSource getMysqlDataSource() {...
}
5.2.1 问题
/**
* 因为DataService是一个单例的bean,会在spring应用上下文加载的时候创建
* 当它被创建时,spring试图将DataSource注入setDataSource()方法中
* 但是DataSource时会话作用域,此时并不存在,知道某个用户进入系统,创建会后之后才会出现
*/
@Component
public class DataService {@Autowiredpublic void setDataSource(DataSource dataSource) {this.dataSource = dataSource;}
}// 另外,系统中将会由多个DataSource实例,每个用户一个。
// 我们不希望让spring注入某个固定的DataSource实例到DataService中
// 希望这个实例且恰好是当前会话会对应的那一个
5.3 作用域代理
@Component
@Scope(value=WebApplicationContext.SCOPE_SESSIONproxyModed=scopedProxyMode.INTERFACES // 生成基于接口的代理// proxyModed=scopedProxyMode.TARGET_CLASS // 生成基于类的代理
)
public DataSource getMysqlDataSource() {...
}
<xml version="1.0" encoding="UTF-8"><!--beans中需要声明spring的aop命名空间,这里忽略 --><beans ...><!-- 声明作用域 --><bean id="..." class="..." primary="true" scope="session"><aop:scoped-proxy /></bean><!-- proy-target-class为false生产基于接口的代理,反之为类的代理 --><bean id="..." class="..." primary="true" scope="session"><aop:scoped-proxy proy-target-class="false"/></bean></beans>
</xml>
5.4 运行时值注入
略。。。详细可从书中p88获知
四. 面向切面的Spring
相关文章:
【书籍篇】Spring实战第4版 第1部分 Spring的核心
Spring实战第4版 第1部分 Spring的核心 一. 简化Java开发1. 四大关键策略2. spring容器2.1 bean工厂2.2 应用上下文 二. 装配Bean1. spring配置2. 混合配置 三. 高级装配1. profile配置2. 激活profile3. 条件化的Bean4. 处理自动装配的歧义性4.1 设置首选4.2 限定符4.3 自定义限…...

【AI视野·今日Sound 声学论文速览 第八期】Wed, 20 Sep 2023
AI视野今日CS.Sound 声学论文速览 Wed, 20 Sep 2023 Totally 1 papers 👉上期速览✈更多精彩请移步主页 Daily Sound Papers Accelerating Diffusion-Based Text-to-Audio Generation with Consistency Distillation Authors Yatong Bai, Trung Dang, Dung Tran, K…...

【HSPICE仿真】输入网表文件(6)用户自定义分析输出(.measure)
.measure语句的基本用法 1. 语句顺序2. 测量参数类型3. Rise, Fall, Delay, and Power Measurements4. FIND 和 WHEN 函数5. Equation Evaluation/Arithmetic Expression6. AVG, EM_AVG, INTEG, MIN, MAX, PP, and RMS基本语法示例 7. 输出文件格式MEASFORMMEASOUTMEASFILEMEAS…...

安装Oracle 11g Error in invoking target报错
在redhat7.5上安装Oracle 11g,安装过程中到86%时出现Error in invoking target报错 原因是由于操作系统版本过高,导致lib链接报错 [oracleemrtest ~]$ cd O R A C L E H O M E / s y s m a n / l i b / [ o r a c l e e m r t e s t l i b ] ORACLE…...
AlarmManager闹钟管理者
AlarmManager是Android提供的一个全局定时器,利用系统闹钟定时发送广播。这样做的好处是:如果App提前注册闹钟的广播接收器,即使App退出了,只要定时到达,App就会被唤醒响应广播事件。 AlarmManager设置的PendingInten…...
Opencv实现的三次样条曲线(Cubic Spline)插值
1.样条曲线简介 样条曲线(Spline)本质是分段多项式实函数,在实数范围内有: S:[a,b]→R ,在区间 [a,b] 上包含 k 个子区间[ti−1,ti],且有: at0<t1<⋯<tk−1<tkb(1) 对应每一段区间 i 的存在多项式&…...

【ElasticSearch系列-03】ElasticSearch的高级句法查询Query DSL
ElasticSearch系列整体栏目 内容链接地址【一】ElasticSearch下载和安装https://zhenghuisheng.blog.csdn.net/article/details/129260827【二】ElasticSearch概念和基本操作https://blog.csdn.net/zhenghuishengq/article/details/134121631【二】ElasticSearch的高级查询Quer…...

【C++ 系列文章 -- 程序员考试 201811 下午场 C++ 专题 】
1.1 C 题目六 阅读下列说明和C代码,填写程序中的空(1) ~(5),将解答写入答题纸的对应栏内。 【说明】 以下C代码实现一个简单乐器系统,音乐类(Music)可以使用…...

javaEE -15( 13000字 JavaScript入门 - 2)
一:JavaScript(WebAPI) JS 分成三个大的部分 ECMAScript: 基础语法部分DOM API: 操作页面结构BOM API: 操作浏览器 WebAPI 就包含了 DOM BOM,这个是 W3C 组织规定的. (和制定 ECMAScript 标准的大佬们不是一伙人). 前面学的 JS 基础语法主要学的是 …...

AWS SAP-C02教程11-解决方案
本章中,会根据一些常见场景的解决方案或者AWS的某一方面的总结,带你了解AWS各个组件之间的配合使用、如何在解决方案中选择组件以及如何避开其本身限制实现需求。 目录 1 处理高并发解决方案(Handing Extreme Rates)2 日志管理(AWS Managed Logs)3 部署解决方案(Deploy…...
ClickHouse Java多参UDF
一、环境版本 环境版本docker clickhouse22.3.10.22 docker pull clickhouse/clickhouse-server:22.3.10.22二、XML配置 2.1 配置文件 # 创建udf配置文件 vim /etc/clickhouse-server/demo_function.xml<functions><function><type>executable</type&…...

修改Typora默认微软雅黑字体
修改Typora字体 写在前面 我最近在折腾windows电脑,从macos转像windows不容易啊,因为键盘快捷键经常弄错,这篇文章就是修改Typora中字体显示的问题。 正文内容 我发现在windows中,字体非常的难看,微软雅黑也太丑了…...

ESP32网络开发实例-Web服务器显示LM35传感器数据
Web服务器显示LM35传感器数据 文章目录 Web服务器显示LM35传感器数据1、LM35介绍2、软件准备3、硬件准备4、代码实现4.1 LM35与ADS1115驱动4.2 Web服务器显示LM35传感器数据本文将介绍有关如何在ESP32的Web服务器中显示LM35 温度传感器数据。 1、LM35介绍 LM35 用于测量物体或…...

ATFX汇市:美联储11月利率决议再暂停加息,紧缩货币政策或已接近尾声
ATFX汇市:11月美联储利率决议结果在今日2:00公布,其中提到:美联储寻求以2%的速度实现最大的就业和通胀率,为了达成这些目标,美联储决定将联邦基金利率的目标区间维持在5.25%~5.5%;委员会将会考虑货币政策的…...

g.Grafana之Gauge的图形说明
直接上操作截图 1. 创建一个新的Dashboard 2.为Dashboard创建变量 【General】下的Name与Label的名称自定义 【Query options】 下的Group可以填写Zabbix内的所有组/.*/ , 然后通过Regex正则过滤需要的组名 3.设置Dashboard的图形 我使用文字来描述下这个图 1.我们在dash…...

MySQL笔记--Ubuntu安装MySQL并基于C++测试API
目录 1--安装MySQL 2--MySQL连接 3--代码案例 1--安装MySQL # 安装MySQL-Server sudo apt install mysql-server# 设置系统启动时自动开启 sudo systemctl start mysql # sudo systemctl enable mysql# 检查MySQL运行状态 sudo systemctl status mysql# 进入MySQL终端 sudo…...

与AI对话的艺术:如何优化Prompt以获得更好的响应反馈
前言 在当今数字化时代,人工智能系统已经成为我们生活的一部分。我们可以在智能助手、聊天机器人、搜索引擎等各种场合与AI进行对话。然而,要获得有益的回应,我们需要学会与AI进行有效的沟通,这就涉及到如何编写好的Prompt。 与…...

outlook是什么软件outlook邮箱撤回邮件方法
Outlook是微软公司开发的一款邮件客户端,也是Office办公套件的一部分。它可以与多个电子邮件服务提供商(如Outlook.com、Exchange、Gmail等)集成,用户可以使用Outlook来发送、接收和管理电子邮件、日历、联系人、任务等信息。本篇…...

电脑如何录制小视频
如果你想在你的电脑上录制视频分享给你的朋友或者亲人,无论你的电脑是win还是mac,都可以在本篇文章中找到电脑录制视频的详细教程。小编为你们整理了2种不同系统电脑的录制详细流程,继续阅读查看吧! 第一部分:windows…...

vue使用百度富文本
🔥博客主页: 破浪前进 🔖系列专栏: Vue、React、PHP ❤️感谢大家点赞👍收藏⭐评论✍️ 1、下载UEditor 链接已放到文章中了 2、上传到项目目录中 一般上传到public下,方便到时候打包进去,以免…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...

MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...

使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...