Spring浅谈

白盒测试逻辑覆盖之谓词覆盖、子句覆盖、三类有效字句覆盖等知识点 本篇笔记会简化书本上的概念,用容易理解的方式来说明,有些例子打字麻烦,我会直接放图片! 目录 基础知识: 谓词覆盖predicate coverage 子句覆盖 clause coverage 组合覆盖 combinatorial coverage 有效字句覆盖Active Clause Coverage 广义有效子句覆盖(General Active Clause Coverage) 相关性有效子句覆盖(Correlated Active Clause Coverage) 限制性有效 阅读详情

Spring

  • 因为最近要重回业务的怀抱,因而重新再看一遍Spring的内容刻不容缓

目标

  • 对Spring架构上,流程上的分析
  • 对于实用点的总结,关于这块,每部分都会有部分总结,然后最后会有一个总的总结
  • 对于一些Spring关键点源码分析
  • 对Spring设计上的一些分析
  • framework is simple,idea is the fucking key

TODO

  • AOP各种切面示例代码编写
  • AOP中JDK反射原理,CGLIB字节码技术原理(关于字节码的原理可以浅一点)

BeanFactory 和ApplicationContext

额外的延伸点:

  • 关于父子容器的概念:通过HierarchicalBeanFactory这个子类(这个只是Spring继承体系中的一部分),可以实现子容器可以访问父容器,但是父容器不能访问子容器,controller层是子容器,视图层可以访问业务层和持久层的bean,但是相反则不行,既controller可以访问dao,service,而dao,service无法访问controller,就是说可以以下犯上,但是不可以倚老卖老
BeanFactory
  • 内部是一个hashMap实现的缓存器
  • bean的生命周期
    • 大体流程图为:
      在这里插入图片描述
ApplicationContext
  • ApplicationContext相比BeanFactory的优化:
    • 对于所有的bean,当初次加载的时候就会全部加载到容器中
    • 新增了BeanFatoryPostProcessor接口,作用在于初始化bean之前,先会通过这些工厂后处理器对配置信息进行加工处理,如有:CustomEditorConfigurer,
      PorpertyPlcaeholderConfigurer等,但是注意这些都是工厂后处理器,仅在ApplicationContext初始化的时候调用一次
    • ApplicationContext会利用反射技术自动识别出定义的BeanPostProcessor,InstantiationAwareBeanPostProcessor和BeanPostProcessor并且自定注册到容器中,而BeanFactory则需要通过代码手动注册(addBeanPostProcessor)
  • 对于ApplicationContext的生命周期而言,其实与BeanFactory差不多,就只是多了几个工厂后置处理器而已(既在ApplicationContext中只需要要将实现BeanPostProcessor接口的类标志为bean即可,他加载过后会自动扫描的)
  • ApplicationContext bean的生命周期与BeanFactory相比多了ApplicationContextAware和工厂后处理器而已:
  • 在这里插入图片描述
生命周期接口的分类:
  • bean自身的方法:
    • init-method指定的方法或者是@PostConstruct指定的方法
    • 构造方法,或者是自身的setter方法
  • bean级生命周期接口 : 针对的是bean对象
    • BeanNameAware: 设定bean的名称
    • BeanFactoryAware: 持有BeanFactory引用
    • ApplicationContextAware: 持有ApplicationContext引用
    • InitializingBean: 既afterProperties方法,当变量设置完毕之后会调用
    • DisposablebBean: 就是当销毁时候会调用的方法,@PreDestroy
  • 容器级生命周期接口:: 针对的是所有的bean,既所有的bean都会执行某种操作,当然也可以自编写后置处理器,使得只对特殊的bean感兴趣,全局性的
    • BeanPostProcessor 接口
    • InstantationAwareBeanPostProcessor
  • 工厂后置处理器: 既实现了BeanFactoryPostProcessor接口的类,当加载完配置文件之后立马会调用wip待完善
    • CustomerAutowireConfigurer
    • ConfigurationClassPostProcessor
WebApplicationContext
  • 作用: wip专门用于web,允许从web的根目录文件中装载配置文件从而初始化,可以获得ServletContext的引用
  • 如何使用: 通过WebApplicationContextUtils.getWebApplicationContext(servletContext)获取WebApplicationContext,当然本身也可以通过ApplicationContextAware接口获取ApplicationContext的引用
  • 区别:
    • ApplicationContext是BeanFactory的一个子类(wip)
    • BeanFactory加载bean的时候,是只有get 的时候才会触发加载,而ApplicationContext则是初始化上下文的时候就加载了所有的bean信息
DefaultListableBeanFactory
  • 为什么要将这个单独的也抽出来讲解呢,因为个人是挺喜欢造轮子的,而当涉及到SpringCloud中的@FeignClient,@Mapper等空接口的时候,如何动态注入呢,可以通过DefaultListableBeanFactory动态注入,当然其实也是可以通过BeanPostProcessor扫描让后发现指定注解之后生成代理类代替的
  • 作用:
    • Spring容器启动阶段,动态注入自定的bean,并且保证能被aop所加强
  • 如何使用:
    • 实现BeanFactoryPostProcessor接口
    • WIP
BeanFactory和ApplicationContext部分总结:
  • 前者是心脏,后者是一个完整的人
  • 关于生命周期,记住核心的一个: BeanPostProcessor这个接口,aop的功能就是通过他来实现的,如果我们想创建工具,或者aop中通过this 使得aop|事务生效可以通过这个借口来实现代理
  • BeanFactory是只有初次getBean的时候才会注册bean,而ApplicationContext是初始化的时候就会加载所有的bean
  • bean生命周期中的关于destroy-method和init-method 其实这是对于xml配置而言的,而对于JavaConfig而言就是@PostConstruct和@PreDestroy,既
    init-method=@PostConstruct;destroy-method=@PreDestroy

容器事件
  • 核心的类: EventObject类(描述事件)和EventListener接口(监听事件)
  • 容器事件的核心三要素:
    • 事件源: 既EventObject内部有一个object的source对象,代表源对象,每个EventObject必须有一个source对象
    • 事件监听器注册表: 既保存事件的容器,当事件发生的时候就会notify这些监听器
    • 事件广播器: 既通知监听器执行任务,起到桥梁的作用
  • Spring事件类结构:
    • 事件类(ApplicationEvent): 通过内部的source指定事件源
      • 类层次结构图为: 可以发现顶级类是AppEvent,
        在这里插入图片描述
      • ApplicationContextEvent: 容器事件:有启动,刷新,停止,关闭事件
      • RequestHandleEvent: 与web应用相关的事件,当http请求到来之后会产生该事件,只有在web.xml中定义了DispatcherServlet时才会产生该事件
    • 事件接口:
      • 类层次结构图为: 可以发现顶级父类为EventListener
        在这里插入图片描述
    • SmartApplicationListener 接口3.0新增: 作用: 只会针对于某些特定类型的事件做出响应,通过boolean supportsEventType(Class<? extends ApplicationEvent> event)判断
    • GenericApplicationListener 4.2新增,不再仅仅只支持ApplicationEvent,既事件不再需要继承ApplicationEvent,直接泛型即可,原理就是通过boolean supportsEventType(ResolveType type) 这个ResolveType可以获取到泛型的实际类型信息
  • 事件广播器:

    • 顶级接口是: ApplicationEventMulticaster 其抽象类为: AbstarctApplicationEventMuliticaster 其子类为SimpleApplicationEventMulticaster
  • 如何使用呢:

    • ApplicationContext,加载完配置文件之后会通过BeanFactoryProcessor从BeanDefinitionRegistry中找出实现了某些接口的bean,因而我们只需要:
      1. 自定义类实现ApplicationEventMulticaster(这一步可以没有,如果没有的话会默认使用SimpleApplicationEventMulticaster)
      2. 自定义实现ApplicationListener
      3. 自定义继承ApplicationEvent或者是ApplicationContextEvent(只指容器事件),当然这一步我们是可以直接使用的的,不过这样的话,第二步中就不应该是实现ApplicationListener了,而是继承GenericApplicationListener然后复写supportsEventType来特指这个泛型了
      4. 当然最终要的一步是,以上的所有都需要注册为bean (或者是@bean等)
容器事件部分总结

核心就是

  • 事件源:EventObject
  • 事件处理者(监听器对象): EventListener (但我们大多直接使用ApplicationListener即可)
  • 事件广播器: 顶级是ApplicationListenerMulticaster (这个我们一般不需要去自定义,如果无自定义,Spring默认会使用SimpleApplicaitonListenerMulticaster)

Bean
  • Bean配置信息在ioc容器中需要存在这些信息:

    • bean的实现类
    • bean的属性信息(既内容)
    • bean的依赖关系(会有循环依赖的问题)
    • bean的行为配置(如生命周期或者是回调函数)
  • bean在ioc容器中是以BeanDefinition的形式存在的,IOC容器+Bean实现类+Bean配置信息+应用程序的关系如图:
    在这里插入图片描述
    流程为: 编写配置->启动容器->扫描配置类,生成beanDefinitionRegistry注册所有的beanDefinition->通过beaDefinition实现具体的类->将生成的bean放到缓存池中(ioc容器)

  • bean配置中有用的点:

    • parent属性的作用:,这点在实际项目中遇到过,因为命令模式模板模式往往要抽象类的作用,每个命令都是bean,多了肯定会冗余,因而parent的作用就体现了:
  • bean的模式: 单例(singleton,prototype)模式,如果使用的是WebApplicationContext则还有(request,session)等模式

<bean id="parentObserver"
		class="com.dlxy.config.DlxyObservervable">
		<property name="obs">
			<list>
				<ref bean="userRecordObserver" />
			</list>
		</property>
	</bean>
	<bean id="userWrappedService"
		class="com.dlxy.service.impl.UserWrappedServiceImpl"
		parent="parentObserver" />
	<bean id="titleWrappedServie"
		class="com.dlxy.service.impl.TitleWrappedServiceImpl"
		parent="parentObserver" />
	<bean id="articleWrappedservice"
		class="com.dlxy.service.impl.ArticleWrappedServiceObservableImpl"
		parent="parentObserver" />
	<bean id="pictureWrappedService"
		class="com.dlxy.service.impl.PictureWrappedServiceObservableImpl"
		parent="parentObserver" /> 

这样通过parent属性,就不需要为每个bean都单独的设置list中的属性了


疑惑点:
  • WebApplicationContext与servletContext的关联,或者说这2者有什么联系:
    • 首先问题先拆分:
    • 什么是ServletContext,及其作用,以及何时初始化
      • 什么是servletContext: ServletContext 是一个全局的类,可以认为是共享的数据区

      • ServletContext的作用: 存放公共配置类,既在<web.xml>中由 < context-param>标签包裹的数据,当然这里额外延伸一点配置问题:

        • 在web.xml中可以配置servlet的共享数据
        <context-param></context-param> 
        这种方式可以通过getServletContext().getInitParameter("param1")获取值,
        并且是共享的,所有的servlet都可以访问
        
        • 也可以配置某个servlet的特定参数:
        	<init-param>
                        <param-name>param1</param-name>
                         <param-value>avalible in servlet init()</param-value>   
             </init-param>   
        	只能在servlet中通过this.getInitParameter("param1")获取
        
      • ServletContext何时初始化: 当Servlet容器第一次启动的时候就会实例化一个ServletContext

      • 如何使用: 可以通过ServletContextAware接口获取到SerletContext的引用,并且由此我们可以发现Spring设计上的一个特点,Aware接口

    • 什么是WebApplicationContext :
      • 什么是WebApplicationContext: WebApplicationContext是ApplicationContext的一个子类,这是专门为Web准备的,为何这么说,它多了额外的属性:bean的scope属性:如request,session等,其顶级接口又是BeanFactory,因而可以认为是ioc容器,webApplicationContext无法更通俗理解,它有多个实现类,其中有XmlWebApplicationContext和AnnotationConfigWebApplicationContext
      • WebApplicationContext的作用: 很明显,既是BeanFactory的作用,作用是存放所有的bean
      • 何时初始化: 当servlet执行init方法之后,会触发ContextLoadListener,在ContextLoadListener中会初始化WebApplicationContext(通过event.getServletContext())
    • 总结:
      • ServletContext是共有数据,存放Servlet间共享的数据
      • WebApplicationcontext是ioc容器,Servlet中内部的业务总需要用到bean是吧(毫无争议),为啥ServletContext中要引用WebApplicationContext呢,而不是相反呢,可以这么理解:先后问题和职责问题:
        • 因为先有ServletContext后有WebApplicationContext ioc容器
        • 职责问题: ServletContext的职责就是数据共享,存放所有的配置信息,那么所有bean 的引用当然要存放在这咯
  • Spring默认bean是singleton模式,适合无状态或者状态不可变的对象,但是dao类会持有connection,这点是如何避免的
    • dao是orm层概念,用于与数据库交互,也就意味着需要持有connection这个成员,也就意味着是有状态的,如何避免呢,答案就是通过ThreadLocal

Spring AOP

  • 首先,什么是aop,aop既面向切面编程,竖线逻辑上插入
  • AOP中的术语:
    • joinpoint: 既连接点,可以认为就是类中的所有方法都是连接点
    • pointcut: 切点,连接点的细分,并不是所有的连接点都会是切点,只会针对特定的连接点作为切点(既进行额外的加工)
    • advice: 增强,既对切点的增强,字面翻译即可,并且有BeforeAdvice,AfterReturningAdvice,ThrowsAdvice等方法
  • AOP增强(织入的方式):
    • 编译器织入: 要求有特殊的Java编译器
    • 类装载期织入: 特殊的类加载器
    • 动态代理织入: 既运行期,通过动态代理技术增强
  • AOP的实现者有如下:
    • AspectJ: 编译期提供横切代码的逻辑,有一个专门的编译器和特殊的类加载器
    • SpringAOP: 运行期通过代理方式增强,侧重于ico与aop的结合
动态代理
  1. JDK动态代理:
    • 核心: InvocationHandler,Proxy
    • 原理: 通过反射
    • 如何使用:
      1. 自定义类实现InvocationHandler接口
      2. 通过Proxy.newProxyInstance(classloader,interfaces,oldImpl);生成的类既是通过代理之后的类WIP:代码演示
  2. cglib动态代理:
    • 核心: MethodInterceptor,Enhancer
    • 原理: 通过底层字节码技术
    • 如何使用:
      1. 自定义类实现MethodInterceptor接口
      2. 通过enhancer设置超类和回调函数,然后enhancer.create返回的就是代理类WIP:代码演示
  3. JDK动态代理和CGLIB动态代理的区别:
    • 适用性:cglib更加适用,jdk基于接口,既被代理的类必须有实现的接口才可以,而cglib则是衍生出子类来实现代理
    • 原理:jdk是反射,cglib原理是字节码技术
    • 性能上cglib性能更高
Spring 的增强
  • 在上述中,我们每次进行横切逻辑都需要手动编写,那么我们完全可以抽出接口来简化编程,Spring有如下增强类:
    • 前置增强: BeforeAdvice (当方法执行前的增强)
    • 后置增强: AfterReturingAdvice (当方法执行完毕之后的增强)
    • 环绕增强: MethodInterceptor (范围最广,不仅能充当前置,后置,也能充当异常抛出增强)
    • 异常抛出增强: ThrowsAdvice (抛出异常后进行处理)
    • 引介增强: IntroductionInterceptor:(既额外添加新的方法和属性)
  • 如何使用呢:
    • 其实与上述是差不多一致的,当我们使用CGLIB的时候,会通过enhancer,MethdoInterceptor实现
    • 核心类: ProxyFactory (Spring自带的)
    1. 实现BeforeAdvice或者是上述的任意增强类
    2. 通过ProxyFactory指定target对象(这个对象是实际的原先的对象)
    3. 通过ProxyFactory添加advice增强(既第一步实现类)
    4. 通过ProxyFactory生成proxy : pf.getProxy() 即可 WIP:代码演示
  • 关于ProxyFactory这个的使用: 内部有Cglib2AopProxy和JdkDynamicAopProxy两个final 实现类,如果setInterfaces指定接口,则会使用Jdk否则的话使用Cglib,setOptimize(true)会启用优化代理,这样就算是接口也会是使用cglib
  • 是
Spring的切面
  • 切面是切点+增强类型

    • 切点又有如下切点:
      • 静态方法切点: StaticMethodMatcherPointcut是静态方法切点的抽象基类,
        • 有NameMatchMethodPointcut : 简单字符串匹配方法签名
        • 和AbstracRegexpMethodPointcut: 正则匹配的方式WIP待补,怎么进行匹配的待补
      • 动态方法切点: DynamicMethodMatcherPointcut ,是抽象基类WIP待补,同上
      • 注解切点: AnnotationMatchingPointcut: 支持在bean中通过注解标签定义的切点
      • 表达式切点: ExpressionPointcut接口 ,为了支持AspectJ切点表达式语法而定义的接口
      • 流程切点: WIP
      • 复合切点: ComposablePointcut 为创建多个切点而提供的方便操作类,WIP需要配合代码理解,虽然可以简单的认为与以前的想法一致
  • 切面类型的分类:

    • Advisor: 一般切面,仅仅只是包含了Advice(增强类型)
    • PointcutAdvisor: 代表的是具有切点的切面,包含Advice和Pointcut2个类
      • 这是一个接口,旗下有多个实现类,对应的实现类与切点的类型对应
    • IntroductionAdvisor: 代表引介切面,对应的advisor是引介增强类型
    • 怎么使用呢:
      1. 编写自己的业务逻辑
      2. 编写增强类型(是前置呢还是后置还是环绕等)
      3. 自定义切面(用于捕获对哪些切点感兴趣)
      4. ProxyFactory 设置target(既业务逻辑实现类) ,设置interface| 设置optimize优化 ; 添加切面
      5. ProxyFactory生成代理对象
AOP的部分总结:
  • Joinpoint(连接点)含有: 通常就是某个类的所有方法
  • Advice(增强)含有: 包含了横切代码和连接点的信息(包含了这个类的所有方法)
  • Pointcut(切点,连接点的细化)含有:具体方法名称,方法参数信息等
AOP疑惑点:
  • JDK动态代理如果是一个空接口的话怎么办,如@FeignClient所标识的,但是没有fallback类
  • JDK动态代理的原理,反射,反射又是基于什么原理的
  • 什么是切面,什么是增强类型:
    • 增强类型: 增强类型是指 前置增强(BeforeAdvice)还是后置增强(AfterReturningAdvice)还是环绕增强等(既发生增强所处的时机)
    • 切面 是切点+增强类型

Spring配置(专门用于讲解配置):

配置方式:
  • 通过xml配置
  • 通过注解@Componnet配置
  • 通过JavaConfig配置
  • 省略groovy的方式
注意:
  • 在非SpringBoot下,如果使用的是JavaConfig的形式,则web.xml中的参数需要指定为
<context-param>
	<param-name>contextClass</param-name>
	<param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext
</context-param>

然后对于原先的contextConfigLocation则是指向具体的类
<context-param>
	<param-name>contextConfigLocation</param-name>
	<param-value>com.test.config.Configuraiton</param-value>
</context-param>

当然你不指定也是没关系的,只要通过 <component-scan basepackages="com.demo">这样讲配置类扫描进去也是可以的,但是注意要与SpringMVC的配置扫描分开哦,不然会加载两次,血的教训

WebApplicationContext的配置:
  • 在web.xml中配置:,至于作用在上面已经申明了

    <listener> 
    			<listener-class>org.springfarmework.web.context.ContextLoadListener</listener-class>
    </listener>
    这个listener可以获取到<context-param>中的名为contextConfigLocation的值,
    至于这个值是可以采用统配符的: classpath:*/spring-*.xml
    如:
    <context-param>
    	<param-name>contextConfigLocation</param-name>
    	<param-value>/WEB-INF/spring-mvc.xml</param-value>
    </context-param>		
    
    
日志功能的配置:

注意:

  • 日志的配置必须在Spring的配置之前
  • 日志的配置可以使用listener或者是servlet
    • 如果用listener的话,需要将这个listener放置在contextConfigListener之前
    • 如果用servlet的话,load-on-startup要设置为1,优先级别最高
  • 核心参数就是log4jConfigLocation
<context-param>
	<param-name>log4jConfigLocation</param-name>
	<param-value>/WEB-INF/log4j.properties</param-value>
</context-param>
  • listener方式:
<listener>
	<listener-class>Log4jConfigListener</listener-class>
</listener>
  • servlet方式:
<servlet>
	<servlet-name>log4jConfigSerlvet</servlet-name>
	<serlvet-class>org.springframework.web.util.Log4jConfigServlet</servet-class>
	<load-on-startup>1</load-on-startup>
</servlet>

设计方面

  • 核心容器是通过HashMap来设置的wip:key是什么类型,当然有一大堆配置类,配置类线性结构,通过order排序,然后顺序调用
  • Spring 的设计基本都是一个主接口,然后衍生出一大堆的子接口,或者是抽象实现类,然后在抽象实现类中再定义一些额外的方法,从而使得丰富多样
  • Spring Aware接口的作用: Spring因为有些单例的长生命周期的对象,因而都会开放其Aware接口,用于开发者获取其引用,如ApplicaitonContextAware接口,ServletContextAware接口,因而,在我们以后的设计中也大可以这样通过aware接口获取长生命周期框架对象的引用
保姆级教程:用Arduino+MPU6050自制寻北仪(附MEMS陀螺精度测试报告) 本文提供了一份详细的Arduino与MPU6050自制寻北仪的保姆级教程,包括硬件选型、卡尔曼滤波算法优化、地磁场补偿及真北计算等关键技术。通过实测数据展示了MEMS陀螺仪在民用领域的高精度性能,帮助读者低成本实现1°以内的寻北精度。 阅读详情

相关推荐

VSCode多文件C语言项目编译实战:从配置到运行

本文详细讲解了如何在VSCode中配置多文件C语言项目的编译环境。通过手把手教学,指导读者创建项目结构、编写代码,并重点深度配置task.json与launch.json文件,实现一键编译和调试所有C文件,解决常见的“undefined reference”等链接错误,提升开发效率。

g8f9d0s1a2的博客 1098

探索 Spring Code:一份深度实践的 Spring 框架教程仓库

探索 Spring Code:一份深度实践的 Spring 框架教程仓库 去发现同类优质开源项目:https://gitcode.com/ 引言 在 Java 开发领域,Spring 框架无疑是主流的选择,它的灵活性和强大的功能深受开发者喜爱。 上的 项目就是一个宝贵的资源,为学习和掌握 Spring 提供了详细的实例和深入的解析。 项目简介 spring-code 是一个由 LiuQuPing...

gitblog_00051的博客 1110

Dify 从入门到熟悉100 天的学习大纲

理解 Dify 的核心概念,熟悉操作界面,并能创建简单的 AI 应用。祝你在这 100 天的旅程中学有所成,成为一名优秀的 AI 应用开发者!掌握生产环境部署、监控、调优,并关注 Dify 生态和前沿动态。探索多模态、Agent、API 集成、性能优化等高级主题。掌握工作流编排、高级提示词技巧、知识库优化等核心功能。

IT深耕十余载,大道之简 1735

spring中Bean的生命周期各个接口详细执行顺序

BeanDefinitionRegistryPostProcessor 首先BeanDefinitionRegistryPostProcessor ,这个类在动态注册Bean的时候用的很多(比如自定义注解Import),实际继承的是一个BeanFactoryPostProcessor接口,是一个Bean工厂的处理器,所以在容器启动时候最先加载。这两个接口一共有两个方法。这两个方法只会被执行一次,这个是容器级别接口,不管多少个Bean,一个实现只会执行一次。 public interface BeanDefi

Emine 2177

【STM32单片机】RS485通信—基于STM32G474芯片

做项目需要用485通信来控制Go电机参考资料:【【STM32F103C8T6系列】10. 实验例程——485(USART串口)通讯实验】 https://www.bilibili.com/video/BV19w411r7ka/?PDF: STM32G474 开发指南 正点原子 DMG474 开发板教程 第28章485只是物理层,代码逻辑还是UART串口通信,相当于是电路有RS485转换芯片,所以还是用UART串口通信方式。

m0_48808835的博客 3647

C#:WPF格式转Winform格式

WPF格式转Winform格式

Hello C++ 1295

面向切面的Spring

在开始本篇博文前,我们先思考一个问题: Question: Java 语音在设计时没有开放类的理念,也就是说 Java 并不是动态语言,一旦类编译完成了,很难再为该类添加新的功能;那么如何实现像 Ruby 一样,在不直接修改对象或类的定义就能够为对象或类增加新的方法。 Answer: 首先我们直到我们使用动态代理时候可以为对象拥有的方法添加新的功能,而 spring 的AOP 就是基于java

ManagementAndJava的博客 559

AI赋能运筹优化:从参数生成到智能求解的工程实践

运筹学通过线性规划、整数规划等数学模型,为供应链、物流、生产排程等复杂决策问题寻找最优解,其核心价值在于提升资源利用效率与决策科学性。传统方法依赖精确的输入参数与专家经验,面临数据不准、建模门槛高、求解调优难等挑战。人工智能技术的引入,正从原理层面重塑这一流程:通过深度学习模型生成更贴合现实的动态参数(如需求分布、行驶时间),利用自然语言处理降低建模门槛,并借助强化学习对求解器进行智能参数调优。这种AI与运筹学的融合,在工程实践中显著提升了优化系统的自适应能力与求解效率,使其在应对实时交通、柔性生产调度等动

weixin_26913055的博客 595

浅谈spring框架。

spring框架有什么优点? spring是一个轻量级的开源框架,利用IOC/di,aop的思想,致力于构建非侵入式的javaEE应用。 应用: 应用程序 ,项目 网站 类似于QQ、微信等 轻量级: 依赖的资源少,使用简单 开源: 源代码开放 框架: 半成品,定义了一些结构,让我们按照这个结构添加自己的代码快速开发 IOC : IOC是控制反转 DI : 依赖注入 IOC/DI是...

菜鸟 482

petalinux i2c的配置

1.硬件平台配置 1.内核配置 cd petalinux-config -c kernel -> Device Drivers -> I2C support -> i2C Hardware Bus support -> Xilinx I2C Controller Pressing 启用CONFIG_I2C_XILINX=y 2.修改用户设备树 cd cd project-spec/meta-user/recipes-bsp/device-tree/files/ i2c2:

u013403954的博客 4312

目标检测YOLO实战应用案例100讲-基于激光雷达点云的三维目标检测算法研究

近几年来,在计算机视觉领域,利用深度学习卷积神经网络技术来实现各种任务的算法越来越多。毫米波雷达、相机、激光雷达、超声波雷达等车载传感器生产成本的降低,汽车的自动驾驶技术得到了飞速发展,在我们的日常生活中经常能看到该技术辅助汽车驾驶员进行行车。和非自动驾驶汽车相比,自动驾驶汽车存在诸多优点,如进一步减少交通事故,保障人身安全;提供安全合理的路线,避免交通拥堵;采用清洁无污染的电能作为汽车新能源,从而降低大气污染等。现如今,自动驾驶技术已经逐渐深入到各个领域并发挥着关键的作用。

qq_36130719的博客 3730

浅谈spring框架的理解

spring的两大核心思想就是IOC(控制反转),DI(依赖注入),AOP(面向切面编程)。 1)那么什么是IOC呢,有反转就会有正转,正转就是你需要用到这个类对象时,自己手动new出来。而反转就是你设计编写好的类不是由你自己创建,而是把创建的权力交予spring框架的IOC容器 2)IOC会看你的对象创建是否要依赖于另一个对象,(当然,这需要你在配置文件...

qq_31162311的博客 405

PCL CSF布料模拟算法【2026最新版】

CSF布料模拟地面滤波算法的PCL实现,博客长期更新,本文最近更新时间为:2026年10月26日。

点云侠的博客 3917

浅谈Spring——AOP

Spring是目前比较常用的框架,其核心是控制反转(IoC)和面向切面编程(AOP)。通过IOC容器管理POJO或JavaBean对象,以及它们之间的耦合关系;通过AOP以动态非入侵的方式增强服务。这篇主要浅谈一下AOP~我们接着以上的实例进行一个自定义注解话的改造。

weixin_45559950的博客 2217

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Spring浅谈源码系列一:Spring概述

Spring浅谈源码系列一:Spring概述

qq_41490913的博客 181

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

初识 Spring(01)---(浅谈 Spring 框架)

浅谈 Spring 框架 Spring框架是分模块存在,除了最核心的Spring Core Container(即Spring容器)是必要模块之外,其他模块都是可选,视需要而定。大约有20多个模块。Spring的核心是控制反转(IoC)和面向切面(AOP)。简单来说,Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架。 一般来说,Spring主要分为...

姜皓的博客 462

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

浅谈Spring

spring快速入门,spring项目的创建和使用,五大类注解,属性注入,Bean的作用域和生命周期,maven国内源的配置

qq_48584557的博客 880

浅谈 Spring IOC

Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。如何理解好Ioc呢?理解好Ioc的关键是要明确“谁控制谁,控制什么,为何是反转(有反转就应该有正转了),哪些方面反转了”,那我们来深入分析一下

程序员小奎的博客 841

spring事务的坑

转发:浅谈Spring事务的那些坑-电子发烧友网

zhaohuan0308的博客 105

Spring 浅谈

Spring框架概述 1.什么是Spring Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选...

weixin_42930209的博客 206

浅谈Spring IOC

文章目录浅谈Spring IOC如何创建对象Spring IOC 是如何创建对象的Spring IOC对对象进行操作 浅谈Spring IOC 如何创建对象 在Java中,我们通常创建对象都是通过new Object 的形式来创建一个新的对象的,然后通过这个对象的set方法对一个对象里面的属性进行赋值。 譬如 User user = new User() user.setName = 'Liming' 除了通过new的方式以外,我们也可以通过反射的方法创建对象。 Class<?> clz

goasleep的博客 301

浅谈Spring Boot

Spring Boot Spring Boot的设计目的是用来简化Spring应用的初始搭建以及开发过程。使用springboot以后,搭建一个spring应用和开发变得很简单。该框架使用了特定的方式(继承starter,约定优先于配置)来进行配置,从而使开发人员不再需要定义样板化的配置。 Spring Boot并不是一个框架,从根本上将,它就是一些maven库的集合,maven或者gradl...

蔡茂的博客 1119

浅谈spring

1.浅谈IOC

sinat_32485497的博客 317
上一篇: Redis浅谈
下一篇: Golang库浅析
Coder_Joker
博客等级 码龄8年 39粉丝 67原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值