Sprin相关

神州数码防火墙(DCN)NAT SSL-VPN配置 SSL-VPN是基于应用层的VPN,采用SSL协议来实现远程接入的一种新型VPN技术,比L2TP更加灵活的VPN方案。是天然的安全远程接入方案。用户可以通过浏览器的HTTPSs登录VPN的网址。SSL-VPN的认证方式包括LDAP,radius,CA,USB Key等方式。 SSL VPN的主要应用场景是保证远程用户能够在企业外部安全\高效的访问企业内部的网络资源 阅读详情

一、Spring容器的refresh()【创建刷新】;

1、prepareRefresh()刷新前的预处理;

   1)、initPropertySources()初始化一些属性设置;子类自定义个性化的属性设置方法;
   2)、getEnvironment().validateRequiredProperties();检验属性的合法等
   3)、earlyApplicationEvents= new LinkedHashSet<ApplicationEvent>();保存容器中的一些早期的事件;

2、obtainFreshBeanFactory();获取BeanFactory;

 1)、refreshBeanFactory();刷新【创建】BeanFactory;
       创建了一个this.beanFactory = new DefaultListableBeanFactory();
       设置id;
 2)、getBeanFactory();返回刚才GenericApplicationContext创建的BeanFactory对象;
 3)、将创建的BeanFactory【DefaultListableBeanFactory】返回;

3、prepareBeanFactory(beanFactory);BeanFactory的预准备工作(BeanFactory进行一些设置);

 1)、设置BeanFactory的类加载器、支持表达式解析器...
 2)、添加部分BeanPostProcessor【ApplicationContextAwareProcessor】
 3)、设置忽略的自动装配的接口EnvironmentAware、EmbeddedValueResolverAware、xxx;
 4)、注册可以解析的自动装配;我们能直接在任何组件中自动注入:
       BeanFactory、ResourceLoader、ApplicationEventPublisher、ApplicationContext
 5)、添加BeanPostProcessor【ApplicationListenerDetector】
 6)、添加编译时的AspectJ;
 7)、给BeanFactory中注册一些能用的组件;
    environment【ConfigurableEnvironment】、
    systemProperties【Map<String, Object>】、
    systemEnvironment【Map<String, Object>】

4、postProcessBeanFactory(beanFactory);BeanFactory准备工作完成后进行的后置处理工作;

   1)、子类通过重写这个方法来在BeanFactory创建并预准备完成以后做进一步的设置
======================以上是BeanFactory的创建及预准备工作==================================

5、invokeBeanFactoryPostProcessors(beanFactory);执行BeanFactoryPostProcessor的方法;

   BeanFactoryPostProcessor:BeanFactory的后置处理器。在BeanFactory标准初始化之后执行的;
   两个接口:BeanFactoryPostProcessor、BeanDefinitionRegistryPostProcessor
   1)、执行BeanFactoryPostProcessor的方法;
      先执行BeanDefinitionRegistryPostProcessor
      1)、获取所有的BeanDefinitionRegistryPostProcessor;
      2)、看先执行实现了PriorityOrdered优先级接口的BeanDefinitionRegistryPostProcessor、
         postProcessor.postProcessBeanDefinitionRegistry(registry)
      3)、在执行实现了Ordered顺序接口的BeanDefinitionRegistryPostProcessor;
         postProcessor.postProcessBeanDefinitionRegistry(registry)
      4)、最后执行没有实现任何优先级或者是顺序接口的BeanDefinitionRegistryPostProcessors;
         postProcessor.postProcessBeanDefinitionRegistry(registry)
         
      再执行BeanFactoryPostProcessor的方法
      1)、获取所有的BeanFactoryPostProcessor
      2)、看先执行实现了PriorityOrdered优先级接口的BeanFactoryPostProcessor、
         postProcessor.postProcessBeanFactory()
      3)、在执行实现了Ordered顺序接口的BeanFactoryPostProcessor;
         postProcessor.postProcessBeanFactory()
      4)、最后执行没有实现任何优先级或者是顺序接口的BeanFactoryPostProcessor;
         postProcessor.postProcessBeanFactory()

6、registerBeanPostProcessors(beanFactory);注册BeanPostProcessor(Bean的后置处理器)【 intercept bean creation】

      不同接口类型的BeanPostProcessor;在Bean创建前后的执行时机是不一样的
      BeanPostProcessor、
      DestructionAwareBeanPostProcessor、
      InstantiationAwareBeanPostProcessor、
      SmartInstantiationAwareBeanPostProcessor、
      MergedBeanDefinitionPostProcessor【internalPostProcessors】、
      
      1)、获取所有的 BeanPostProcessor;后置处理器都默认可以通过PriorityOrdered、Ordered接口来执行优先级
      2)、先注册PriorityOrdered优先级接口的BeanPostProcessor;
         把每一个BeanPostProcessor;添加到BeanFactory中
         beanFactory.addBeanPostProcessor(postProcessor);
      3)、再注册Ordered接口的
      4)、最后注册没有实现任何优先级接口的
      5)、最终注册MergedBeanDefinitionPostProcessor;
      6)、注册一个ApplicationListenerDetector;来在Bean创建完成后检查是否是ApplicationListener,如果是
         applicationContext.addApplicationListener((ApplicationListener<?>) bean);

7、initMessageSource();初始化MessageSource组件(做国际化功能;消息绑定,消息解析);

      1)、获取BeanFactory
      2)、看容器中是否有id为messageSource的,类型是MessageSource的组件
         如果有赋值给messageSource,如果没有自己创建一个DelegatingMessageSource;
            MessageSource:取出国际化配置文件中的某个key的值;能按照区域信息获取;
      3)、把创建好的MessageSource注册在容器中,以后获取国际化配置文件的值的时候,可以自动注入MessageSource;
         beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME, this.messageSource);   
         MessageSource.getMessage(String code, Object[] args, String defaultMessage, Locale locale);

8、initApplicationEventMulticaster();初始化事件派发器;

      1)、获取BeanFactory
      2)、从BeanFactory中获取applicationEventMulticaster的ApplicationEventMulticaster;
      3)、如果上一步没有配置;创建一个SimpleApplicationEventMulticaster
      4)、将创建的ApplicationEventMulticaster添加到BeanFactory中,以后其他组件直接自动注入

9、onRefresh();留给子容器(子类)

      1、子类重写这个方法,在容器刷新的时候可以自定义逻辑;

10、registerListeners();给容器中将所有项目里面的ApplicationListener注册进来;

      1、从容器中拿到所有的ApplicationListener
      2、将每个监听器添加到事件派发器中;
         getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);
      3、派发之前步骤产生的事件;

11、finishBeanFactoryInitialization(beanFactory);初始化所有剩下的单实例bean;

   1、beanFactory.preInstantiateSingletons();初始化后剩下的单实例bean
      1)、获取容器中的所有Bean,依次进行初始化和创建对象
      2)、获取Bean的定义信息;RootBeanDefinition
      3)、Bean不是抽象的,是单实例的,是懒加载;
         1)、判断是否是FactoryBean;是否是实现FactoryBean接口的Bean;
         2)、不是工厂Bean。利用getBean(beanName);创建对象
            0、getBean(beanName); ioc.getBean();
            1、doGetBean(name, null, null, false);
            2、先获取缓存中保存的单实例Bean。如果能获取到说明这个Bean之前被创建过(所有创建过的单实例Bean都会被缓存起来)
               从private final Map<String, Object> singletonObjects = new ConcurrentHashMap<String, Object>(256);获取的
            3、缓存中获取不到,开始Bean的创建对象流程;
            4、标记当前bean已经被创建
            5、获取Bean的定义信息;
            6、【获取当前Bean依赖的其他Bean;如果有按照getBean()把依赖的Bean先创建出来;】
            7、启动单实例Bean的创建流程;
               1)、createBean(beanName, mbd, args);
               2)、Object bean = resolveBeforeInstantiation(beanName, mbdToUse);让BeanPostProcessor先拦截返回代理对象;
                  【InstantiationAwareBeanPostProcessor】:提前执行;
                  先触发:postProcessBeforeInstantiation();
                  如果有返回值:触发postProcessAfterInitialization();
               3)、如果前面的InstantiationAwareBeanPostProcessor没有返回代理对象;调用4)
               4)、Object beanInstance = doCreateBean(beanName, mbdToUse, args);创建Bean
                   1)、【创建Bean实例】;createBeanInstance(beanName, mbd, args);
                     利用工厂方法或者对象的构造器创建出Bean实例;
                   2)、applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
                     调用MergedBeanDefinitionPostProcessor的postProcessMergedBeanDefinition(mbd, beanType, beanName);
                   3)、【Bean属性赋值】populateBean(beanName, mbd, instanceWrapper);
                     赋值之前:
                     1)、拿到InstantiationAwareBeanPostProcessor后置处理器;
                        postProcessAfterInstantiation();
                     2)、拿到InstantiationAwareBeanPostProcessor后置处理器;
                        postProcessPropertyValues();
                     =====赋值之前:===
                     3)、应用Bean属性的值;为属性利用setter方法等进行赋值;
                        applyPropertyValues(beanName, mbd, bw, pvs);
                   4)、【Bean初始化】initializeBean(beanName, exposedObject, mbd);
                     1)、【执行Aware接口方法】invokeAwareMethods(beanName, bean);执行xxxAware接口的方法
                        BeanNameAware\BeanClassLoaderAware\BeanFactoryAware
                     2)、【执行后置处理器初始化之前】applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
                        BeanPostProcessor.postProcessBeforeInitialization();
                    3 )、【执行初始化方法】invokeInitMethods(beanName, wrappedBean, mbd);
                        1)、是否是InitializingBean接口的实现;执行接口规定的初始化;
                        2)、是否自定义初始化方法;
                     4)、【执行后置处理器初始化之后】applyBeanPostProcessorsAfterInitialization
                        BeanPostProcessor.postProcessAfterInitialization();
                   5)、注册Bean的销毁方法;
               5)、将创建的Bean添加到缓存中singletonObjects;
            ioc容器就是这些Map;很多的Map里面保存了单实例Bean,环境信息。。。。;
      所有Bean都利用getBean创建完成以后;
         检查所有的Bean是否是SmartInitializingSingleton接口的;如果是;就执行afterSingletonsInstantiated();

12、finishRefresh();完成BeanFactory的初始化创建工作;IOC容器就创建完成;

      1)、initLifecycleProcessor();初始化和生命周期有关的后置处理器;LifecycleProcessor
         默认从容器中找是否有lifecycleProcessor的组件【LifecycleProcessor】;如果没有new DefaultLifecycleProcessor();
         加入到容器;
         
         写一个LifecycleProcessor的实现类,可以在BeanFactory
            void onRefresh();
            void onClose();    
      2)、    getLifecycleProcessor().onRefresh();
         拿到前面定义的生命周期处理器(BeanFactory);回调onRefresh();
      3)、publishEvent(new ContextRefreshedEvent(this));发布容器刷新完成事件;
      4)、liveBeansView.registerApplicationContext(this);

总结

   1)、Spring容器在启动的时候,先会保存所有注册进来的Bean的定义信息;
      1)、xml注册bean;<bean>
      2)、注解注册Bean;@Service、@Component、@Bean、xxx
   2)、Spring容器会合适的时机创建这些Bean
      1)、用到这个bean的时候;利用getBean创建bean;创建好以后保存在容器中;
      2)、统一创建剩下所有的bean的时候;finishBeanFactoryInitialization();
   3)、后置处理器;BeanPostProcessor
      1)、每一个bean创建完成,都会使用各种后置处理器进行处理;来增强bean的功能;
         AutowiredAnnotationBeanPostProcessor:处理自动注入
         AnnotationAwareAspectJAutoProxyCreator:来做AOP功能;
         xxx....
         增强的功能注解:
         AsyncAnnotationBeanPostProcessor
         ....
   4)、事件驱动模型;
      ApplicationListener;事件监听;
      ApplicationEventMulticaster;事件派发:

二、BeanDefinitionRegistryPostProcessor和BeanFactoryPostProcessor以及BeanPostProcessor

1、BeanDefinitionRegistryPostProcessor和BeanFactoryPostProcessor以及BeanPostProcessor都属于Spring的后置处理器,可以实现它们以达到动态注册bean定义,动态修改bean定义,以及动态修改bean。
2、BeanDefinitionRegistryPostProcessor继承接口BeanFactoryPostProcessor,该接口新增postProcessBeanDefinitionRegistry方法,方法参数是BeanDefinitionRegistry对象,BeanDefinitionRegistry对象是bean定义的保存中心。

众所周知BeanDefinitionRegistry是用于beanDefinition注册、修改的。那么此方法在就可以在spring standard initialization后去修改一个beanDefinition、或者新增一个。这个类有个巨屌的实现类ConfigurationClassPostProcessor,这个类将处理configuration的类中以下注解:@Import、@PropertySource、@ComponentScan、@ImportResource、@Bean methods等。将这些注解涉及到的BeanDifinition注册到BeanDefinitionRegistry中。对ConfigurationClassPostProcessor加载兴趣的查看可以看下此链接;

3、BeanFactoryPostProcessor是一个接口,它允许自定义修改应用程序上下文的bean定义,在基于bean factory上调整上下文的bean属性值。

BeanFactoryPostProcessor可以与bean交互并修改bean定义,但从不使用bean实例。 这个接口支持修改容器内的beanDefinition对象,也可以直接注册bean对象,在标准的beanDefinition注册之后以及预实例化bean对象之前postProcessBeanFactory方法,也是在实例化之前调用,也是读取bean定义并作出修改,比如属性修改,这个类spring也有一个巨牛的实现类PropertyPlaceholderConfigurer,这类的描述如下:将配置文件中的值注入到我们的代码中!!如数据源信息等。 BeanFactoryPostProcessor:BeanFactory级别的处理,是针对整个Bean的工厂进行处理

4、BeanPostProcessor也是一个接口,它允许动态修改应用程序上下文的bean,这时候bean已经实例化成功。 BeanPostProcessor:bean级别的处理,针对某个具体的bean进行处理

BeanPostProcessor子类比较多,有4个拓展接口,共11个方法,这个11方法描述如下:

1、BeanPostProcessors是在实例化后,初始化方法执行前、后分别执行2个方法(这里的初始化方法是init-method或者实现了InitializingBean的afterPropertiesSet方法,一般这个玩意用于读取缓存文件,初始化信息等操作)。通过这个类我们可以轻松的自定义受spring管理的bean,就是可以对bean为所欲为!

2、InstantiationAwareBeanPostProcessor拓展了BeanPostProcessors接口,这个接口也是非常的牛掰,可以在实例化Bean前(调用postProcessBeforeInstantiation方法)、后(postProcessAfterInstantiation)提供扩展的回调接口。
postProcessBeforeInstantiation这个返回值可以用来代替原本该生成的目标对象的实例(比如代理对象)。如果该方法的返回值代替原本该生成的目标对象,后续只有postProcessAfterInitialization方法会调用然后就直接返回了。不会在进行后续操作(可以看下AbstractAutoProxyCreator AOP代理实现)。这个类还是有一个方法:postProcessPropertyValues,这个方法是bean实例化后填充属性的时候使用,
3.SmartInstantiationAwareBeanPostProcessor又拓展了InstantiationAwareBeanPostProcessor接口,主要是供spring内部使用
4. MergedBeanDefinitionPostProcessor,也是实例化后执行,主要将那些元数据缓存起来以提供后续的postProcessPropertyValues输入注入时获取。
5. DestructionAwareBeanPostProcessor,是对象销毁的前置回调。

5、三者执行顺序:BeanDefinitionRegistryPostProcessor优先于BeanFactoryPostProcessor执行,BeanFactoryPostProcessor优先于BeanPostProcessor执行。

三、Bean生命周期

参考spring源码注释 
1、BeanNameAware's setBeanName
2、BeanClassLoaderAware's setBeanClassLoader
3、BeanFactoryAware's setBeanFactory
4、EnvironmentAware's setEnvironment
5、EmbeddedValueResolverAware's setEmbeddedValueResolver
6、ResourceLoaderAware's setResourceLoader (only applicable when running in an application context)
7、ApplicationEventPublisherAware's setApplicationEventPublisher (only applicable when running in an application context)
8、MessageSourceAware's setMessageSource (only applicable when running in an application context)
9、ApplicationContextAware's setApplicationContext (only applicable when running in an application context)
10、ServletContextAware's setServletContext (only applicable when running in a web application context)
11、postProcessBeforeInitialization methods of BeanPostProcessors
12、InitializingBean's afterPropertiesSet
13、a custom init-method definition
14、postProcessAfterInitialization methods of BeanPostProcessors 


/**
* bean的生命周期:
*         bean创建---初始化----销毁的过程
* 容器管理bean的生命周期;
* 我们可以自定义初始化和销毁方法;容器在bean进行到当前生命周期的时候来调用我们自定义的初始化和销毁方法
*
* 构造(对象创建)
*         单实例:在容器启动的时候创建对象
*         多实例:在每次获取的时候创建对象\
*
* BeanPostProcessor.postProcessBeforeInitialization
* 初始化:
*         对象创建完成,并赋值好,调用初始化方法。。。
* BeanPostProcessor.postProcessAfterInitialization
* 销毁:
*         单实例:容器关闭的时候
*         多实例:容器不会管理这个bean;容器不会调用销毁方法;
*
*
* 遍历得到容器中所有的BeanPostProcessor;挨个执行beforeInitialization,
* 一但返回null,跳出for循环,不会执行后面的BeanPostProcessor.postProcessorsBeforeInitialization
*
* BeanPostProcessor原理
* populateBean(beanName, mbd, instanceWrapper);给bean进行属性赋值
* initializeBean
* {
* applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
* invokeInitMethods(beanName, wrappedBean, mbd);执行自定义初始化
* applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
*}
*
*
*
* 1)、指定初始化和销毁方法;
*         通过@Bean指定init-method和destroy-method;
* 2)、通过让Bean实现InitializingBean(定义初始化逻辑),
*                 DisposableBean(定义销毁逻辑);
* 3)、可以使用JSR250;
*         @PostConstruct:在bean创建完成并且属性赋值完成;来执行初始化方法
*         @PreDestroy:在容器销毁bean之前通知我们进行清理工作
* 4)、BeanPostProcessor【interface】:bean的后置处理器;
*         在bean初始化前后进行一些处理工作;
*         postProcessBeforeInitialization:在初始化之前工作
*         postProcessAfterInitialization:在初始化之后工作
*
* Spring底层对 BeanPostProcessor 的使用;
*         bean赋值,注入其他组件,@Autowired,生命周期注解功能,@Async,xxx BeanPostProcessor;
*
*
*/   

扩展原理

/**
* 扩展原理:
* BeanPostProcessor:bean后置处理器,bean创建对象初始化前后进行拦截工作的
*
* 1、BeanFactoryPostProcessor:beanFactory的后置处理器;
*         在BeanFactory标准初始化之后调用,来定制和修改BeanFactory的内容;
*         所有的bean定义已经保存加载到beanFactory,但是bean的实例还未创建
*
*
* BeanFactoryPostProcessor原理:
* 1)、ioc容器创建对象
* 2)、invokeBeanFactoryPostProcessors(beanFactory);
*         如何找到所有的BeanFactoryPostProcessor并执行他们的方法;
*             1)、直接在BeanFactory中找到所有类型是BeanFactoryPostProcessor的组件,并执行他们的方法
*             2)、在初始化创建其他组件前面执行
*
* 2、BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor
*         postProcessBeanDefinitionRegistry();
*         在所有bean定义信息将要被加载,bean实例还未创建的;
*
*         优先于BeanFactoryPostProcessor执行;
*         利用BeanDefinitionRegistryPostProcessor给容器中再额外添加一些组件;
*
*     原理:
*         1)、ioc创建对象
*         2)、refresh()-》invokeBeanFactoryPostProcessors(beanFactory);
*         3)、从容器中获取到所有的BeanDefinitionRegistryPostProcessor组件。
*             1、依次触发所有的postProcessBeanDefinitionRegistry()方法
*             2、再来触发postProcessBeanFactory()方法BeanFactoryPostProcessor;
*
*         4)、再来从容器中找到BeanFactoryPostProcessor组件;然后依次触发postProcessBeanFactory()方法
*     
* 3、ApplicationListener:监听容器中发布的事件。事件驱动模型开发;
*       public interface ApplicationListener<E extends ApplicationEvent>
*         监听 ApplicationEvent 及其下面的子事件;
*
*      步骤:
*         1)、写一个监听器(ApplicationListener实现类)来监听某个事件(ApplicationEvent及其子类)
*             @EventListener;
*             原理:使用EventListenerMethodProcessor处理器来解析方法上的@EventListener;
*
*         2)、把监听器加入到容器;
*         3)、只要容器中有相关事件的发布,我们就能监听到这个事件;
*                 ContextRefreshedEvent:容器刷新完成(所有bean都完全创建)会发布这个事件;
*                 ContextClosedEvent:关闭容器会发布这个事件;
*         4)、发布一个事件:
*                 applicationContext.publishEvent();
*     
*  原理:
*      ContextRefreshedEvent、IOCTest_Ext$1[source=我发布的时间]、ContextClosedEvent;
*  1)、ContextRefreshedEvent事件:
*      1)、容器创建对象:refresh();
*      2)、finishRefresh();容器刷新完成会发布ContextRefreshedEvent事件
*  2)、自己发布事件;
*  3)、容器关闭会发布ContextClosedEvent;
*  
*  【事件发布流程】:
*      3)、publishEvent(new ContextRefreshedEvent(this));
*              1)、获取事件的多播器(派发器):getApplicationEventMulticaster()
*              2)、multicastEvent派发事件:
*              3)、获取到所有的ApplicationListener;
*                  for (final ApplicationListener<?> listener : getApplicationListeners(event, type)) {
*                  1)、如果有Executor,可以支持使用Executor进行异步派发;
*                      Executor executor = getTaskExecutor();
*                  2)、否则,同步的方式直接执行listener方法;invokeListener(listener, event);
*                   拿到listener回调onApplicationEvent方法;
*  
*  【事件多播器(派发器)】
*      1)、容器创建对象:refresh();
*      2)、initApplicationEventMulticaster();初始化ApplicationEventMulticaster;
*          1)、先去容器中找有没有id=“applicationEventMulticaster”的组件;
*          2)、如果没有this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory);
*              并且加入到容器中,我们就可以在其他组件要派发事件,自动注入这个applicationEventMulticaster;
*  
*  【容器中有哪些监听器】
*      1)、容器创建对象:refresh();
*      2)、registerListeners();
*          从容器中拿到所有的监听器,把他们注册到applicationEventMulticaster中;
*          String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false);
*          //将listener注册到ApplicationEventMulticaster中
*          getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);
*          
*   SmartInitializingSingleton 原理:->afterSingletonsInstantiated();
*           1)、ioc容器创建对象并refresh();
*           2)、finishBeanFactoryInitialization(beanFactory);初始化剩下的单实例bean;
*               1)、先创建所有的单实例bean;getBean();
*               2)、获取所有创建好的单实例bean,判断是否是SmartInitializingSingleton类型的;
*                   如果是就调用afterSingletonsInstantiated();
*         
*
*
*/
用Verilog搭建PCIe控制器核心模块 PCIe控制器是硬件设计的核心模块,负责实现设备与主机之间的高速通信。本文将以Verilog语言为例,分步骤讲解如何从零构建一个简化的PCIe控制器核心模块,涵盖事务层(TLP)生成、数据链路层(DLLP)处理和物理层(PHY)接口适配。目标是为嵌入式开发者、FPGA工程师提供一个可扩展的硬件设计框架。​。 阅读详情

相关推荐

从零到一:用Python打造你的智能交互桌宠,附完整源码与打包指南

本文详细介绍了如何从零开始使用Python开发智能交互桌宠,涵盖环境配置、窗口创建、动图加载、交互功能实现及打包发布全流程。教程特别适合零基础开发者,通过完整源码和分步指南,帮助读者快速掌握桌面宠物开发技巧,打造个性化AI伴侣。

weixin_29094539的博客 292

Spring Boot 后端初始化的三种方法 笔记

后端初始化 Spring Boot IDEA

Coder-thinking的博客 188

安卓光速虚拟机ADB调试实战:从密钥配置到设备连接

本文详细介绍了在安卓光速虚拟机中进行ADB调试的完整实战流程。核心在于通过密钥配置解决设备未授权问题,并启用网络调试与端口映射,最终实现电脑与虚拟机的稳定连接。文章提供了从原理理解、脚本修改到实战命令和疑难排查的全方位指南,帮助开发者和爱好者高效利用光速虚拟机作为移动测试沙盒。

CAT789的专栏 555

(三)Spring-初始化bean的三种方式以及bean的后置处理器

1、通过@PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作 //定义相关的实现类: public class PersonService { private String message; public String getMessage() { return message; } ...

wxd_1024的博客 2301

STM32CUBEMX | STM32L431RCT6的内部Flash操作

一、STM32CUBEMX配置 1、选择芯片型号: 2、配置时钟源 1、 如果选择使用外部高速时钟(HSE),则需要在System Core中配置RCC; 2、 如果使用默认内部时钟(HSI),这一步可以略过; 3、配置时钟树 STM32L4的最高主频到80M,所以配置PLL,最后使HCLK = 80Mhz即可: 4、代码生成设置 点击GENERATE CODE即可生成MDK-V5工程: 二、在MDK中编写、编译、下载用户代码 1、STM32内部Flash及HAL库API 查看所使用芯片的信息,

yongridada的博客 5568

用Simulink对Carsim车辆进行档位控制

用Simulink对Carsim车辆进行档位控制一、carsim中的档位设置为开环控制二、在Constant目录下面选取一个选项并重新命名为constant :0 Gear三、双击进去设置常量为 0四、输入和输出IO通道五、验证 :输入 为 3 档 ----- 输出 为 3!六、参考 一、carsim中的档位设置为开环控制 二、在Constant目录下面选取一个选项并重新命名为constant :0 Gear 三、双击进去设置常量为 0 四、输入和输出IO通道 五、验证 :输入 为 3 档 -

qq_42027654的博客 2601

Spring对象初始化赋值的三种方式

Spring对象初始化赋值的三种方式

wl_ihyyn的博客 766

昇腾310B实战:FFmpeg硬件加速全流程解析与性能优化

本文详细解析了昇腾310B与FFmpeg硬件加速的全流程,包括环境配置、性能优化及常见问题排查。通过实战案例展示,昇腾310B在视频转码中性能提升可达6倍,同时降低功耗,特别适合多媒体处理和高性能计算场景。

m3n5b7v8c9x的博客 733

Spring启动后进行一些初始化的方式汇总

spring启动后初始化操作的方式

weixin_44368487的博客 2132

从零搭建openEuler ARM64开发测试环境:手把手教你用libvirt+KVM配置虚拟机(含VNC远程安装)

本文详细介绍了如何在ARM64平台上从零搭建openEuler开发测试环境,涵盖libvirt和KVM配置虚拟机的完整流程,包括环境准备、存储配置、网络优化、XML配置详解以及VNC远程安装。特别针对华为欧拉(openEuler)系统进行了优化,帮助开发者快速构建高效的ARM架构虚拟化环境。

weixin_30545945的博客 586

AUTOSAR进阶图解==>AUTOSAR_SWS_BSWGeneral

本文详细解析AUTOSAR基础软件(BSW)模块的通用规范,涵盖其分层架构、配置管理、初始化流程和状态转换机制。AUTOSAR采用清晰的分层设计,包括应用层、服务层、ECU抽象层和微控制器抽象层,各层模块通过标准化接口交互。BSW模块配置采用类型化定义,支持预初始化、初始化和后期构建配置。文档还阐述了模块初始化流程中的依赖管理,以及运行时的状态转换与错误处理机制,为汽车电子控制单元的标准化开发提供规范指导。

一名留德华的,康德的信徒的,专注于汽车电子领域的博客 1127

spring容器初始化过程笔记(四)InitializingBean 接口的 afterPropertiesSet 方法执行

这篇讲了spring源码InitializingBean接口的afterPropertiesSet方法执行描述,主要是对spring源码做笔记,需要读者下载spring源码编译执行辅助。

weixin_43064364的博客 2088

一次请求穿过的六道关卡:微服务基础组件的通信与IO、事件驱动、负载均衡、服务路由、API网关与配置协调

微服务的稳定性往往取决于看不见的基础组件。本文跟随一次下单请求,依次穿过API网关、服务路由、负载均衡与服务通信,再沿事件分支扇出,并从控制面审视配置中心。通信层剖析握手成本、连接复用、epoll与主从Reactor、心跳判活、退避抖动、截止时间与重试预算;事件层讲解编舞与编排、事务发件箱和幂等消费;均衡与路由对比静态与动态算法、路由链、全链路灰度与同区保底;网关讨论过滤器链与限流算法;配置部分给出四类配置、长轮询与共识协调,最后归纳五道防线。文中关键数据均来自可在Java8运行的演示程序。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 172万+

读取Spring的配置文件applicationContext.xml的5种方法(面试题)

https://www.cnblogs.com/sprinng/p/5622600.html

IUNIQUE技术册 462

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Sprin

1Spring 是什么? Spring 是一个开源框架,Spring 是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson在其著作 Expert One-On-One J2EE Development and Design 中阐述的部分理念和原型衍生而来。 它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 J2EE应用程序开发提供集成的框架。Spring 使用基本的 JavaBean 来完成以前只可能

FYHLH的博客 245

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Sprin boot -- JdbcTemplate

JdbcTemplate 是Spring 提供的一套JDBC 的模板,利用 AOP技术来解决直接使用JDBC时大量重复代码的问题,JdbcTempalte虽然没有mybatis 那么灵活,但是比直接使用JDBC 要方便很多,Spring boot 对jdbcTemplate 的使用提供了自动化配置类,JdbcTemplateAutoConfiguration。 pom文件 <depe...

weixin_38297879的博客 326

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Sprin6 MVC 第三章 SSM 配置

2. 目录结构

YUELEI118的博客 1235

Sprin-AOP动态代理

AOP动态代理 相关术语 连接点 Joinpoint 可以被拦截的方法,即可以被增强的方法,这些方法就成为连接点 切入点Pointcut 真正被拦截增强的方法 通知Advice 增加的内容和功能,通常是封装的方法 引介Introduction 类层面的增强,给原有类增加一些新的属性和方法 被增强的对象Target 被增强的对象 织入Weaving 将通知应用到目标...

小白的蟒蛇 187

Struts2 与Sprin MVC的区别

之前我们已经研究了struts以及spring mvc,并且知道了他们是怎样工作的,又是怎样应用的,他们都实现了mvc思想,都很好的将表示层与业务逻辑层解耦了,那么他们有什么区别吗?     先温习一下他们的工作原理:     struts框架:                 spring mvc框架:               1、Struts2是类级

士不可以不弘毅,任重而道远 696

了解sprin是什么?有啥用?为什么要用?

张三

qq_62881798的博客 546

Sprin框架 -- 基于注解IOC配置

一、使用注解配置IOC 概念:注解配置和XML配置要实现的功能都是一样的,都是要降低程序间的耦合,只是配置的形式不一样。在实际开发中通常是XML和注解两者混合使用,举例:dao层用注解创建的对象,在service层用xml创建的对象一样可以注入dao。 二、常用注解 1. @Component --创建对象 作用:把对象交给 springIOC 容器来管理,相当于在 xml 中配置一个 be...

来日可期的博客 211

sprin mvc案例 流程图

Woderful life!! 735

IntelliJ IDEA RunDebug Configurations没有Sprin Boot On update action

场景描述: 使用On update action,选择 Update resources后,修改前端代码后不用重启服务自动编译生效 问题描述: 新安装idea后,Run/Debug Configurations 没有Sprin Boot On update action 处理方法: File - settings - plugins,搜索spring,将spring相关的插件全部安装,将原有的 启动入口删除,重新运行即可 ...

sharionlee 3982

Sprin-Boot-Starter 简要介绍

spring-boot-starter-activemq:用于集成和配置ActiveMQ消息队列。spring-boot-starter-actuator:提供监控和管理Spring Boot应用程序的功能,包括健康检查、指标收集和暴露、配置信息等。spring-boot-starter-amqp:用于集成和配置AMQP(高级消息队列协议),例如RabbitMQ。spring-boot-starter-aop:用于支持面向切面编程(AOP)的功能,例如方法拦截和切面配置。

qq_45920123的博客 301

sprin mvc 处理购物车问题

sprin mvc 处理购物车问题

qq_33291307的博客 393

ASP Sprin.net在MVC中的使用

一、在Asp.net MVC中应该怎样使用Spring.Net? 1:先导入dll文件。   lib/*.Core.dll    .Web.dll   .Web.Extensions.dll   .Web.Mvc4.dll   Common.Logging.dll 2:将案例中的Config文件夹拷贝到项目中。  Config/controllers.xml     Config/servic

houyanhua1的专栏 260
上一篇: Redis之RDB与AOF 笔记
下一篇: Spring是如何解决的循环依赖
huapro.vip
博客等级 码龄15年 36粉丝 73原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值