专业网站设计招聘信息新闻发布会方案

张小明 2026/1/13 10:00:57
专业网站设计招聘信息,新闻发布会方案,邢台网络问政,电影网站规划前言#xff1a; Spring主要功能创建对象#xff08;俗称IOC#xff09;#xff0c; Bean的生命周期流程图1、生成BeanDefinition spring启动会进行扫描执行如下方法 org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider#scanCandidateCo…前言Spring主要功能创建对象俗称IOCBean的生命周期流程图1、生成BeanDefinitionspring启动会进行扫描执行如下方法org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider#scanCandidateComponentsSpring的扫描流程图根据ResourcePatternResolver 获取指定路径下所有的.class文件【最终生成 Resource 对象】遍历 Resource 集合利用MetadataReaderFactory 解析 Resource 获取metadateReader对metadataReader 进行 excludeFilters和 includeFilters 若excludeFilters 匹配直接返回false若 includeFiletes 匹配还要判断是否有Conditional 如果有则需要判断Conditional 注解筛选是否筛选过不能筛选 直接false筛选通过后还要判断是否独立、【不是接口或抽象】、如果是抽象类上面是否添加Lookup注解 【三个条件缺一不可】最终将 ScannedGenericBeanDefinition 生成BeanDefinition 对象返回其中 Conditional 的注解的作用Conditional 是 Spring 4.0 引入的核心注解用于条件化地创建 Bean。它允许根据特定条件决定是否注册 Bean 到 Spring 容器中。除了自定义条件Spring 还提供了一些内置的条件注解这些注解都是 Conditional 的扩展使用起来更加方便ConditionalOnBean当容器中存在指定 Bean 时。ConditionalOnMissingBean当容器中不存在指定 Bean 时。ConditionalOnClass当类路径中存在指定类时。ConditionalOnMissingClass当类路径中不存在指定类时。ConditionalOnProperty当指定的属性有指定的值时。ConditionalOnResource当类路径中存在指定资源时。ConditionalOnWebApplication当是 Web 应用时。ConditionalOnNotWebApplication当不是 Web 应用时。ConditionalOnExpression当 SpEL 表达式为 true 时。Conditional 注解 demo案例StuService Bean的创建 要依赖于 StuServiceConditionComponent Conditional(StuServiceCondition.class)public class StuService{publicvoidtest(){System.out.println(stu test ...);}}import org.springframework.context.annotation.Condition;import org.springframework.context.annotation.ConditionContext;import org.springframework.core.type.AnnotatedTypeMetadata;public class StuServiceCondition implements Condition{Override public booleanmatches(ConditionContext context,AnnotatedTypeMetadata metadata){// 检查某个属性是否存在returncontext.getEnvironment().containsProperty(stu.service.enabled);}}这时获取bean 为stuService 找不到异常。Exception in thread “main” org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named ‘stuService’ available…MetadataReader metadataReader getMetadataReaderFactory().getMetadataReader(resource);创建MetadataReader 注意点org.springframework.core.type.classreading.CachingMetadataReaderFactory#getMetadataReaderCachingMetadataReaderFactory解析某个.class文件得到 MetadataReader对象利用的是ASM技术并没有加载这个类到JVM。最终得到的ScannedGenericBeanDefinition对象beanClass属性存储当前的类的名称而不是class对象。2、合并BeanDefinition在通过BeanDefinition之后就可以根据BeanDefinition创建Bean对象。在spring中支持父子BeanDefinition和Java中继承相似比如spring.xmlbean idparentclasscom.dx.service.Parentscopeprototype/bean idchildclasscom.dx.service.Child/测试AnnotationConfigApplicationContext applicationContextnewAnnotationConfigApplicationContext(AppConfig.class);XmlBeanDefinitionReader xmlBeanDefinitionReadernewXmlBeanDefinitionReader(applicationContext);xmlBeanDefinitionReader.loadBeanDefinitions(spring.xml);System.out.println(applicationContext.getBean(child));System.out.println(applicationContext.getBean(child));System.out.println(applicationContext.getBean(child));测试结果com.dx.service.Childef9296dcom.dx.service.Childef9296dcom.dx.service.Childef9296d如果将xml修改为bean idparentclasscom.dx.service.Parentscopeprototype/bean idchildclasscom.dx.service.Childparentparent/测试的结果是com.dx.service.Childef9296dcom.dx.service.Child36c88a32com.dx.service.Child7880cdf3child可以继承parent的 scope子如果有scope 则使用自己的子没有scope继承父类scope父类若没有scope有parent的属性同样的继承逻辑源码的大概如下根据beanName判断是否合并过合并过直接退出判断当前的bean是否有父类如果没有设置 当前bean为RootBeanDefinition如果有循环获取 bean的父bean覆盖父定义属性子覆盖父protected RootBeanDefinitiongetMergedBeanDefinition(String beanName,BeanDefinition bd,Nullable BeanDefinition containingBd)throws BeanDefinitionStoreException{synchronized(this.mergedBeanDefinitions){// 1. 检查是否已经合并过RootBeanDefinition mbdthis.mergedBeanDefinitions.get(beanName);if(mbdnull){// 2. 如果没有父定义直接转换为RootBeanDefinitionif(bd.getParentName()null){mbdnewRootBeanDefinition(bd);}else{// 3. 递归合并父定义BeanDefinition pbd;try{String parentBeanNametransformedBeanName(bd.getParentName());pbdgetMergedBeanDefinition(parentBeanName);}// ...// 4. 深度拷贝父定义mbdnewRootBeanDefinition(pbd);// 5. 覆盖父定义属性子覆盖父mbd.overrideFrom(bd);}// 6. 缓存合并结果this.mergedBeanDefinitions.put(beanName,mbd);}returnmbd;}}3、加载类BeanDefinition合并之后就可以创建Bean的对象执行的方法是org.springframework.beans.factory.support.AbstractBeanFactory#resolveBeanClass创建bean就必须实例化对象实例化要先加载类所对应classClass?resolvedClassresolveBeanClass(mbd,beanName);方法的主要实现是// 如果是beanClass就直接返回if(mbd.hasBeanClass()){returnmbd.getBeanClass();}// 如果beanClass没有被加载会根据doResolveBeanClassif(System.getSecurityManager()!null){returnAccessController.doPrivileged((PrivilegedExceptionActionClass?)()-doResolveBeanClass(mbd,typesToMatch),getAccessControlContext());}else{returndoResolveBeanClass(mbd,typesToMatch);}如果beanClass 属性的类型是Class 直接返回不是则根据类名加载(doResolveBeanClass(mbd, typesToMatch))会利用BeanFactory所设置的类加载器加载类如果没有设置则默认使用ClassUtils.getDefaultClassLoader()类加载ClassUtils.getDefaultClassLoader()类加载方法优先获取当前线程的类加载器当前线程类加载为空返回ClassUtils.class.getClassLoader()如果ClassUtils.class.getClassLoader() 也为空则ClassLoader.getSystemClassLoader()4、实例化前BeanDefinition 对应的类加载成功后实例化对象前 Spring提供一个扩展点允许某个对象、某些对象实例化前做些额外的工作org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiationimport com.zhouyu.service.StuService;import org.springframework.beans.BeansException;import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor;import org.springframework.stereotype.Component;Component public class DxBeanPostProcessor implements InstantiationAwareBeanPostProcessor{Override public ObjectpostProcessBeforeInstantiation(Class?beanClass,String beanName)throws BeansException{if(stuService.equals(beanName)){System.out.println(加载 stuService 初始化之前);// Spring将直接使用这个对象returnnewStuService();}// 返回null则走正常流程returnnull;}}InstantiationAwareBeanPostProcessor 的postProcessBeforeInstantiation 除了常见的创建代理对象外还有以下重要作用1完全绕过spring的生命周期Override public ObjectpostProcessBeforeInstantiation(Class?beanClass,String beanName){// 如果返回非null对象Spring将// 1. 跳过默认构造函数调用// 2. 跳过后置处理器链的后续处理// 3. 跳过属性注入if(beanName.equals(specialBean)){returnnewSpecialBean();// Spring将直接使用这个对象}returnnull;// 返回null则走正常流程}2、根据条件Bean创建Override public ObjectpostProcessBeforeInstantiation(Class?beanClass,String beanName){// 根据条件决定是否创建Beanif(shouldSkipCreation(beanClass,beanName)){returnnewNoOpBean();// 返回一个占位对象}// 根据环境变量/配置决定实现类if(beanClass.isAssignableFrom(Service.class)){returnisProduction()?newProductionService():newMockService();}returnnull;}3、对象池/缓存管理Override public ObjectpostProcessBeforeInstantiation(Class?beanClass,String beanName){if(beanClass.isAnnotationPresent(Poolable.class)){// 从对象池获取实例而不是新建Object pooledInstanceobjectPool.acquire(beanClass);if(pooledInstance!null){returnpooledInstance;// 返回池中对象}}returnnull;}4、性能优化场景Override public ObjectpostProcessBeforeInstantiation(Class?beanClass,String beanName){// 对于频繁创建的原型Bean使用对象复用策略if(isHighFrequencyPrototype(beanClass)){returnprototypeReuseStrategy.createOrReuse(beanClass);}// 对于已知的无状态Bean直接返回共享实例if(isStateless(beanClass)){returngetSharedInstance(beanClass);}returnnull;}postProcessBeforeInstantiation 使用注意点1、跳过正常的生命周期 返回null 会跳过postProcessAfterInstantiation属性注入 (populateBean)初始化回调 (afterPropertiesSet, init-method)postProcessBeforeInitializationpostProcessAfterInitialization2、需要手动处理依赖Override public ObjectpostProcessBeforeInstantiation(Class?beanClass,String beanName){MyBean beannewMyBean();// 需要手动注入依赖bean.setDependency(manualLookup());// 手动调用初始化bean.init();returnbean;}3、与 AOP 的协调如果在此创建代理需要确保与其他 AOP 配置协调一致5、实例化会根据 BeanDefinition 创建一个对象。5.1 Supplier创建对象判断Beandefinition 中是否设置Supplier如果设置了 则调用Supplier的get() 设置 SupplierAnnotationConfigApplicationContext applicationContextnewAnnotationConfigApplicationContext(AppConfig.class);GenericBeanDefinition beanDefinitionnewGenericBeanDefinition();beanDefinition.setBeanClass(Person.class);// 设置 supplierbeanDefinition.setInstanceSupplier(new SupplierObject(){Override public Objectget(){// 这里可以编写创建逻辑Person personnewPerson();person.setAge(18);person.setName(张三);returnperson;}});// 注册beanapplicationContext.registerBeanDefinition(person,beanDefinition);System.out.println(applicationContext.getBean(person));执行结果Person{age18,name张三}Supplier 基础概念和作用1Supplier 是什么是 Java 8 引入的函数式接口表示一个结果的提供者FunctionalInterface public interface SupplierT{/** * Gets a result. * * return a result */Tget();}1.2 在Spring中作用1.延迟实例化将 Bean 的创建逻辑封装起来按需调用2.灵活性允许运行时动态决定如何创建 Bean3.与 BeanDefinition 解耦将创建逻辑从 BeanDefinition 中分离2、工厂方法创建对象如果没有设置Supplier检查是否BeanDefinition中是否设置 factory-methodsprin.xmlbean idstuServiceclasscom.zhouyu.service.StuServicefactory-methodcreateStuServiceFactory/public class StuService{publicstaticStuServicecreateStuServiceFactory(){System.out.println(this StuService createFactory);returnnewStuService();}publicvoidtest(){System.out.println(stu test ...);}}AnnotationConfigApplicationContext applicationContextnewAnnotationConfigApplicationContext(AppConfig.class);newXmlBeanDefinitionReader(applicationContext).loadBeanDefinitions(spring.xml);System.out.println(applicationContext.getBean(stuService));3、推断方法 Lookup注解import org.springframework.stereotype.Component;Component public class StuService{publicvoidtest(){System.out.println(stu test ...);}}创建一个Spring容器 AnnotationConfigApplicationContext applicationContextnewAnnotationConfigApplicationContext(AppConfig.class);StuService stuService(StuService)applicationContext.getBean(stuService);stuService.test();执行结果stu test …测试Conditional注解import org.springframework.context.annotation.Conditional;import org.springframework.stereotype.Component;Component Conditional(StuServiceCondition.class)public class StuService{publicvoidtest(){System.out.println(stu test ...);}}import org.springframework.context.annotation.Condition;import org.springframework.context.annotation.ConditionContext;import org.springframework.core.type.AnnotatedTypeMetadata;public class StuServiceCondition implements Condition{Override public booleanmatches(ConditionContext context,AnnotatedTypeMetadata metadata){// 检查某个属性是否存在returncontext.getEnvironment().containsProperty(stu.service.enabled);}}执行结果报Exception in thread “main” org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named ‘stuService’ available…6、BeanDefinition的后置处理器比如Spring中使用Component public class AutowiredAnnotationBeanPostProcessor implements SmartInstantiationAwareBeanPostProcessor,MergedBeanDefinitionPostProcessor,PriorityOrdered,BeanFactoryAware{Override publicvoidpostProcessMergedBeanDefinition(RootBeanDefinition beanDefinition,Class?beanType,String beanName){System.out.println( AutowiredAnnotationBeanPostProcessor postProcessMergedBeanDefinition method );}}7、实例化后postProcessAfterInstantiation 作用在Bean的实例化后、属性注入前执行可以返回false阻止Spring对该Bean进行属性注入适合用于自定义初始化逻辑或条件判断典型应用场景动态控制属性注入实现延迟注入属性值验证和转换特殊Bean的预处理属性填充案例Component public class DxInstanceAwareBeanPostProcessor implements InstantiationAwareBeanPostProcessor{Override public booleanpostProcessAfterInstantiation(Object bean,String beanName)throws BeansException{if(stuService.equals(beanName)){PerSon perSonnewPerSon();perSon.setAge(12);perSon.setName(张三);System.out.println(perSon);}returntrue;}}8、自动注入9、处理属性InstantiationAwareBeanPostProcessor.postProcessProperties() 是Spring框架中一个非常重要的扩展点它在Bean的生命周期中扮演着关键角色。主要作用包括1.处理注解驱动的依赖注入例如Autowired、Value、Inject、Resource等注解的解析和注入。2.属性值的后处理可以对属性值进行转换、验证、加密/解密等操作。3.动态添加属性根据某些条件动态添加属性。4.跳过某些属性的注入通过返回null或修改PropertyValues来控制哪些属性需要注入。比如Spring内置实现AutowiredAnnotationBeanPostProcessor// 主要职责处理 Autowired、Value、Inject 注解public class AutowiredAnnotationBeanPostProcessor{Override public PropertyValuespostProcessProperties(PropertyValues pvs,Object bean,String beanName){// 1. 获取或构建注入元数据InjectionMetadata metadatafindAutowiringMetadata(beanName,bean.getClass(),pvs);try{// 2. 执行实际的注入操作metadata.inject(bean,beanName,pvs);}catch(Throwable ex){throw newBeanCreationException(beanName,Injection failed,ex);}// 3. 返回可能被修改的 PropertyValuesreturnpvs;}privatevoidinject(Object bean,Nullable String beanName,Nullable PropertyValues pvs){// 字段注入for(AutowiredFieldElement field:this.autowiredFields){field.inject(bean,beanName,pvs);}// 方法注入for(AutowiredMethodElement method:this.autowiredMethods){method.inject(bean,beanName,pvs);}}}注解解析处理各种依赖注入注解属性处理修改、添加、删除属性值值转换类型转换、占位符解析、SpEL计算条件控制根据条件决定是否注入某些属性验证检查属性值验证和约束检查10、执行Aware1.获取Bean在容器中的名称通过实现BeanNameAware接口Bean可以知道自己在容器中配置的名称。2.获取BeanFactory通过实现BeanFactoryAware接口Bean可以获取到BeanFactory从而可以手动获取其他Bean或者进行一些高级操作。3.获取ApplicationContext通过实现ApplicationContextAware接口Bean可以获取到ApplicationContext从而可以访问容器上下文例如获取其他Bean、发布事件、访问环境变量等。4.获取环境配置通过实现EnvironmentAware接口Bean可以获取到Environment对象从而可以访问配置属性、profiles等。5.资源加载通过实现ResourceLoaderAware接口Bean可以获取到ResourceLoader从而可以加载类路径或文件系统中的资源。6.国际化通过实现MessageSourceAware接口Bean可以获取到MessageSource从而可以进行国际化消息的解析。7.应用事件发布通过实现ApplicationEventPublisherAware接口Bean可以获取到ApplicationEventPublisher从而可以发布应用事件。8.嵌入式值解析通过实现EmbeddedValueResolverAware接口Bean可以获取到StringValueResolver从而可以解析嵌入式值例如SpEL表达式。使用 Aware 的场景清单import org.springframework.beans.factory.BeanClassLoaderAware;import org.springframework.beans.factory.BeanNameAware;import org.springframework.stereotype.Component;Component public class BeanIdentityService implements BeanNameAware,BeanClassLoaderAware{private String beanName;private ClassLoader classLoader;Override publicvoidsetBeanClassLoader(ClassLoader classLoader){this.classLoaderclassLoader;System.out.println(current classLoader :classLoader);}Override publicvoidsetBeanName(String name){// 场景日志记录、监控、动态配置this.beanNamebeanName;System.out.println(current bean name :beanName);}}11、初始化前BeanPostProcessor.postProcessBeforeInitialization()import org.springframework.beans.BeansException;import org.springframework.beans.factory.config.BeanPostProcessor;import org.springframework.stereotype.Component;Component public class DxPostProcessor implements BeanPostProcessor{Override public ObjectpostProcessBeforeInitialization(Object bean,String beanName)throws BeansException{if(stuService.equals(beanName)){System.out.println(初始化之前);}returnbean;}}12、初始化// 1. PostConstruct 注解方法PostConstruct publicvoidinitMethod1(){// JSR-250 标准最先执行}// 2. InitializingBean 接口的 afterPropertiesSet 方法Override publicvoidafterPropertiesSet()throws Exception{// Spring 接口方式第二执行}// 3. XML/Bean 配置的 init-method// XML: bean iddemo classcom.xx.xx.Demo init-methodcustomInit/// Bean: Bean(initMethod customInit)publicvoidcustomInit(){// 自定义方法最后执行}13、初始化后这个是bean创建的生命周期最后一步。import org.springframework.beans.BeansException;import org.springframework.beans.factory.config.BeanPostProcessor;import org.springframework.stereotype.Component;Component public class DxPostProcessor implements BeanPostProcessor{Override public ObjectpostProcessAfterInitialization(Object bean,String beanName)throws BeansException{if(stuService.equals(beanName)){System.out.println(初始化之后);}returnbean;}}
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

怎么制作网站店铺抖音广告推广怎么做

DataGear实战指南:3步构建企业级数据看板 【免费下载链接】datagear DataGear数据可视化分析平台,自由制作任何您想要的数据看板 项目地址: https://gitcode.com/datageartech/datagear 在数据驱动决策的时代,技术团队如何快速搭建既能…

张小明 2026/1/10 12:07:59 网站建设

网站的优化公司移动网站视频主持人网

如何快速掌握Android DatePicker:新手完整使用指南 【免费下载链接】DatePicker Useful and powerful date picker for android 项目地址: https://gitcode.com/gh_mirrors/da/DatePicker DatePicker是一个功能强大且易用的Android日期选择器库,为…

张小明 2026/1/10 12:07:57 网站建设

高端的的网站建设公司中国优秀作文网

利用云GPU跑DDColor:低成本高效率完成百张老照片修复 在家庭相册的角落里,泛黄的老照片静静诉说着过去的故事。可当想把祖辈的黑白影像分享给年轻一代时,却发现手工上色耗时费力、AI工具又难以上手——这几乎是每个家庭数字化记忆时都会遇到的…

张小明 2026/1/9 16:58:33 网站建设

外包网络推广公司推广网站专业模板网站制作

PyTorch-CUDA-v2.7镜像兼容性解析:从技术原理到显卡支持全景 在深度学习项目中,最让人头疼的往往不是模型设计,而是环境配置——“在我机器上能跑”的尴尬场景屡见不鲜。尤其当团队协作、跨平台部署时,PyTorch 版本、CUDA 工具链、…

张小明 2026/1/9 22:43:52 网站建设

有没有做3d衣服模型网站邢台贴吧最新消息

在人工智能技术飞速发展的今天,人脸识别已成为安防、支付、社交等领域的核心技术。Python凭借其丰富的生态库和简洁的语法,成为开发者实现人脸识别的首选语言。本文将从技术原理、核心算法、实战案例三个维度,系统解析Python实现人脸识别的完…

张小明 2026/1/10 12:08:01 网站建设

storyset自定义插画网站wordpress 播放大视频播放

I2S 与 TDM 到底怎么选?一文讲透音频接口的底层逻辑你有没有遇到过这样的问题:做一个6麦克风阵列,发现主控只有1个I2S接口,根本不够用?想给汽车音响加几个扬声器,结果板子上密密麻麻全是音频线,…

张小明 2026/1/10 12:08:02 网站建设