Spring学习笔记——3
一、AOP简介
1.1、AOP概述
1.2、AOP思想的实现方案
1.3、模拟AOP的基础代码
1.4、AOP的相关概念
二、基于XML配置的AOP
2.1、XML方式AOP快速入门
2.2、XML方式AOP配置详解
2.3、XML方式AOP原理剖析
三、基于注解配置AOP
3.1、注解方式AOP基本使用
3.2、注解方式AOP配置详解
3.3、注解方式AOP原理解析
一、AOP简介
1.1、AOP概述
AOP,Aspect Oriented Programming ,面向切面编程,是对面向对象编程OOP的升华。OOP是纵向对一个事物的抽象,一个对象包括静态的属性信息,包括动态的方法信息等。而AOP是横向的对不同事物的抽象,属性与属性、方法与方法、对象与对象都可以组成一个切面,而用这种思维去设计编程的方式叫做面向切面编程
1.2、AOP思想的实现方案
代理技术 动态代理技术,在运行期间,对目标对象的方法进行增强,代理对象同名方法内可以执行原有逻辑的同时嵌入执行其他增强逻辑或其他对象的方法
1.3、模拟AOP的基础代码
其实在之前学习BeanPostProcessor时,在BeanPostProcessor的after方法中使用动态代理对Bean进行了增强,实际存储到单例池singleObjects中的不是当前目标对象本身,而是当前目标对象的代理对象Proxy,这样在调用目标对象方法时,实际调用的是代理对象Proxy的同名方法,起到了目标方法前后都进行增强的功能,对该方式进行一下优化,将增强的方法提取出去到一个增强类中,且只对com.itheima.service.impl包下的任何类的任何方法进行增强
pubiic class MyAdvice {
public void beforeAdvice ( ) {
system. out. println ( "beforeAdvice..." ) ;
)
public void afterAdvice ( ) {
System . out. println ( "afterAdvice..." ) ;
}
}
public class MockAopBeanPostProcessor implements BeanPostProcessor , ApplicationContextAware {
private ApplicationContext applicationContext;
@Override
public Object postProcessAfterInitialization ( Object bean, String beanName) throws BeansException {
if ( bean. getClass ( ) . getPackage ( ) . getName ( ) . equals ( "com.Smulll.service.Impl" ) ) {
Object beanProxy = Proxy . newProxyInstance (
bean. getClass ( ) . getClassLoader ( ) ,
bean. getClass ( ) . getInterfaces ( ) ,
( Object proxy, Method method, Object [ ] args) -> {
Myadvice myadvice = applicationContext. getBean ( Myadvice . class ) ;
myadvice. before ( ) ;
Object invoke = method. invoke ( bean, args) ;
myadvice. after ( ) ;
return invoke;
} ) ;
return beanProxy;
}
return null ;
}
@Override
public void setApplicationContext ( ApplicationContext applicationContext) throws BeansException {
this . applicationContext = applicationContext;
}
}
1.4、AOP的相关概念
概念
单词
解释
目标对象
Target
被增强的方法所在的对象
代理对象
Proxy
对目标对象进行增强后的对象,客户端实际调用的对象
连接点
Joinpoint
目标对象中可以被增强的方法
切入点
Pointcut
目标对象中实际被增强的方法
通知\增强
Advice
增强部分的代码逻辑
切面
Aspect
增强和切入点的组合
织入
Weaving
将通知和切入点组合动态组合的过程
二、基于XML配置的AOP
2.1、XML方式AOP快速入门
前面我们自己编写的AOP基础代码还是存在一些问题的,主要如下
被增强的包名在代码写死了
通知对象的方法在代码中写死了
if ( bean. getClass ( ) . getPackage ( ) . getName ( ) . equals ( "com.Smulll.service.Impl" ) ) {
Object beanProxy = Proxy . newProxyInstance (
bean. getClass ( ) . getClassLoader ( ) ,
bean. getClass ( ) . getInterfaces ( ) ,
( Object proxy, Method method, Object [ ] args) -> {
Myadvice myadvice = applicationContext. getBean ( Myadvice . class ) ;
myadvice. before ( ) ;
Object invoke = method. invoke ( bean, args) ;
myadvice. after ( ) ;
return invoke;
} ) ;
return beanProxy;
}
通过配置文件的方式去解决上述问题
配置哪些包、哪些类、哪些方法需要被增强
配置目标方法要被哪些通知方法所增强,在目标方法执行之前还是之后执行增强
配置方式的设计、配置文件(注解)的解析工作,Spring已经帮我们封装好了
xml方式配置AOP的步骤:
导入AOP相关坐标;
< dependency>
< groupId> org.aspectj groupId>
< artifactId> aspectjweaver artifactId>
< version> 1.9.6 version>
dependency>
准备目标类、准备通知类,并配置给Spring管理;
配置切点表达式(哪些方法被增强);
配置织入(切点被哪些通知方法增强,是前置增强还是后置增强)。
< beans xmlns = " http://www.springframework.org/schema/beans"
xmlns: xsi= " http://www.w3.org/2001/XMLSchema-instance"
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/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
" >
< bean id = " userService" class = " com.Smulll.service.Impl.UserServiceImpl" > bean>
< bean id = " myadvice" class = " com.Smulll.advice.Myadvice" > bean>
< aop: config>
< aop: pointcut id = " mtPointcut" expression = " execution(void com.Smulll.service.Impl.UserServiceImpl.show1())" />
< aop: aspect ref = " myadvice" >
< aop: before method = " before" pointcut-ref = " mtPointcut" > aop: before>
< aop: after method = " after" pointcut-ref = " mtPointcut" > aop: after>
aop: aspect>
aop: config>
beans>
2.2、XML方式AOP配置详解
xml配置AOP的方式还是比较简单的,下面看一下AOP详细配置的细节:
切点表达式的配置方式
< aop: config>
< aop: pointcut id = " mtPointcut" expression = " execution(void com.Smulll.service.Impl.UserServiceImpl.show1())" />
< aop: pointcut id = " mtPointcut2" expression = " execution(void com.Smulll.service.Impl.UserServiceImpl.show2())" />
aop: config>
pointcut
属性可以再后面直接写上要结合的切点
< aop: config>
< aop: pointcut id = " mtPointcut" expression = " execution(void com.Smulll.service.Impl.UserServiceImpl.show1())" />
< aop: aspect ref = " myadvice" >
< aop: before method = " before" pointcut-ref = " mtPointcut" > aop: before>
< aop: after method = " after" pointcut = " execution(void com.Smulll.service.Impl.UserServiceImpl.show1())" > aop: after>
aop: aspect>
aop: config>
切点表达式的配置语法 execution([访问修饰符]返回值类型 包名.类名.方法名(参数))
其中
访问修饰符可以省略不写;
返回值类型、某一级包名、类名、方法名可以使用*
表示任意;
包名与类名之间使用单点.
表示该包下的类,使用双点..
表示该包及其子包下的类;
参数列表可以使用两个点..
表示任意参数。
//表示访问修饰符为public、无返回值、在com.itheima . aop包下的TargetImpl类的无参方法show
execution(public void com.itheima.aop.TargetImpl.show())
//表述com.itheima.aop包下的TargetImpl类的任意方法
execution(* com.itheima.aop.TargetImpl.*(..))
//表示com.itheima.aop包下的任意类的任意方法
execution(* com.itheima.aop.*.*(..))
//表示com.itheima. aop包及其子包下的任意类的任意方法
execution(* com.itheima.aop..*.*(..))
//表示任意包中的任意类的任意方法
execution(* *..*.*(..) )
通知名称
配置方式
执行时机
前置通知
目标方法执行之前执行
后置通知
目标方法执行之后执行,目标方法异常时,不在执行
环绕通知
目标方法执行前后执行,目标方法异常时,环绕后方法不在执行
异常通知
目标方法抛出异常时执行
最终通知
不管目标方法是否有异常,最终都会执行
通知方法再被调用时,Spring可以为其传递一些必要的参数
参数类型
作用
JoinPoint
连接点对象,任何通知都可使用,可以获得当前目标对象、目标方法参数等信息
ProceedingJoinPoint
JoinPoint子类对象,主要是在环绕通知中执行proceed(),进而执行目标方法
Throwable
异常对象,使用在异常通知中,需要在配置文件中指出异常对象名称
public void 通知方法名称( JoinPoint joinPoint) {
system. out. println ( joinPoint. getArgs ( ) ) ;
system. out. println ( joinPoint. getTarget ( ) ) ;
System . out. println ( joinPoint. getstaticPart ( ) ) ;
}
Throwable对象
public void afterThrowing ( JoinPoint joinPoint, Throwable th) {
System . out. println ( "异常对象是:" + th+ "异常信息是:" + th. getMessage ( ) ) ;
}
< aop: after-throwing method = " afterThrowing" pointcut-ref = " myPointcut" throwing = " th" />
spring定义了一个Advice接口,实现了该接口的类都可以作为通知类出现
public interface Advice {
}
2.3、XML方式AOP原理剖析
动态代理的实现的选择,在调用getProxy()
方法时,我们可选用的AopProxy接口有两个实现类,如上图,这两种都是动态生成代理对象的方式,一种就是基于JDK的,一种是基于Cglib的
代理技术
使用条件
配置方式
JDK动态代理技术
目标类有接口,是基于接口动态生成实现类的代理对象
目标类有接口的情况下,默认方式
Cglib 动态代理技术
目标类无接口且不能使用final修饰,是基于被代理对象动态生成子对象为代理对象
目标类无接口时,默认使用该方式;目标类有接口时,手动配置
Target target = new Target ( ) ;
Advices advices = new Advices ( ) ;
Enhancer enhancer = new Enhancer ( ) ;
enhancer. setSuperclass ( Target . class ) ;
enhancer. setCallback ( ( MethodInterceptor ) ( o, method, objects, methodProxy) -> {
advices. before ( ) ;
object result = method. invoke ( target, objects) ;
advices. afterReturning ( ) ;
return result;
} ) ;
Target tagetProxy = ( Target ) enhancer. create ( ) ;
String result = targetProxy. show ( "haohao" ) ;
三、基于注解配置AOP
3.1、注解方式AOP基本使用
Spring的AOP也提供了注解方式配置,使用相应的注解替代之前的xml配置,xml配置AOP时,我们主要配置了三部分:目标类被Sprina容器管理、通知类被Spring管理、通知与切点的织入(切面),如下:
< bean id = " target" class = " com.itheima.aop.TargetImpl" > bean>
< bean id = " advices" class = " com.itheima.aop.Advices" > bean>
< aop: config proxy-target-class = " true" >
< aop: aspect ref = " advices" >
< aop: around method = " around" pointeut = " execution(* com.itheima.aop.*.*(..))" />
aop: aspect>
aop: config>
配置aop,其实配置aop主要就是配置通知类中的哪个方法(通知类型)对应的切点表达式是什么 注解@Aspect
、@Around
需要被Spring解析,所以在Spring核心配置文件中需要配置aspectj的自动代理
< aop: aspectj-autoproxy>
3.2、注解方式AOP配置详解
各种注解方式通知类型
@Before ( "execution( *com. itheima.aop.*.*(..))" )
public void before ( JoinPoint joinPoint) { }
@AfterReturning ( "execution(* com.itheima.aop.*.*(..))" )
public void afterReturning ( JoinPoint joinPoint) { }
@Around ( "execution (* com.itheima.aop.*.*(..))" )
public void around ( ProceedingJoinPoint joinPoint) throws Throwable { }
@AfterThrowing ( "execution(* com.itheima.aop.*.*(..))" )
public void afterThrowing ( JoinPoint joinPoint) { }
@After ( "execution(* com.itheima.aop.*.*(..))" )
public void after ( JoinPoint joinPoint) { }
@Component
@Aspect
public class MyAdvice {
@Pointcut ( "execution(* com.Smulll.service.Impl.*.*(..))" )
public void pointcut ( ) { } ;
@Before ( "MyAdvice.pointcut()" )
public void before ( ) {
System . out. println ( "前置增强" ) ;
}
@AfterReturning ( "MyAdvice.pointcut()" )
public void afterreturning ( ) {
System . out. println ( "后置增强" ) ;
}
@Around ( "MyAdvice.pointcut()" )
public Object around ( ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
System . out. println ( "环绕前增强。。。" ) ;
Object proceed = proceedingJoinPoint. proceed ( ) ;
JoinPoint. StaticPart staticPart = proceedingJoinPoint. getStaticPart ( ) ;
Object target = proceedingJoinPoint. getTarget ( ) ;
System . out. println ( "表达式:" + staticPart) ;
System . out. println ( "当前目标对象为:" + target) ;
System . out. println ( "环绕后增强。。。" ) ;
return proceed;
}
@AfterThrowing ( "MyAdvice.pointcut()" )
public void afterThrowAdvice ( ) {
System . out. println ( "异常抛出通知。。。报异常时执行" ) ;
}
@After ( "MyAdvice.pointcut()" )
public void after ( ) {
System . out. println ( "最终增强" ) ;
}
}
使用配置类进行spring的配置
@Configuration
@ComponentScan ( "com.Smulll" )
@EnableAspectJAutoProxy
public class Springconfig {
}
3.3、注解方式AOP原理解析
之前在使用xml配置AOP时,是借助的Spring的外部命名空间的加载方式完成的,使用注解配置后,就抛弃了
标签,而该标签最终加载了名为AspectJAwareAdvisorAutoProxyCreator的BeanPostProcessor ,最终,在该BeanPostProcessor中完成了代理对象的生成。
同样,从aspectj-autoproxy标签的解析器入手
this . registerBeanDefinitionParser ( "aspectj-autoproxy" , new AspectJAutoProxyBeanDefinitionParser ( ) ) ;
你可能感兴趣的:(SSM框架,spring,学习,笔记)
使用Wiki.js配置LDAP认证的编程学习
飘逸徜徉在自由的云端
javascript 学习 前端 编程学习
在本文中,我们将探讨如何使用Wiki.js配置LDAP认证。LDAP(轻量级目录访问协议)是一种常用的用于身份验证和授权的协议,它可以让我们将用户凭据存储在中央目录服务器上,以便在不同的应用程序中进行身份验证。Wiki.js是一款功能强大的开源知识管理和文档协作平台,它提供了许多扩展功能,其中之一就是支持LDAP认证。通过配置LDAP认证,我们可以让用户使用他们在LDAP服务器上的凭据登录Wiki
使用Docker搭建Flink集群
O_1CxH
Flink大数据 Kafka大数据 docker flink 容器
目录使用Docker搭建Flink集群docker-compose一键搭建步骤附录参考资料使用Docker搭建Flink集群在学习大数据框架的时候,需要一个真实的环境。我们知道,像spark、flink这些计算框架都有多种运行模式:在本地使用多线程模拟集群真正的分布式集群如果直接在IDE(Intellj)里面编译和运行写好的程序,实际上是用的前一种运行模式;如果想尝试真正的生产环境中任务的提交和管
Java 核心与应用:Java 输入输出流概述
星核日记
《Java 核心与应用》 java 开发语言
目录Java核心与应用:Java输入输出流概述主题:Java核心与应用:引言学习目标1.Java输入输出流基础1.1输入输出流的概念1.1.1流的分类1.1.2常用输入输出流接口1.2输入输出流的接口继承图1.3常用输入输出流接口的方法1.3.1`InputStream`常用方法1.3.2`OutputStream`常用方法1.4装饰器模式在IO体系中的应用1.4.1装饰器模式示例1.4.2装饰器
mybatis-plus逆向code generator pgsql实践
松树戈
工具使用 mybatis springboot
mybatis-plus逆向codegeneratorpgsql实践环境准备重要工具的版本供参考pom依赖待逆向的SQL配置文件CodeGenerator配置类配置类说明环境准备重要工具的版本jdk1.8.0_131springboot2.7.6mybatis-plus3.5.7pgsql14.15供参考pom依赖4.0.0com.tghparent-demo0.0.1-SNAPSHOTparen
Python 自动排班表格(代码分享)
趣享先生
Python案例分享专栏 python 开发语言
✅作者简介:2022年博客新星第八。热爱国学的Java后端开发者,修心和技术同步精进。个人主页:JavaFans的博客个人信条:不迁怒,不贰过。小知识,大智慧。当前专栏:Java案例分享专栏✨特色专栏:国学周更-心性养成之路本文内容:Python自动排班表格(代码分享) 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。文章目录前言问题描述解决步骤1
学习STM32的理由
zzxyd_qiao
stm32 物联网
为什么要写这篇文章呢?这是一篇关于嵌入式入门的文章,因为我在进入嵌入式这个领域之前,也是遇到过非常多非常多的困难,所以呢,希望写下这篇文章,让大家看看少走弯路。首先,我打算先列举一下大家问得最多的几个问题,然后我们一起由问题切入进行一些讨论。问题1:我是学单片机好还是直接学STM32好???问题2:STM32如何才能快速入门?问题3:为什么是STM32呢?为什么不是ARM9,ARM11呢?下面我将
理论一、大模型—概念
伯牙碎琴
大模型 自然语言处理 ai
一、总述大模型通常指的是参数规模庞大、训练难度较高的人工智能模型。随着深度学习技术的发展,研究人员和企业越来越倾向于构建更大的模型,以提高模型的性能和泛化能力。这些大模型往往需要大量的数据和计算资源来训练,并且在实际应用中通常表现出色。大模型全称是大型语言模型(LLM,LargeLanguageModel),这个“大”主要指模型结构容量大,结构中的参数多,用于预训练大模型的数据量大。一个大模型可以
Python:第三方库
衍生星球
python 第三方库
1.第三方Python库库名用途pip安装指令NumPy矩阵运算pipinstallnumpyMatplotlib产品级2D图形绘制pipinstallmatplotlibPIL图像处理pipinstallpillowsklearn机器学习和数据挖掘pipinstallsklearnRequestsHTTP协议访问pipinstallrequestsJieba中文分词pipinstalljieba
海康sip服务器地址_一篇文章涵盖-完整SIP协议操作流程
OZARGPT
海康sip服务器地址
完整SIP协议操作流程此部分使用一个简单示例介绍了SIP的基本操作。它实际上是一个学习辅导,没有包含任何正式的说明。第一个示例显示了SIP的基本功能:终端定位,希望通信的意愿,创建会话参数的协商和创建会话后会话拆线。图表1显示了一个典型的介于两个用户之间的SIP消息交互,两个用户分别是Alice和Bob。(每个消息都通过一个带字母F的标签来标注,文本号码说明一个标注号码)。在这个例子中,Alice
千里马平台介绍(2)
大道不孤,众行致远
平台介绍 java
千里马平台的核心是微服务架构。微服务架构有很多种,我们锁定springCloud。服务注册与发现锁定nacos,网关为springgateway。选型曾经花了很多时间,做了很多比较,我认为这是目前最优组合。不选用这套架构的同学们可以转学了,大家不是一条道上的。版本选择也是个头痛问题,有关版本的问题可见版本说明千里马架构当前选择版本如下:2.3.2.RELEASEHoxton.SR92.2.6.R
自动驾驶系列—颠覆未来驾驶:深入解析自动驾驶线控转向系统技术
学步_技术
自动驾驶 自动驾驶 人工智能 机器学习 线控系统
欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中一起航行,共同成长,探索技术的无限可能。探索专栏:学步_技术的首页——持续学习,不断进步,让学习成为我们共同的习惯,让总结成为我们前进的动力。技术导航:人工智能:深入探讨人工智能领域核心技术。自动驾驶:分享自动
学习计划:第三阶段(第七周)
狐凄
学习 学习 python 开发语言
目录第三阶段:继承与多态第7周:综合运用继承与多态周一:周二:周三:周四:周五:总结一、学习内容回顾(一)多层次类结构设计与实现(二)多态应用场景构建二、问题与解决(一)问题(二)解决方法三、学习成果四、后续学习展望第三阶段:继承与多态第7周:综合运用继承与多态周一:设计复杂类结构:设计一个包含多个层次继承关系的类结构,以“交通工具”为主题。首先设计一个“交通工具”父类,它具有通用属性如name(
Java 实现拖拽列表更新排序
架构师成长进阶空间
Java spring cloud spring boot java 后端
拖拽列表更新排序,接口提供给前端这个功能主要是需要的算法逻辑很多图解:如在前端页面上想把id=5拖拽到id=3上拖拽之后的效果:解析图例:代码示例:DevToCoding|Java面试指南、学习笔记/***拖拽数据更新排序*@paramcurrentId当前数据id*@paramtargetId目标数据id*@return*/@RequestMapping("/sort/{currentId}/{
【学习记录】AVL树及相关链表,线程池实现
liarsup
学习 链表 windows
本来打算使用avl树套链表的结构,来避免优先级相等的情况,但是最后发现当绝大多数优先级都相等,avl树还是不可避免的退化成单链表,而需求中也确实是绝大多数都是优先级相等。所以评估之后觉得avl树带来的提升远不及其提升的复杂度,所以放弃该方案,改为链表实现,现将此前实验的代码整理如下,AVL树部分应该没有问题。重要步骤做了注释.c文件如下////CreatedbyAdministratoron202
第一天:爬虫介绍
朱剑君
Python爬虫训练营 爬虫 python
每天上午9点左右更新一到两篇文章到专栏《Python爬虫训练营》中,对于爬虫有兴趣的伙伴可以订阅专栏一起学习,完全免费。键盘为桨,代码作帆。这趟为期30天左右的Python爬虫特训即将启航,每日解锁新海域:从Requests库的浪花到Scrapy框架的深流,从反爬迷雾中的破局到数据清洗的澄澈。我们拆解网页结构如同解读星图,让XPath与正则表达式化作导航罗盘。每个深夜的代码调试,终将凝结成破晓时的
第三天:爬取数据-urllib库.
朱剑君
Python爬虫训练营 python 爬虫
每天上午9点左右更新一到两篇文章到专栏《Python爬虫训练营》中,对于爬虫有兴趣的伙伴可以订阅专栏一起学习,完全免费。键盘为桨,代码作帆。这趟为期30天左右的Python爬虫特训即将启航,每日解锁新海域:从Requests库的浪花到Scrapy框架的深流,从反爬迷雾中的破局到数据清洗的澄澈。我们拆解网页结构如同解读星图,让XPath与正则表达式化作导航罗盘。每个深夜的代码调试,终将凝结成破晓时的
使用Seaborn绘制相关性热力图
认真写代码i
python 开发语言 Python
使用Seaborn绘制相关性热力图相关性热力图是一种常用的可视化工具,用于显示变量之间的相关性。在Python中,Seaborn是一个功能强大且易于使用的数据可视化库,可以轻松地创建相关性热力图。在本文中,我们将学习如何使用Seaborn的heatmap函数来绘制相关性热力图。首先,我们需要安装Seaborn库。你可以使用以下命令通过pip安装Seaborn:pipinstallseaborn安装
工作计划进度表怎么做?探索主流的8款软件
本文介绍了八款主流的工作计划软件,包括:1.Worktile,2.PingCode,3.腾讯文档,4.钉钉,5.滴答清单,6.有道云笔记,7.Trello,8.Monday.com。制作工作计划进度表是确保项目按时完成的重要步骤,一个好的进度表不仅能清晰显示任务分配和截止日期,还能帮助团队成员理解自己的责任和优先级。随着项目管理工具的不断发展,市场上出现了多种软件,专门设计来帮助制作和管理工作计划
揭秘DeepSeek内幕:清华教授剖析AI模型技术原理
大模型.
人工智能 chatgpt 安全 agi gpt 大模型 deepseek
从ChatGPT到各种新兴的AI模型,每一次技术突破都能引发广泛的关注和讨论——而最近AI界的“新宠”,无疑是DeepSeek。在本文中,清华大学长聘副教授将深入剖析DeepSeekR1背后的大规模强化学习技术及其基本原理,并进一步展望大模型技术未来的发展方向。1、透过DeepSeekR1,看大模型技术的发展趋势今天我将从宏观角度为大家介绍DeepSeekR1所代表的大规模强化学习技术,及其基本原
python编程入门学习(3)——自用笔记
徐少19
python入门 python
目录第五章:if语句一个简单的示例条件测试if语句使用if语句处理列表第六章:字典一个简单的字典使用字典遍历字典嵌套在列表中存储字典在字典中存储列表在字典中存储字典第五章:if语句一个简单的示例#if语句示例cars=['bmw','audi','toyota','subaru']forcarincars:ifcar=='bmw':print(car.upper())else:print(car.
Flux架构:构建可预测的Web应用状态管理体系
阿珊和她的猫
架构 前端
前端开发工程师、技术日更博主、已过CET6阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1牛客高级专题作者、打造专栏《前端面试必备》、《2024面试高频手撕题》蓝桥云课签约作者、上架课程《Vue.js和Egg.js开发企业级健康管理项目》、《带你从入门到实战全面掌握uni-app》前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。文章
C++效率掌握之STL库:string底层剖析
DARLING Zero two♡
C++初阶 c++ 开发语言 stl string
文章目录1.学习string底层的必要性2.string类对象基本函数实现3.string类对象的遍历4.string类对象的扩容追加5.string类对象的插入、删除6.string类对象的查找、提取、大小调整7.string类对象的流输出、流提取希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力!了解完string函数的主要用法,很有必要对string进行深层次的剖析,进一步了解其
调用接口怎么记录到日志里面?项目中日志怎么做的?
北执南念
工作中总结加强学习 java
调用接口怎么记录到日志里面?项目中日志怎么做的?文章目录调用接口怎么记录到日志里面?项目中日志怎么做的?1.日志记录的重要性1.1调试与排查1.2性能监控1.3审计与合规2.日志记录的实现2.1日志框架选择2.2日志记录策略2.3日志记录的最佳实践3.实现接口调用日志记录的3.1在SpringBoot项目中3.2使用AOP(面向切面编程)4.日志收集与分析4.1集中化日志管理4.2日志分析5.项目
YOLOv11 火焰识别:智能时代的火灾预警新利器
星际编程喵
Python探索之旅 YOLO python 目标检测 机器学习 人工智能 开发语言
前言随着人工智能(AI)在各个领域如火如荼发展,图像识别技术也跟着飞速进步。从最初的传统算法到如今的深度学习模型,图像识别在准确性和效率上提升令人惊叹。而在这场技术革命中,YOLO(YouOnlyLookOnce)系列模型无疑扮演举足轻重的角色。今天,我们将目光聚焦在最新的版本——YOLOv11。别误会,YOLOv11可不是什么随便升级。它远不止数字上多了个“1”那么简单。YOLOv11集成许多先
【AI中的数学-人工智能的数学基石】AI的心脏:探索人工智能的算法与核心技术
云博士的AI课堂
AI中的数学 人工智能 算法 数学 AI数学 大模型
第一章人工智能的数学基石第二节AI的心脏:探索人工智能的算法与核心技术人工智能(AI)的迅猛发展离不开其背后的复杂算法与核心技术。这些算法不仅决定了AI系统的性能和能力,也构成了AI应用的基础。从基础的机器学习算法到先进的深度学习模型,AI的算法生态系统丰富多样,涵盖了广泛的数学原理和计算方法。本节将深入探讨驱动AI进步的关键算法与技术,揭示其工作机制及在实际应用中的重要性。一、机器学习:智能的基
学习使用Elm架构的JavaScript项目
陈昊和
学习使用Elm架构的JavaScript项目learn-elm-architecture-in-javascript:unicorn:LearnhowtobuildwebappsusingtheElmArchitecturein"vanilla"JavaScript(step-by-stepTDDtutorial)!项目地址:https://gitcode.com/gh_mirrors/le/le
学习Elm架构在JavaScript中的应用
萧书泓
学习Elm架构在JavaScript中的应用learn-elm-architecture-in-javascript:unicorn:LearnhowtobuildwebappsusingtheElmArchitecturein"vanilla"JavaScript(step-by-stepTDDtutorial)!项目地址:https://gitcode.com/gh_mirrors/le/le
学习经验 | 计算机网络(谢希仁)高分学习攻略!
Baoyan_cs
CS保研干货 学习 计算机网络 计算机保研
写在前面专业课成绩在专业分流、保研以及奖学金的争取等大学的各个环节中都十分重要。那么专业课该如何学习?期末考试又该如何应对?为了帮助同学们取得专业课好成绩,岛主将为大家带来系列专业课学习经验分享!由于不同院校课程所用教材版本不同,分享以具体的教材版本为准。今天带来的是——计算机网络(谢希仁)第八版!01、教材内容介绍01课程特色《计算机网络(第八版)》是由谢希仁编著,电子工业出版社出版的一本经典教
3.2 > Bash
irisart
Linux 从入门到入土 bash linux
概览在上一节中我们了解了关于Shell的执行流程,知道了在Linux环境中一般有哪些常用的Shell。而在本节中,将会学习到Linux中最常见的一个Shell——Bash,了解到bash的相关知识和用法。本节目录概览相关知识bash命令提示符bash基本格式bash常用特殊符号特殊字符:通配符:逻辑运算符:重定向符:命令替换符:变量和环境符:引号符:其他符号:bash有哪些常用配置文件可能常用的系
文本生成型人工智能:逻辑算法与文字组合的重构艺术
Somnolence.·.·.·.
人工智能 人工智能 算法 重构 人机交互 ai chatgpt
引言在数字化浪潮的推动下,文本生成型人工智能(如GPT系列、Claude、Deepseek等)正逐步从技术工具演化为人类社会的"数字镜像"。其本质并非简单的文字堆砌,而是基于算法逻辑对海量语言数据的学习与重组。这一过程既模仿了人类的思维模式,又受制于技术基础设施的物理边界。以下从三个维度解析其运行逻辑与技术哲学。一、数据训练:从概率统计到仿生逻辑的跨越文本生成型AI的核心在于通过神经网络模型对语言
java短路运算符和逻辑运算符的区别
3213213333332132
java基础
/*
* 逻辑运算符——不论是什么条件都要执行左右两边代码
* 短路运算符——我认为在底层就是利用物理电路的“并联”和“串联”实现的
* 原理很简单,并联电路代表短路或(||),串联电路代表短路与(&&)。
*
* 并联电路两个开关只要有一个开关闭合,电路就会通。
* 类似于短路或(||),只要有其中一个为true(开关闭合)是
Java异常那些不得不说的事
白糖_
java exception
一、在finally块中做数据回收操作
比如数据库连接都是很宝贵的,所以最好在finally中关闭连接。
JDBCAgent jdbc = new JDBCAgent();
try{
jdbc.excute("select * from ctp_log");
}catch(SQLException e){
...
}finally{
jdbc.close();
utf-8与utf-8(无BOM)的区别
dcj3sjt126com
PHP
BOM——Byte Order Mark,就是字节序标记 在UCS 编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。UCS规范建议我们在传输字节流前,先传输 字符"ZERO WIDTH NO-BREAK SPACE"。这样如
JAVA Annotation之定义篇
周凡杨
java 注解 annotation 入门 注释
Annotation: 译为注释或注解
An annotation, in the Java computer programming language, is a form of syntactic metadata that can be added to Java source code. Classes, methods, variables, pa
tomcat的多域名、虚拟主机配置
g21121
tomcat
众所周知apache可以配置多域名和虚拟主机,而且配置起来比较简单,但是项目用到的是tomcat,配来配去总是不成功。查了些资料才总算可以,下面就跟大家分享下经验。
很多朋友搜索的内容基本是告诉我们这么配置:
在Engine标签下增面积Host标签,如下:
<Host name="www.site1.com" appBase="webapps"
Linux SSH 错误解析(Capistrano 的cap 访问错误 Permission )
510888780
linux capistrano
1.ssh -v
[email protected] 出现
Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
错误
运行状况如下:
OpenSSH_5.3p1, OpenSSL 1.0.1e-fips 11 Feb 2013
debug1: Reading configuratio
log4j的用法
Harry642
java log4j
一、前言: log4j 是一个开放源码项目,是广泛使用的以Java编写的日志记录包。由于log4j出色的表现, 当时在log4j完成时,log4j开发组织曾建议sun在jdk1.4中用log4j取代jdk1.4 的日志工具类,但当时jdk1.4已接近完成,所以sun拒绝使用log4j,当在java开发中
mysql、sqlserver、oracle分页,java分页统一接口实现
aijuans
oracle jave
定义:pageStart 起始页,pageEnd 终止页,pageSize页面容量
oracle分页:
select * from ( select mytable.*,rownum num from (实际传的SQL) where rownum<=pageEnd) where num>=pageStart
sqlServer分页:
 
Hessian 简单例子
antlove
java Web service hessian
hello.hessian.MyCar.java
package hessian.pojo;
import java.io.Serializable;
public class MyCar implements Serializable {
private static final long serialVersionUID = 473690540190845543
数据库对象的同义词和序列
百合不是茶
sql 序列 同义词 ORACLE权限
回顾简单的数据库权限等命令;
解锁用户和锁定用户
alter user scott account lock/unlock;
//system下查看系统中的用户
select * dba_users;
//创建用户名和密码
create user wj identified by wj;
identified by
//授予连接权和建表权
grant connect to
使用Powermock和mockito测试静态方法
bijian1013
持续集成 单元测试 mockito Powermock
实例:
package com.bijian.study;
import static org.junit.Assert.assertEquals;
import java.io.IOException;
import org.junit.Before;
import org.junit.Test;
import or
精通Oracle10编程SQL(6)访问ORACLE
bijian1013
oracle 数据库 plsql
/*
*访问ORACLE
*/
--检索单行数据
--使用标量变量接收数据
DECLARE
v_ename emp.ename%TYPE;
v_sal emp.sal%TYPE;
BEGIN
select ename,sal into v_ename,v_sal
from emp where empno=&no;
dbms_output.pu
【Nginx四】Nginx作为HTTP负载均衡服务器
bit1129
nginx
Nginx的另一个常用的功能是作为负载均衡服务器。一个典型的web应用系统,通过负载均衡服务器,可以使得应用有多台后端服务器来响应客户端的请求。一个应用配置多台后端服务器,可以带来很多好处:
负载均衡的好处
增加可用资源
增加吞吐量
加快响应速度,降低延时
出错的重试验机制
Nginx主要支持三种均衡算法:
round-robin
l
jquery-validation备忘
白糖_
jquery css F# Firebug
留点学习jquery validation总结的代码:
function checkForm(){
validator = $("#commentForm").validate({// #formId为需要进行验证的表单ID
errorElement :"span",// 使用"div"标签标记错误, 默认:&
solr限制admin界面访问(端口限制和http授权限制)
ronin47
限定Ip访问
solr的管理界面可以帮助我们做很多事情,但是把solr程序放到公网之后就要限制对admin的访问了。
可以通过tomcat的http基本授权来做限制,也可以通过iptables防火墙来限制。
我们先看如何通过tomcat配置http授权限制。
第一步: 在tomcat的conf/tomcat-users.xml文件中添加管理用户,比如:
<userusername="ad
多线程-用JAVA写一个多线程程序,写四个线程,其中二个对一个变量加1,另外二个对一个变量减1
bylijinnan
java 多线程
public class IncDecThread {
private int j=10;
/*
* 题目:用JAVA写一个多线程程序,写四个线程,其中二个对一个变量加1,另外二个对一个变量减1
* 两个问题:
* 1、线程同步--synchronized
* 2、线程之间如何共享同一个j变量--内部类
*/
public static
买房历程
cfyme
2015-06-21: 万科未来城,看房子
2015-06-26: 办理贷款手续,贷款73万,贷款利率5.65=5.3675
2015-06-27: 房子首付,签完合同
2015-06-28,央行宣布降息 0.25,就2天的时间差啊,没赶上。
首付,老婆找他的小姐妹接了5万,另外几个朋友借了1-
[军事与科技]制造大型太空战舰的前奏
comsci
制造
天气热了........空调和电扇要准备好..........
最近,世界形势日趋复杂化,战争的阴影开始覆盖全世界..........
所以,我们不得不关
dateformat
dai_lm
DateFormat
"Symbol Meaning Presentation Ex."
"------ ------- ------------ ----"
"G era designator (Text) AD"
"y year
Hadoop如何实现关联计算
datamachine
mapreduce hadoop 关联计算
选择Hadoop,低成本和高扩展性是主要原因,但但它的开发效率实在无法让人满意。
以关联计算为例。
假设:HDFS上有2个文件,分别是客户信息和订单信息,customerID是它们之间的关联字段。如何进行关联计算,以便将客户名称添加到订单列表中?
&nbs
用户模型中修改用户信息时,密码是如何处理的
dcj3sjt126com
yii
当我添加或修改用户记录的时候对于处理确认密码我遇到了一些麻烦,所有我想分享一下我是怎么处理的。
场景是使用的基本的那些(系统自带),你需要有一个数据表(user)并且表中有一个密码字段(password),它使用 sha1、md5或其他加密方式加密用户密码。
面是它的工作流程: 当创建用户的时候密码需要加密并且保存,但当修改用户记录时如果使用同样的场景我们最终就会把用户加密过的密码再次加密,这
中文 iOS/Mac 开发博客列表
dcj3sjt126com
Blog
本博客列表会不断更新维护,如果有推荐的博客,请到此处提交博客信息。
本博客列表涉及的文章内容支持 定制化Google搜索,特别感谢 JeOam 提供并帮助更新。
本博客列表也提供同步更新的OPML文件(下载OPML文件),可供导入到例如feedly等第三方定阅工具中,特别感谢 lcepy 提供自动转换脚本。这里有导入教程。
js去除空格,去除左右两端的空格
蕃薯耀
去除左右两端的空格 js去掉所有空格 js去除空格
js去除空格,去除左右两端的空格
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>&g
SpringMVC4零配置--web.xml
hanqunfeng
springmvc4
servlet3.0+规范后,允许servlet,filter,listener不必声明在web.xml中,而是以硬编码的方式存在,实现容器的零配置。
ServletContainerInitializer:启动容器时负责加载相关配置
package javax.servlet;
import java.util.Set;
public interface ServletContainer
《开源框架那些事儿21》:巧借力与借巧力
j2eetop
框架 UI
同样做前端UI,为什么有人花了一点力气,就可以做好?而有的人费尽全力,仍然错误百出?我们可以先看看几个故事。
故事1:巧借力,乌鸦也可以吃核桃
有一个盛产核桃的村子,每年秋末冬初,成群的乌鸦总会来到这里,到果园里捡拾那些被果农们遗落的核桃。
核桃仁虽然美味,但是外壳那么坚硬,乌鸦怎么才能吃到呢?原来乌鸦先把核桃叼起,然后飞到高高的树枝上,再将核桃摔下去,核桃落到坚硬的地面上,被撞破了,于是,
JQuery EasyUI 验证扩展
可怜的猫
jquery easyui 验证
最近项目中用到了前端框架-- EasyUI,在做校验的时候会涉及到很多需要自定义的内容,现把常用的验证方式总结出来,留待后用。
以下内容只需要在公用js中添加即可。
使用类似于如下:
<input class="easyui-textbox" name="mobile" id="mobile&
架构师之httpurlconnection----------读取和发送(流读取效率通用类)
nannan408
1.前言.
如题.
2.代码.
/*
* Copyright (c) 2015, S.F. Express Inc. All rights reserved.
*/
package com.test.test.test.send;
import java.io.IOException;
import java.io.InputStream
Jquery性能优化
r361251
JavaScript jquery
一、注意定义jQuery变量的时候添加var关键字
这个不仅仅是jQuery,所有javascript开发过程中,都需要注意,请一定不要定义成如下:
$loading = $('#loading'); //这个是全局定义,不知道哪里位置倒霉引用了相同的变量名,就会郁闷至死的
二、请使用一个var来定义变量
如果你使用多个变量的话,请如下方式定义:
. 代码如下:
var page
在eclipse项目中使用maven管理依赖
tjj006
eclipse maven
概览:
如何导入maven项目至eclipse中
建立自有Maven Java类库服务器
建立符合maven代码库标准的自定义类库
Maven在管理Java类库方面有巨大的优势,像白衣所说就是非常“环保”。
我们平时用IDE开发都是把所需要的类库一股脑的全丢到项目目录下,然后全部添加到ide的构建路径中,如果用了SVN/CVS,这样会很容易就 把
中国天气网省市级联页面
x125858805
级联
1、页面及级联js
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
&l