spring入门aop和ioc
文章目录
- spring分层架构
- 表现层
- 服务层(业务层)
- 持久层
- spring核心
- ioc(控制反转)
- 1)**接下来是代码示例:**
- 2)**ioc容器的使用过程**
- 3)ioc中的bean管理
- 4)实例化bean的三种方式
- aop(面向切面开发)
- 定义
- 优势
- AOP底层原理
- AOP相关的术语
- AOP入门
- aop注解开发
- aop纯注解开发
- Di(依赖注入)
- 1)属性的set方法注入值的方式
- 2)构造方法赋值的方法
- 多配置文件
- 多配置文件
spring分层架构
-
表现层
springmvc
-
服务层(业务层)
spring ioc
-
持久层
mybatis
mybatis plus
hibernite
互联网项目,多ssm结构
spring核心
-
ioc(控制反转)
ioc将对象的创建权利交给spring框架,底层实际上是使用反射实现的。降低程序的耦合度
1)接下来是代码示例:
-
创建一个空的maven项目
-
引入一些基本依赖
<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.0.2.RELEASE</version></dependency><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.12</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency></dependencies>
-
准备实体类
// 创建一个接口 public interface UserService {public void hello(); } // 创建一个实体类 public class UserServiceImpl implements UserService {@Overridepublic void hello() {System.out.println("Hello, world!");} }
-
准备配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="us" class="实体类的路径"></bean> </beans>
-
在test中测试
// 常规方法@Testpublic void testUser() {// TODO: write test cases for UserServiceUserService userService = new UserServiceImpl();userService.hello();} // 基于ioc容器管理的方法,ioc是一个map key是对象的标识,value是ioc创建的对象@Testpublic void run1() {// 创建spring ioc工厂ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");// 获取beanUserService userService = (UserService) ac.getBean("us");userService.hello();}
上面就是一个关于ioc容器的示例
2)ioc容器的使用过程
ApplicationContext接口,这个工厂接口,使用这个接口就可以获得相应的Bean对象,该对象下有两个实现类
- ClassPathXmlApplicationContext:加载类路径下的spring配置文件(常用)
- FileSystemXmlApplicationContext:加载本地磁盘下的spring配置文件(让项目和配置文件分离管理,不常用)
3)ioc中的bean管理
- id属性:bean的别名,取名要求:必须要字母开头,可以使用数字,连字符,下划线,字母,不能出现特殊字符
- class属性:bean对象的全路径
- scope属性: bean对象的作用范围
- singleton:单例(默认)生命周期和配置文件一样
- prototype:多例,不是加载配置文件时创建,而是在获取实例对象时创建
- request: 多例,不常用,应用于web项目中,每个请求都会创建一个新的实例对象
- session:多例,不常用,应用于web项目中,向一个http session中共享一个实例
- init-method:bean对象创建时可以配置一个指定的方法自动调用
- destory-method:bean对象销毁时可以配置一个指定的方并自动调用
4)实例化bean的三种方式
-
默认是无参的构造方法
<bean id="us" class="实体类的路径"></bean>
-
静态工厂实例化方法(好处是可以自己编写业务逻辑)
准备一个静态工厂类
public class StaticFactory {public static UserService createUser() {// 编写业务逻辑// ......return new UserServiceImpl();} }
在xml配置文件中使用
<bean id="us1" class="com.qc.util.StaticFactory" factory-method="createUser"></bean>
-
实例化工厂实例化方式
准备一个可以实例化的类
public class DFactory {public UserService createUser() {// 编写业务逻辑return new UserServiceImpl();} }
在xml配置文件中使用
<bean id="factory" class="com.qc.util.DFactory"></bean><bean id="us2" factory-bean="factory" factory-method="createUser"></bean>
-
-
aop(面向切面开发)
定义
是一种编辑的范式,是OOP的延续,也是Spring框架中函数编程的一种衍生范式,利用AOP可以对业务的各个部分进行隔离,从而似的业务逻辑各部分之间的耦合度降低,提高了程序的重用性,同时提高了开发的效率,AOP采用横向抽取机制,取代了传统纵向继承体系。
优势
- 运行期间,不修改源代码的情况下,对已有的方法进行增强,减少重复代码
- 提高开发效率
- 方便维护
AOP底层原理
- 如果使用接口,则使用JDK动态代理技术,如果没有使用接口,使用的是继承则是cglib代理
AOP相关的术语
- Joinpoint(连接点)所谓连接点是指那些被连接到的点,在spring中,这些带点指的是方法,因为spring只支持方法类型的节点
- Pointcut(切入点)所谓切入点是我们要对哪些Joinpoint进行拦截的定义
- Advice(通知\通知)所谓通知就是指,拦截到Joinpoint之后所要做的情况就就是通知,通知分为,前置通知,后置通知,异常通知,最终通知,环绕通知(切面类中要完成的功能)
- Target(目标对象)代理的目标对象
- Weaving(织入)是指把增强应用到目标对象来创建新的代理对象的过程
- Proxy(代理)一个类被AOP织入增强后,就产生一个结果代理类
- Aspect(切面)是切入点+通知的结合,是自己编写和配置
AOP入门
-
导入坐标依赖
<dependency><groupId>aopalliance</groupId><artifactId>aopalliance</artifactId><version>1.0</version></dependency><!--Spring Aspects--><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>5.0.2.RELEASE</version></dependency><!--aspectj--><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.8.3</version></dependency>
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> </beans>
-
编写spirng配置文件中AOP的配置部分
<!-- bean管理--><bean id="us" class="com.qc.service.impl.UserServiceImpl"/><bean id="myAspect" class="com.qc.util.MyAspect"/><!-- 配置aop--><aop:config><!-- 配置切面--><aop:aspect ref="myAspect"><!-- 前缀通知--><aop:before method="log1" pointcut="execution(public void com.qc.service.impl.UserServiceImpl.save())"/><!-- 后置通知--><aop:after-returning method="log2"pointcut="execution(public void com.qc.service.impl.UserServiceImpl.save())"/><!-- 异常通知--><aop:after-throwing method="log3"pointcut="execution(public void com.qc.service.impl.UserServiceImpl.save())"/><!-- 最终通知--><aop:after method="log4"pointcut="execution(public void com.qc.service.impl.UserServiceImpl.save())"/><!-- 环绕通知--><aop:around method="aroundLog"pointcut="execution(public void com.qc.service.impl.UserServiceImpl.save())"/></aop:aspect></aop:config>
import org.aspectj.lang.ProceedingJoinPoint;public class MyAspect {// 自定义切面类 = 切入点+通知//通知public void log1() {System.out.println("前置增强的");}public void log2() {System.out.println("后置增强的");}public void log3() {System.out.println("异常增强的");}public void log4() {System.out.println("最终增强的");}public void aroundLog(ProceedingJoinPoint point) {try {log1();point.proceed(); // 目标方法调用log2();} catch (Throwable e) {e.printStackTrace();log3();} finally {log4();}} }
注意环绕通知使用的接口
通知类型
- 前置通知:目标方法执行前进行增强
- 后置通知:目标方法执行后进行增强
- 异常通知:目标方法出现异常后进行增强
- 最终通知:目标方法无论是否异常都进行增强
- 环绕通知:目标方法执行前后,都进行增强,不过需要自己书写
切入点表达式
- execution([修饰符] 返回值 包名.类名.方法名(参数))
- 修饰符可以省略不写
- 返回值类型不能省略,根据方法来编写返回值,可以用星号来代替
- 包名类型方法名是不能省略的,但是可以用星号来代替,也可以部分代替
- 参数如果是一个可以用星号来代替,如果是多个可以使用两个点
因此比较通用的表达式:
execution( com.qc.*.Service.save(…))
aop注解开发
给切面添加@Aspect,编写增强的方法,使用通知类型注解声明
<!-- 开启注解扫描--><context:component-scan base-package="com.qc"/><!-- 开启自动代理--><aop:aspectj-autoproxy/>
@Aspect @Component public class MyAspect {// 自定义切面类 = 切入点+通知//通知@Before("execution(* com.qc.*.*.*ServiceImpl.save(..))")public void log1() {System.out.println("前置增强的");}@AfterReturning("execution(* com.qc.*.*.*ServiceImpl.save*(..))")public void log2() {System.out.println("后置增强的");}@AfterThrowing("execution(* com.qc.*.*.*ServiceImpl.save*(..))")public void log3() {System.out.println("异常增强的");}@After("execution(* com.qc.*.*.*ServiceImpl.save*(..))")public void log4() {System.out.println("最终增强的");}@Around("execution(* com.qc.*.*.*ServiceImpl.save*(..))")public void aroundLog(ProceedingJoinPoint point) {try {log1();point.proceed(); // 目标方法调用log2();} catch (Throwable e) {e.printStackTrace();log3();} finally {log4();}} }
在每个方法上使用注解进行配置,和配置文件类似
通知类型注解:
- @Before 前置注解
- @AfterReturning 后置注解
- @AfterThrowing 异常注解
- @After 最终注解
- @Round 环绕注解
注意:在配置文件中开启自动代理
aop纯注解开发
@EnableAspectJAutoProxy 开启自动代理
-
Di(依赖注入)
依赖注入:在spring框架负责创建bean对象时,动态的将对象注入到其他的bean对象中
1)属性的set方法注入值的方式
-
声明变量并在需要依赖注入的地方设置set方法
-
在xml文件中配置该变量的值
<bean id="us" class="com.qc.service.impl.UserServiceImpl"><property name="userDao" ref=""></property><property name="name" value=""></property></bean>
参数说明:如果property中的是一个简单类型(基本类型和字符串),那么就使用value,否则就使用ref
2)构造方法赋值的方法
-
在需要的地方添加构造方法
-
在配置文件中使用带参数的构造方法传参
<bean id="userDao" class="com.qc.dao.impl.UserDaoImpl"></bean><bean id="us" class="com.qc.service.impl.UserServiceImpl"><constructor-arg name="userDao" ref="userDao"></constructor-arg></bean>
-
其他类型的参数传参
准备一个java类
public class CollectionBean {private String[] strs;private List<String> list;private Map<String, String> map;private Properties properties;public Properties getProperties() {return properties;}public void setProperties(Properties properties) {this.properties = properties;}public Map<String, String> getMap() {return map;}public void setMap(Map<String, String> map) {this.map = map;}public String[] getStrs() {return strs;}public List<String> getList() {return list;}public void setList(List<String> list) {this.list = list;}public CollectionBean() {}public void setStrs(String[] strs) {this.strs = strs;}public CollectionBean(String[] strs) {this.strs = strs;} }
-
不可变数组
<bean id="co" class="com.qc.service.CollectionBean"><property name="strs"><array><value>小美</value><value>小张</value><value>小王</value></array></property></bean>
-
可变集合
<bean id="co" class="com.qc.service.CollectionBean"><property name="list"><list><value>张三</value><value>李四</value><value>王五</value></list></property></bean>
-
map集合
<bean id="co" class="com.qc.service.CollectionBean"><property name="map"><map><entry key="name" value="zhangsan"></entry><entry key="age" value="18"></entry></map></property></bean>
-
其他类型
<bean id="co" class="com.qc.service.CollectionBean"><property name="properties"><props><prop key="username">zhangsan</prop><prop key="password">1234</prop></props></property></bean>
-
-
-
多配置文件
-
在配置文件中使用
<import resource="applicationContext.xml"></import>
-
创建工厂时直接加载多个配置文件
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml","applicationContext1.xml");
-
<props><prop key="username">zhangsan</prop><prop key="password">1234</prop></props></property></bean>```
-
多配置文件
-
在配置文件中使用
<import resource="applicationContext.xml"></import>
-
创建工厂时直接加载多个配置文件
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml","applicationContext1.xml");
-
相关文章:
spring入门aop和ioc
文章目录 spring分层架构表现层服务层(业务层)持久层 spring核心ioc(控制反转)1)**接下来是代码示例:**2)**ioc容器的使用过程**3)ioc中的bean管理4)实例化bean的三种方式 aop(面向切面开发) 定…...
使用Python创建Word文档
使用Python创建Word文档 安装python-docx库创建Word文档代码效果 在这篇文章中,我们将介绍如何使用 Python创建一个Word文档。首先,我们需要安装python-docx库,然后通过一段简单的代码示例展示如何创建和编辑Word文档。 安装python-docx库 …...
【设计模式】装饰器模式(结构型)⭐⭐
文章目录 1.概念1.1 什么是装饰器模式1.2 优点与缺点 2.实现方式3. Java 哪些地方用到了装饰器模式4. Spring 哪些地方用到了装饰器模式 1.概念 1.1 什么是装饰器模式 它允许用户在不修改现有对象的代码的情况下向对象添加新的功能;这种模式是通过创建一个包含该对…...
计算机网络--应用层
计算机网络–计算机网络概念 计算机网络–物理层 计算机网络–数据链路层 计算机网络–网络层 计算机网络–传输层 计算机网络–应用层 1. 概述 因为不同的网络应用之间需要有一个确定的通信规则。 1.1 两种常用的网络应用模型 1.1.1 客户/服务器模型(Client/Se…...
计算机网络 —— 网络层(IP数据报)
计算机网络 —— 网络层(IP数据报) 网络层要满足的功能IP数据报IP数据报格式IP数据报首部格式数据部分 IP数据报分片 我们今天进入网络层的学习。 网络层要满足的功能 网络层作为OSI模型中的第三层,是计算机网络体系结构的关键组成部分&…...
Clo3D导出服装动画,使用Unity3D展示
1.前言 Clo3D是一款应用于时装行业的3D服装设计软件,其强大的布料模拟算法可在3D空间中实现设计、制版、试衣和走秀,大幅提升数字作品逼真度和制作效率。为了让服装动画效果展示在Unity3D上模拟效果,需要Clo3D模拟出逼着的衣服动画。总体流程为Clo3D - Mixamo -Blen…...
LSTM 词语模型上的动态量化
原文链接 (beta) Dynamic Quantization on an LSTM Word Language Model — PyTorch Tutorials 2.3.0cu121 documentation 引言 量化涉及将模型的权重和激活值从浮点数转换为整数,这样可以缩小模型大小,加快推理速度,但对准确性的影响很小…...
STM32 proteus + STM32Cubemx仿真教程(第一课LED教程)
文章目录 前言一、STM32点亮LED灯的原理1.1GPIO是什么1.2点亮LED灯的原理 二、STM32Cubemx创建工程三、proteus仿真电路图四、程序代码编写1.LED灯操作函数介绍HAL_GPIO_WritePin函数原型参数说明示例代码 HAL_GPIO_TogglePin函数原型参数说明示例代码 2.代码编写3.烧写程序 总…...
享元模式
前言 享元模式:运用共享技术有效地支持大量细粒度的对象。 在享元对象内部并且不会随环境改变而改变的共享部分,可以称为是享元对象的内部状态,而随环境改变而改变的、不可以共享的状态就是外部状态了。事实上,享元模式可以避免大…...
R语言数据分析16-针对芬兰污染指数的分析与考察
1. 研究背景及意义 近年来,随着我国科技和经济高速发展,人们生活质量也随之显著提高。但是, 环境污染问题也日趋严重,给人们的生活质量和社会生产的各个方面都造成了许多不 利的影响。空气污染作为环境污染主要方面,更…...
Search用法Python:深入探索搜索功能的应用与技巧
Search用法Python:深入探索搜索功能的应用与技巧 在Python编程中,搜索功能是一项至关重要的技能,它能够帮助我们快速定位并处理数据。然而,对于初学者来说,如何高效地使用搜索功能可能会带来一些困惑。本文将从四个方…...
STM32的FreeRtos的学习
首先就是去官网下载一个源文件:FreeRtos官网 下载下来的是一个zip文件,解压缩了。 然后再工程文件夹中创建个文件夹: 在这个文件夹中创建3个文件夹: 然后开始把下载下来的文件夹中的文件挑选出来放到我们的工程文件夹中࿱…...
从零入手人工智能(2)——搭建开发环境
1.前言 作为一名单片机工程师,想要转型到人工智能开发领域的道路确实充满了挑战与未知。记得当我刚开始这段旅程时,心中充满了迷茫和困惑。面对全新的领域,我既不清楚如何入手,也不知道能用人工智能干什么。正是这些迷茫和困惑&a…...
Web前端指南
前言 前端开发员主要负责网站的设计、外观和感觉。他们设计引人入胜的在线用户体验,激发用户兴趣,鼓励用户重复访问。他们与设计师密切合作,使网站美观、实用、快捷。 如果您喜欢创造性思维、打造更好的体验并对视觉设计感兴趣,这将是您的理想职业道路。 探讨前端、后端以…...
AI菜鸟向前飞 — LangChain系列之十七 - 剖析AgentExecutor
AgentExecutor 顾名思义,Agent执行器,本篇先简单看看LangChain是如何实现的。 先回顾 AI菜鸟向前飞 — LangChain系列之十四 - Agent系列:从现象看机制(上篇) AI菜鸟向前飞 — LangChain系列之十五 - Agent系列&#…...
nodejs 第三方库 exiftool-vendored
exiftool-vendored 是一款可以帮助你快捷修改图片信息的第三方库。如果你想要批量修改图片信息的话,那么它是一个不错的选择。 1.导入第三方库 在控制台中执行下面代码即可。 npm install exiftool-vendored --save2.获取信息 这里给出例子。 const { exiftool …...
docker部署redis实践
1.拉取redis镜像 # 拉取镜像 sudo docker pull redis2.创建映射持久化目录 # 创建目录 sudo mkdir -p $PWD/redis/{conf,data}3. 运行redis 容器,查看当前redis 版本号 # 运行 sudo docker run --name redis -d -p 6379:6379 redis # 查看版本号 sudo docker ex…...
Web前端学习之路:深入探索学习时长与技能进阶的奥秘
Web前端学习之路:深入探索学习时长与技能进阶的奥秘 在数字化时代,Web前端技术成为了连接用户与互联网世界的桥梁。对于初学者来说,学习Web前端究竟需要多久,以及如何高效掌握相关技能,一直是困扰他们的难题。本文将从…...
如何不用命令创建用户
都有哪些操作: 1、在/etc/passwd添加一行 2、在/etc/shadow添加一行 3、在/etc/group添加一行 4、创建用户家目录 5、创建用户邮件文件 例如: 创建用户jerry 要求: uid:777 主组:hadoop(800)…...
基于Python实现可视化分析中国500强排行榜数据的设计与实现
基于Python实现可视化分析中国500强排行榜数据的设计与实现 “Design and Implementation of Visual Analysis for China’s Top 500 Companies Ranking Data using Python” 完整下载链接:基于Python实现可视化分析中国500强排行榜数据的设计与实现 文章目录 基于Python实现…...
VUE3 学习笔记(13):VUE3 下的Element-Plus基本使用
UI是页面的门面,一个好的UI自然令人赏心悦目;国人团队开发的ElementUI在众多UI中较为常见,因此通过介绍它的使用让大家更好的了解第三方UI的使用。 安装 Npm install element-plus --save 或 Cnpm install element-plus --save 配置 全局配置…...
MySql数据库安全加固
设置密码复杂度策略 查看密码策略 SHOW VARIABLES LIKE validate_password%; 设置密码策略 INSTALL PLUGIN validate_password SONAME validate_password.so; 设置登陆失败策略 安装插件(谨慎操作,可能会导致数据库卡死) install plug…...
Nginx(title小图标)修改方法
本章主要讲述Nginx如何上传网站图标。 操作系统: CentOS Stream 9 首先我们bing搜索ico网站图标在线设计,找到喜欢的设计分格并下载。 是一个压缩包 然后我们上传到nginx解压 [rootlocalhost html]# rz[rootlocalhost html]# unzip favicon_logosc.z…...
iOS 17.5中的一个漏洞
i0S 17.5中的一个漏洞 iOS 17.5中的一个漏洞会使已刚除的照片重新出现,并目此问题似乎会影响甚至已擦除并出售给他人的 iPhone 和 iPad. 在2023年9月,一位Reddit用户根据Apple的指南擦除了他的iPad,并将其卖给了一位朋友。然而,这…...
如何在 iPhone 上恢复已删除的短信
本文介绍如何检索已删除的短信和 iMessage 以及恢复丢失的消息。说明适用于 iOS 17 及更高版本。 如何在 iOS 17及更高版本中恢复文本 恢复已删除短信的最简单方法是使用 iOS 17。从删除短信到恢复它有 30 到 40 天的时间。 在“信息”的对话屏幕中,选择“过滤器”…...
矩阵练习1
73.矩阵置零 这道题相对简单。 首先我们需要标记需要置零的行和列,可以在遍历矩阵中的元素遇到0,则将其行首和列首元素置为0。在此过程中首行、首列会受影响,因此先用两个变量记录首行、首列是否需要被置0,接着遍历非首行、非首…...
【C++ | 拷贝赋值运算符函数】一文了解C++的 拷贝赋值运算符函数
😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 ⏰发布时间⏰:2024-06-09 1…...
Linux网络安全
文章目录 一、网络安全概述二、常用服务端口三、 ping命令的使用3.1、ping命令的简单概述3.2、ping命令的使用 四、资源限制4.1、查看系统资源限制4.2、临时修改资源限制4.3、永久修改资源限制 五、网络安全服务工具介绍5.1、ClamAV5.2、Nmap5.3、Wireshark5.4、Netcat5.5、Sno…...
Django 视图类
在Django框架中,视图类(Class-based views,简称CBVs)提供了一个面向对象的方式来定义视图。这种方式可以让你通过创建类来组织视图逻辑,而不是使用基于函数的视图(Function-based views,简称FBV…...
【Java面试】十七、并发篇(上)
文章目录 1、synchronized关键字的底层原理:Monitor2、synchronized相关2.1 为什么说synchronized是重量级锁2.2 synchronized锁升级之偏向锁2.3 synchronized锁升级之轻量级锁 3、Java内存模型JMM4、CAS4.1 CAS流程4.2 CAS底层实现 5、volatile关键字的理解5.1 可见…...
成品网站多少钱/网络营销策划需要包括哪些内容
中文汉化版,官方只有英文的。同时根据中国国情修改了部分验证规则。 这个插件支持大部分的浏览器,但由于有使用到了css3的阴影和圆角样式,所以在IE浏览器下无法看到圆角和阴影效果(万恶的IE)。 官方下载地址࿱…...
两个电脑的wordpress/免费的推文制作网站
导读:拖拖拉拉,机房的合作也算是接近了尾声了。在这个过程中,真心是感谢我的两个组员。这个机房合作,看似简单,但我的组员给我的帮助和感动,都是不可忽略的。记得刚开始的时候,我就说过…...
开发公司采购招聘/seo关键词分析
最近有个概念吵得很火,网络爬虫,但是基本都是用什么python或者JAVA写,貌似很少看到用c写的,我在网上找了一个,看到其实还是很简单的算法。 算法讲解:1.遍历资源网站 2.获取html信息 3.然后解析网址和图片…...
营销型网站建设费用怎么这么大/推广引流的10个渠道
这篇文章主要介绍了Java加密算法RSA代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下代码如下import javax.crypto.BadPaddingException;import javax.crypto.Cipher;import javax.crypto.IllegalBlockSi…...
深圳商城网站制作公司/做网站公司排名
Java NIO Buffer过程详解发布时间:2020-09-23 05:22:23来源:脚本之家阅读:102作者:xiaoaiwhc1, kevinlin前言在与NIO通道交互时使用Java NIO Buffer。 如您所知,数据从通道读入缓冲区,并从缓冲区写入通道。…...
c语言和网站建设的关系/石家庄新闻头条新闻最新今天
2019独角兽企业重金招聘Python工程师标准>>> boot2docker 用的Vbox,所以用VBox的命令做NAT #先要停掉所有的容器 docker ps -a -q | xargs docker stop #停到boot2docker boot2docker stop #如果容器的端口是 8080的话 (docker -p 18080:8080) VBoxManag…...