首页 文章 精选 留言 我的

精选列表

搜索[水印魔术手],共7375篇文章
优秀的个人博客,低调大师

第一次手搓!用 WorkBuddy 半小时做出安全可靠测评动态看板(附在线体验)

今天第一次下载 WorkBuddy 体验尝鲜,看到 Hy3(混元思考)大模型开放免费,就体验了一把:把国家信息安全测评中心官网(itsec.gov.cn/aqkkcp)公布的「安全可靠测评结果」,从 2023–2026 年度共 136 条通过测评的产品数据,做成了一个动态可交付前端页面(在线体验可以点击链接https://90083f5e0dbe4d8ab4328063c6e6e903.app.codebuddy.work/)。不到半小时,WorkBuddy 真给我一个深色玻璃拟态动态看板——按年度、产品分类、送测单位随便点,图表实时联动,连 CR5/CR10 集中度、跨年持续送测单位这些指标都算好了,效果还蛮好的。

优秀的个人博客,低调大师

Linux 内核“二把手”揭秘 AI 漏洞挖掘神器:Framework Desktop + AMD Ryzen AI Max本地运行

Linux 内核稳定版维护者、被誉为"二号人物"的 Greg Kroah-Hartman 近日在 Mastodon 上分享了其 AI 辅助漏洞挖掘工具"gkh_clanker_t1000"的设备照片—— 一台搭载 AMD Ryzen AI Max+ 处理器的 Framework Desktop 迷你主机。 Framework Desktop是 Framework 公司推出的模块化迷你主机,以其可升级性和开源友好性著称。配合 AMD Ryzen AI Max+ "Strix Halo"处理器,这台机器具备强大的本地 AI 推理能力: Ryzen AI Max 系列是 AMD 针对 AI 工作负载优化的旗舰移动处理器 集成的 NPU 和强大的 iGPU 能够高效运行本地 LLM 在完全开源的软件栈上运行,符合 Linux 内核开发的哲学 Phoronix 创始人 Michael Larabel 表示,他在评测 HP ZBook Ultra G1a 后,也将所有 AMD Strix Halo 的持续测试工作转移到了 Framework Desktop 上,因为"这套组合对于 demanding workloads 表现出色"。 据 Phoronix 报道,自 4 月 7 日以来,已有近二十多个补丁被合并到 Linux 主线内核中,修复了 ALSA、HID、SMB、Nouveau、IO_uring 等子系统的漏洞,而这些补丁均由 "gkh_clanker_t1000" 协助发现。这款工具本质上是一个基于大语言模型的模糊测试机器人,能够自动分析内核代码并发现潜在的安全缺陷。 从 Greg KH 分享的照片中可以清晰看到,这套系统的核心是一台 Framework Desktop,搭载了 AMD Ryzen AI Max+ "Strix Halo" 处理器。这款处理器以其强大的 CPU 和集成 GPU 性能著称,在开源软件栈上运行本地大语言模型表现出色。Phoronix 的测试也证实了这一点 —— 在归还 HP ZBook Ultra G1a 评测机后,其所有 AMD Strix Halo 的持续测试都转移到了 Framework Desktop 上进行。 值得注意的是,Greg KH 选择在本地运行这套 AI 系统,而非依赖云端 LLM。这种做法既保证了内核代码的隐私安全,也避免了将潜在的漏洞信息上传到第三方服务器。对于处理如此敏感的内核代码而言,本地部署无疑是更稳妥的选择。 Greg KH 目前尚未透露 "gkh_clanker_t1000" 的软件端细节,包括具体使用了哪款开源大模型、以及 fuzzing 框架的实现方式。但可以预见的是,随着 AI 辅助代码审查工具的普及,Linux 内核的开发流程可能会迎来新的变革 —— 更多漏洞将在代码合并前被自动发现,从而提升整个内核生态系统的安全性。 参考来源 Phoronix原文:https://www.phoronix.com/news/Clanker-T1000-AMD-Ryzen-AI-Max Greg Kroah-Hartman的Mastodon动态:https://social.kernel.org/notice/B5cUWPXR9szWBvEI1w 早期报道:Greg KH Clanker Linux Bugs:https://www.phoronix.com/news/Greg-KH-Clanker-Linux-Bugs Framework Desktop评测:https://www.phoronix.com/search/Framework+Desktop AMD Ryzen AI Max相关报道:https://www.phoronix.com/search/Ryzen+AI+Max

优秀的个人博客,低调大师

自己手搓一套咨询风格的PPT Skills技能包并开源-WorkBuddy技能市场和GitHub可下载

很多人以为,咨询顾问风格 PPT 的关键是配色、版式和图标。它们当然重要,但真正决定一页 PPT 是否有说服力的,是内容有没有被转化为清晰的判断结构。我的目标不是做一个“把文字排得更漂亮”的工具,而是把从材料到结论、从结论到证据、从证据到视觉表达的过程,沉淀为一套可复用的生成技能。

优秀的个人博客,低调大师

《Spring 手撸专栏》第 15 章:万人之敌,通过注解给属性注入配置和Bean对象

持续坚持原创输出,点击蓝字关注我吧 作者:小傅哥博客:https://bugstack.cn ❝ 沉淀、分享、成长,让自己和他人都能有所收获!😜 ❞ 目录 一、前言 二、目标 三、方案 四、实现 1. 工程结构 2. 把读取到属性填充到容器 3. 自定义属性注入注解 4. 扫描自定义注解 5. 在Bean的生命周期中调用属性注入 五、测试 1. 事先准备 2. 属性配置文件 3. 单元测试 六、总结 七、系列推荐 一、前言 写代码,就是从能用到好用的不断折腾! 你听过扰动函数吗?你写过斐波那契(Fibonacci)散列吗?你实现过梅森旋转算法吗?怎么 没听过这些写不了代码吗!不会的,即使没听过你一样可以写的了代码,比如你实现的数据库路由数据总是落在1库1表它不散列分布、你实现的抽奖系统总是把运营配置的最大红包发出去提高了运营成本、你开发的秒杀系统总是在开始后的1秒就挂了货品根本给不出去。 除了一部分仅把编码当成搬砖应付工作外的程序员,还有一部分总是在追求极致的码农。写代码还能赚钱,真开心! 这样的码农总是会考虑🤔还有没有更好的实现逻辑能让代码不仅是能用,还要好用呢?其实这一点的追求到完成,需要大量扩展性学习和深度挖掘,这样你设计出来的系统才更你考虑的更加全面,也能应对各种复杂的场景。 二、目标 在目前 IOC、AOP 两大核心功能模块的支撑下,完全可以管理 Bean 对象的注册和获取,不过这样的使用方式总感觉像是刀耕火种有点难用。因此在上一章节我们解决需要手动配置 Bean 对象到 spring.xml 文件中,改为可以自动扫描带有注解 @Component 的对象完成自动装配和注册到 Spring 容器的操作。 那么在自动扫描包注册 Bean 对象之后,就需要把原来在配置文件中通过 property name="token" 配置属性和Bean的操作,也改为可以自动注入。这就像我们使用 Spring 框架中 @Autowired、@Value 注解一样,完成我们对属性和对象的注入操作。 三、方案 其实从我们在完成 Bean 对象的基础功能后,后续陆续添加的功能都是围绕着 Bean 的生命周期进行的,比如修改 Bean 的定义 BeanFactoryPostProcessor,处理 Bean 的属性要用到 BeanPostProcessor,完成个性的属性操作则专门继承 BeanPostProcessor 提供新的接口,因为这样才能通过 instanceof 判断出具有标记性的接口。所以关于 Bean 等等的操作,以及监听 Aware、获取 BeanFactory,都需要在 Bean 的生命周期中完成。那么我们在设计属性和 Bean 对象的注入时候,也会用到 BeanPostProcessor 来完成在设置 Bean 属性之前,允许 BeanPostProcessor 修改属性值。整体设计结构如下图: 要处理自动扫描注入,包括属性注入、对象注入,则需要在对象属性 applyPropertyValues 填充之前 ,把属性信息写入到 PropertyValues 的集合中去。这一步的操作相当于是解决了以前在 spring.xml 配置属性的过程。 而在属性的读取中,需要依赖于对 Bean 对象的类中属性的配置了注解的扫描, field.getAnnotation(Value.class); 依次拿出符合的属性并填充上相应的配置信息。 这里有一点 ,属性的配置信息需要依赖于 BeanFactoryPostProcessor 的实现类 PropertyPlaceholderConfigurer,把值写入到 AbstractBeanFactory的embeddedValueResolvers集合中,这样才能在属性填充中利用 beanFactory 获取相应的属性值 还有一个是关于 @Autowired 对于对象的注入,其实这一个和属性注入的唯一区别是对于对象的获取 beanFactory.getBean(fieldType),其他就没有什么差一点了。 当所有的属性被设置到 PropertyValues 完成以后,接下来就到了创建对象的下一步,属性填充,而此时就会把我们一一获取到的配置和对象填充到属性上,也就实现了自动注入的功能。 四、实现 1. 工程结构 small-spring-step-14└──src├──main│└──java│└──cn.bugstack.springframework│├──aop││├──aspectj│││└──AspectJExpressionPointcut.java│││└──AspectJExpressionPointcutAdvisor.java││├──framework│││├──adapter││││└──MethodBeforeAdviceInterceptor.java│││├──autoproxy││││└──MethodBeforeAdviceInterceptor.java│││├──AopProxy.java│││├──Cglib2AopProxy.java│││├──JdkDynamicAopProxy.java│││├──ProxyFactory.java│││└──ReflectiveMethodInvocation.java││├──AdvisedSupport.java││├──Advisor.java││├──BeforeAdvice.java││├──ClassFilter.java││├──MethodBeforeAdvice.java││├──MethodMatcher.java││├──Pointcut.java││├──PointcutAdvisor.java││└──TargetSource.java│├──beans││├──factory│││├──annotation││││├──Autowired.java││││├──AutowiredAnnotationBeanPostProcessor.java││││├──Qualifier.java││││└──Value.java│││├──config││││├──AutowireCapableBeanFactory.java││││├──BeanDefinition.java││││├──BeanFactoryPostProcessor.java││││├──BeanPostProcessor.java││││├──BeanReference.java││││├──ConfigurableBeanFactory.java││││├──InstantiationAwareBeanPostProcessor.java││││└──SingletonBeanRegistry.java│││├──support││││├──AbstractAutowireCapableBeanFactory.java││││├──AbstractBeanDefinitionReader.java││││├──AbstractBeanFactory.java││││├──BeanDefinitionReader.java││││├──BeanDefinitionRegistry.java││││├──CglibSubclassingInstantiationStrategy.java││││├──DefaultListableBeanFactory.java││││├──DefaultSingletonBeanRegistry.java││││├──DisposableBeanAdapter.java││││├──FactoryBeanRegistrySupport.java││││├──InstantiationStrategy.java││││└──SimpleInstantiationStrategy.java│││├──support││││└──XmlBeanDefinitionReader.java│││├──Aware.java│││├──BeanClassLoaderAware.java│││├──BeanFactory.java│││├──BeanFactoryAware.java│││├──BeanNameAware.java│││├──ConfigurableListableBeanFactory.java│││├──DisposableBean.java│││├──FactoryBean.java│││├──HierarchicalBeanFactory.java│││├──InitializingBean.java│││├──ListableBeanFactory.java│││└──PropertyPlaceholderConfigurer.java││├──BeansException.java││├──PropertyValue.java││└──PropertyValues.java│├──context││├──annotation│││├──ClassPathBeanDefinitionScanner.java│││├──ClassPathScanningCandidateComponentProvider.java│││└──Scope.java││├──event│││├──AbstractApplicationEventMulticaster.java│││├──ApplicationContextEvent.java│││├──ApplicationEventMulticaster.java│││├──ContextClosedEvent.java│││├──ContextRefreshedEvent.java│││└──SimpleApplicationEventMulticaster.java││├──support│││├──AbstractApplicationContext.java│││├──AbstractRefreshableApplicationContext.java│││├──AbstractXmlApplicationContext.java│││├──ApplicationContextAwareProcessor.java│││└──ClassPathXmlApplicationContext.java││├──ApplicationContext.java││├──ApplicationContextAware.java││├──ApplicationEvent.java││├──ApplicationEventPublisher.java││├──ApplicationListener.java││└──ConfigurableApplicationContext.java│├──core.io││├──ClassPathResource.java││├──DefaultResourceLoader.java││├──FileSystemResource.java││├──Resource.java││├──ResourceLoader.java││└──UrlResource.java│├──stereotype││└──Component.java│└──utils│├──ClassUtils.java│└──StringValueResolver.java└──test└──java└──cn.bugstack.springframework.test├──bean│├──IUserService.java│└──UserService.java└──ApiTest.java 工程源码:公众号「bugstack虫洞栈」,回复:Spring 专栏,获取完整源码 自动扫描注入占位符配置和对象的类关系,如图 15-2 图 15-2 在整个类图中以围绕实现接口 InstantiationAwareBeanPostProcessor 的类 AutowiredAnnotationBeanPostProcessor 作为入口点,被 AbstractAutowireCapableBeanFactory创建 Bean 对象过程中调用扫描整个类的属性配置中含有自定义注解 Value、 Autowired、 Qualifier,的属性值。 这里稍有变动的是关于属性值信息的获取,在注解配置的属性字段扫描到信息注入时,包括了占位符从配置文件获取信息也包括 Bean 对象,Bean 对象可以直接获取,但配置信息需要在 AbstractBeanFactory 中添加新的属性集合 embeddedValueResolvers,由 PropertyPlaceholderConfigurer#postProcessBeanFactory 进行操作填充到属性集合中。 2. 把读取到属性填充到容器 定义解析字符串接口 cn.bugstack.springframework.util.StringValueResolver publicinterfaceStringValueResolver{StringresolveStringValue(StringstrVal);} 接口 StringValueResolver 是一个解析字符串操作的接口 填充字符串 publicclassPropertyPlaceholderConfigurerimplementsBeanFactoryPostProcessor{@OverridepublicvoidpostProcessBeanFactory(ConfigurableListableBeanFactorybeanFactory)throwsBeansException{try{//加载属性文件DefaultResourceLoaderresourceLoader=newDefaultResourceLoader();Resourceresource=resourceLoader.getResource(location);//...占位符替换属性值、设置属性值//向容器中添加字符串解析器,供解析@Value注解使用StringValueResolvervalueResolver=newPlaceholderResolvingStringValueResolver(properties);beanFactory.addEmbeddedValueResolver(valueResolver);}catch(IOExceptione){thrownewBeansException("Couldnotloadproperties",e);}}privateclassPlaceholderResolvingStringValueResolverimplementsStringValueResolver{privatefinalPropertiesproperties;publicPlaceholderResolvingStringValueResolver(Propertiesproperties){this.properties=properties;}@OverridepublicStringresolveStringValue(StringstrVal){returnPropertyPlaceholderConfigurer.this.resolvePlaceholder(strVal,properties);}}} 在解析属性配置的类 PropertyPlaceholderConfigurer 中,最主要的其实就是这行代码的操作 beanFactory.addEmbeddedValueResolver(valueResolver) 这是把属性值写入到了 AbstractBeanFactory 的 embeddedValueResolvers 中。 这里说明下,embeddedValueResolvers 是 AbstractBeanFactory 类新增加的集合 List<StringValueResolver> embeddedValueResolvers String resolvers to apply e.g. to annotation attribute values 3. 自定义属性注入注解 自定义注解,Autowired、Qualifier、Value @Retention(RetentionPolicy.RUNTIME)@Target({ElementType.CONSTRUCTOR,ElementType.FIELD,ElementType.METHOD})public@interfaceAutowired{}@Target({ElementType.FIELD,ElementType.METHOD,ElementType.PARAMETER,ElementType.TYPE,ElementType.ANNOTATION_TYPE})@Retention(RetentionPolicy.RUNTIME)@Inherited@Documentedpublic@interfaceQualifier{Stringvalue()default"";}@Target({ElementType.FIELD,ElementType.METHOD,ElementType.PARAMETER})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic@interfaceValue{/***Theactualvalueexpression:e.g."#{systemProperties.myProp}".*/Stringvalue();} 3个注解在我们日常使用 Spring 也是非常常见的,注入对象、注入属性,而 Qualifier 一般与 Autowired 配合使用。 4. 扫描自定义注解 cn.bugstack.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor publicclassAutowiredAnnotationBeanPostProcessorimplementsInstantiationAwareBeanPostProcessor,BeanFactoryAware{privateConfigurableListableBeanFactorybeanFactory;@OverridepublicvoidsetBeanFactory(BeanFactorybeanFactory)throwsBeansException{this.beanFactory=(ConfigurableListableBeanFactory)beanFactory;}@OverridepublicPropertyValuespostProcessPropertyValues(PropertyValuespvs,Objectbean,StringbeanName)throwsBeansException{//1.处理注解@ValueClass<?>clazz=bean.getClass();clazz=ClassUtils.isCglibProxyClass(clazz)?clazz.getSuperclass():clazz;Field[]declaredFields=clazz.getDeclaredFields();for(Fieldfield:declaredFields){ValuevalueAnnotation=field.getAnnotation(Value.class);if(null!=valueAnnotation){Stringvalue=valueAnnotation.value();value=beanFactory.resolveEmbeddedValue(value);BeanUtil.setFieldValue(bean,field.getName(),value);}}//2.处理注解@Autowiredfor(Fieldfield:declaredFields){AutowiredautowiredAnnotation=field.getAnnotation(Autowired.class);if(null!=autowiredAnnotation){Class<?>fieldType=field.getType();StringdependentBeanName=null;QualifierqualifierAnnotation=field.getAnnotation(Qualifier.class);ObjectdependentBean=null;if(null!=qualifierAnnotation){dependentBeanName=qualifierAnnotation.value();dependentBean=beanFactory.getBean(dependentBeanName,fieldType);}else{dependentBean=beanFactory.getBean(fieldType);}BeanUtil.setFieldValue(bean,field.getName(),dependentBean);}}returnpvs;}} AutowiredAnnotationBeanPostProcessor 是实现接口 InstantiationAwareBeanPostProcessor 的一个用于在 Bean 对象实例化完成后,设置属性操作前的处理属性信息的类和操作方法。 只有实现了 BeanPostProcessor 接口才有机会在 Bean 的生命周期中处理初始化信息 核心方法 postProcessPropertyValues,主要用于处理类含有 @Value、@Autowired 注解的属性,进行属性信息的提取和设置。 这里需要注意一点因为我们在 AbstractAutowireCapableBeanFactory 类中使用的是 CglibSubclassingInstantiationStrategy 进行类的创建,所以在 AutowiredAnnotationBeanPostProcessor#postProcessPropertyValues 中需要判断是否为 CGlib 创建对象,否则是不能正确拿到类信息的。 ClassUtils.isCglibProxyClass(clazz) ? clazz.getSuperclass() : clazz; 5. 在Bean的生命周期中调用属性注入 cn.bugstack.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory publicabstractclassAbstractAutowireCapableBeanFactoryextendsAbstractBeanFactoryimplementsAutowireCapableBeanFactory{privateInstantiationStrategyinstantiationStrategy=newCglibSubclassingInstantiationStrategy();@OverrideprotectedObjectcreateBean(StringbeanName,BeanDefinitionbeanDefinition,Object[]args)throwsBeansException{Objectbean=null;try{//判断是否返回代理Bean对象bean=resolveBeforeInstantiation(beanName,beanDefinition);if(null!=bean){returnbean;}//实例化Beanbean=createBeanInstance(beanDefinition,beanName,args);//在设置Bean属性之前,允许BeanPostProcessor修改属性值applyBeanPostProcessorsBeforeApplyingPropertyValues(beanName,bean,beanDefinition);//给Bean填充属性applyPropertyValues(beanName,bean,beanDefinition);//执行Bean的初始化方法和BeanPostProcessor的前置和后置处理方法bean=initializeBean(beanName,bean,beanDefinition);}catch(Exceptione){thrownewBeansException("Instantiationofbeanfailed",e);}//注册实现了DisposableBean接口的Bean对象registerDisposableBeanIfNecessary(beanName,bean,beanDefinition);//判断SCOPE_SINGLETON、SCOPE_PROTOTYPEif(beanDefinition.isSingleton()){registerSingleton(beanName,bean);}returnbean;}/***在设置Bean属性之前,允许BeanPostProcessor修改属性值**@parambeanName*@parambean*@parambeanDefinition*/protectedvoidapplyBeanPostProcessorsBeforeApplyingPropertyValues(StringbeanName,Objectbean,BeanDefinitionbeanDefinition){for(BeanPostProcessorbeanPostProcessor:getBeanPostProcessors()){if(beanPostProcessorinstanceofInstantiationAwareBeanPostProcessor){PropertyValuespvs=((InstantiationAwareBeanPostProcessor)beanPostProcessor).postProcessPropertyValues(beanDefinition.getPropertyValues(),bean,beanName);if(null!=pvs){for(PropertyValuepropertyValue:pvs.getPropertyValues()){beanDefinition.getPropertyValues().addPropertyValue(propertyValue);}}}}}//...} AbstractAutowireCapableBeanFactory#createBean 方法中有这一条新增加的方法调用,就是在 设置 Bean 属性之前,允许 BeanPostProcessor 修改属性值 的操作 applyBeanPostProcessorsBeforeApplyingPropertyValues 那么这个 applyBeanPostProcessorsBeforeApplyingPropertyValues 方法中,首先就是获取已经注入的 BeanPostProcessor 集合并从中筛选出继承接口 InstantiationAwareBeanPostProcessor 的实现类。 最后就是调用相应的 postProcessPropertyValues 方法以及循环设置属性值信息, beanDefinition.getPropertyValues().addPropertyValue(propertyValue); 五、测试 1. 事先准备 配置 Dao @ComponentpublicclassUserDao{privatestaticMap<String,String>hashMap=newHashMap<>();static{hashMap.put("10001","小傅哥,北京,亦庄");hashMap.put("10002","八杯水,上海,尖沙咀");hashMap.put("10003","阿毛,香港,铜锣湾");}publicStringqueryUserName(StringuId){returnhashMap.get(uId);}} 给类配置上一个自动扫描注册 Bean 对象的注解 @Component,接下来会把这个类注入到 UserService 中。 注解注入到 UserService @Component("userService")publicclassUserServiceimplementsIUserService{@Value("${token}")privateStringtoken;@AutowiredprivateUserDaouserDao;publicStringqueryUserInfo(){try{Thread.sleep(newRandom(1).nextInt(100));}catch(InterruptedExceptione){e.printStackTrace();}returnuserDao.queryUserName("10001")+","+token;}//...} 这里包括了两种类型的注入,一个是占位符注入属性信息 @Value("${token}"),另外一个是注入对象信息 @Autowired 2. 属性配置文件 token.properties token=RejDlI78hu223Opo983Ds spring.xml <?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context"><beanclass="cn.bugstack.springframework.beans.factory.PropertyPlaceholderConfigurer"><propertyname="location"value="classpath:token.properties"/></bean><context:component-scanbase-package="cn.bugstack.springframework.test.bean"/></beans> 在 spring.xml 中配置了扫描属性信息和自动扫描包路径范围。 3. 单元测试 @Testpublicvoidtest_scan(){ClassPathXmlApplicationContextapplicationContext=newClassPathXmlApplicationContext("classpath:spring.xml");IUserServiceuserService=applicationContext.getBean("userService",IUserService.class);System.out.println("测试结果:"+userService.queryUserInfo());} 单元测试时候就可以完整的测试一个类注入到 Spring 容器,同时这个属性信息也可以被自动扫描填充上。 测试结果 测试结果:小傅哥,北京,亦庄,RejDlI78hu223Opo983DsProcessfinishedwithexitcode0 从测试结果可以看到现在我们的使用方式已经通过了,有自动扫描类,有注解注入属性。这与使用 Spring 框架越来越像了。 六、总结 从整个注解信息扫描注入的实现内容来看,我们一直是围绕着在 Bean 的生命周期中进行处理,就像 BeanPostProcessor 用于修改新实例化 Bean 对象的扩展点,提供的接口方法可以用于处理 Bean 对象实例化前后进行处理操作。而有时候需要做一些差异化的控制,所以还需要继承 BeanPostProcessor 接口,定义新的接口 InstantiationAwareBeanPostProcessor 这样就可以区分出不同扩展点的操作了。 像是接口用 instanceof 判断,注解用 Field.getAnnotation(Value.class); 获取,都是相当于在类上做的一些标识性信息,便于可以用一些方法找到这些功能点,以便进行处理。所以在我们日常开发设计的组件中,也可以运用上这些特点。 当你思考把你的实现融入到一个已经细分好的 Bean 生命周期中,你会发现它的设计是如此的好,可以让你在任何初始化的时间点上,任何面上,都能做你需要的扩展或者改变,这也是我们做程序设计时追求的灵活性。 七、系列推荐 调研字节码插桩技术,用于系统监控设计和实现 工作两三年了,整不明白架构图都画啥? Thread.start() ,它是怎么让线程启动的呢? 基于jdbc实现一个Demo版的Mybatis 一个Bug,让我发现了 Java 界的.AJ(锥)! - END - 下方扫码关注 bugstack虫洞栈,与小傅哥一起学习成长、共同进步,做一个码场最贵Coder! 回复【设计模式】,获取《重学Java设计模式》,这是一本互联网真实案例的实践书籍,从实际业务中抽离出,交易、营销、秒杀、中间件、源码等众多场景进行学习代码设计。 回复【面经手册】,获取《面经手册•拿大厂Offer》,这是一本有深度的Java核心内容,从数据结构、算法、并发编程以及JVM系8不断深入讲解,让懂了就是真的懂。 你好,我是小傅哥。一线互联网 java 工程师、架构师,开发过交易&营销、写过运营&活动、设计过中间件也倒腾过中继器、IO板卡。不只是写Java语言,也搞过C#、PHP,是一个技术活跃的折腾者。 2020年写了一本PDF 《重学Java设计模式》 ,全网下载量50万+,帮助很多同学成长,现已出书。同年 github 的两个项目, CodeGuide 、 itstack-demo-design ,持续霸榜 Trending,成为全球热门项目。 2021年上架一本小册 《SpringBoot 中间件设计和开发》 ,16个互联网中间件场景、30个工程,是全网唯一一次手把手教你造轮子、写中间件,因为这样的技术离P7最近、离架构师最近、离高薪资最近! 本文分享自微信公众号 - bugstack虫洞栈(bugstack)。如有侵权,请联系 support@oschina.cn 删除。本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

优秀的个人博客,低调大师

软硬件两手抓!解读H3C关键业务的高可用高可靠性

在云计算、大数据、物联网和移动互联网时代,企业对IT系统的依赖性越来越高。如何建设一套高可用性和高可靠性的IT系统,确保企业各项业务稳健高效运行,成为摆在企业面前的最大难题,特别是对于互联网支付、证券交易等核心关键业务来讲,系统一旦出现问题,就会造成无法弥补的损失。 对于关键业务来讲,企业的IT系统正在面临着以下挑战: 1)我们正在部署新应用,需要更高的可靠性; 2)我们的业务交易量和数量快速膨胀,对关键业务应对系统可用性的要求越来越高; 3)我们的系统有可能遭遇到不同类型的故障,对IT服务级别(SLA)要求越来越高; 4)我们对需要停机进行的系统维护很不满意。 解决IT系统的高可用性和高可靠性,靠无休止的增加硬件软件的传统容灾方案不但会大幅提高企业的成本支出,而且还会使系统变得越来越臃肿,即加大了系统的运维管理难度,又进一步提高了系统的风险,显然不是最佳的解决方案。那么,如何实现IT系统高可用高可靠性的难题呢?实际上,H3C Superdome X关键业务服务器就提供了完美的解决方案。 H3C Superdome X关键业务服务器从解决方案可靠性、系统可靠性、服务器可靠性和部件可靠性四个维度,为企业提供了完整的可靠性保障。不但解决了服务器、存储等硬件基础设备的可靠性问题,而且还通过操作系统的错误分析识别、在线优化和修复等软件层面进行了优化。打包的可靠性解决方案为用户提供了高达100%的应用可用性,确保了企业关键业务的连续性。 硬件方面,为了保证设备的高可用性,H3C Superdome X关键业务服务器提供了业界独有的冗余系统时钟技术。上图可以看到,这项技术是首次引入关键业务X86系统中,支持动态自动故障转移和热插拔等。这项技术的应用,不但能够在系统出现故障后实现瞬时转移,而且能够保证技术人员在不停机的情况下实现对出现故障的硬件进行及时处理修复,确保了系统不停机,业务不断线。 系统方面,H3C Superdome X关键业务服务器提供了深入分析与自我修复功能,当系统出现故障后,会自动检测错误,收集证据并实现自我的修复。这样技术不但能够节省技术人员的运维难度,而且还能够实现快速修复。一些小的问题,在业务部门没有察觉的情况下即可以实现自我修复,完全不会影响到业务的正常进行。当然,在普通的X86系统中,由于没有这项功能,那么就需要技术人员手动进行修复,不但需要花费较长的时间,而且还会影响到前端业务的正常进行。 编辑点评:笔者认为,高可用性和高可靠性是衡量企业关键业务的最重要标准,也是最为关键的因素,与性能等诸如其它因素相比,高可用性高可靠性绝对排在首位。试想,正要进行交易的数据突然中断,将会给企业和用户带来重大的损失和影响。在H3C关键业务中,高可用性和高可靠性也放在首位,由此可见厂商对这一标准的重视程序。H3C Superdome X关键业务服务器提供的99.999%的高可用高可靠性解决方案,不但为企业节省了成本,而且降低了运维管理难度,为企业在激烈的市场竞争中奠定了扎实的基础。 本文作者:ZC 来源:51CTO

优秀的个人博客,低调大师

高颜值妹子写的一手好代码,还赢得了阿里硅谷游学大奖!

由阿里中间件与天池联合举办的『阿里中间件性能挑战赛』决赛答辩会于8月12日在著名学府清华大学举行。 本次大赛吸引到了来自413所知名高校的学生,以及众多来自业界的工程师,共计1946支队伍,近2500人。大赛为选手们开放了阿里电商业务中最具挑战的双十一实时交易真实场景,以及阿里中间件多项开源产品(JStorm/Tair/RocketMQ)。 大赛历时1个多月,选手们可以通过挑战充分展现自己的技术实力。第二赛季入围TOP10的队伍齐聚现场进行最后的巅峰对决。 ▼ TOP10选手风采墙 ▼ ▼答辩会现场 ▼ 精彩记录 ▼ 《阿里大中台战略揭秘》▼ 阿里中间件掌门人蒋江伟(小邪)分享 ▼ 《在阿里技术平台上创业钉钉》▼ 钉钉CTO朱鴻(一粟)分享 ▼ 大赛评委 - 阿里中间件资深技术专家沈询 ▼ ▼ 大赛评委 - 阿里中间件资深技术专家纪君祥 ▼ ▼ 大赛

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

用户登录
用户注册