您现在的位置是:主页 > news > 软件开发可以做网站么/seo技巧

软件开发可以做网站么/seo技巧

admin2025/4/26 11:23:14news

简介软件开发可以做网站么,seo技巧,免费咨询医生在线男科,东莞做网站多少钱每篇一句 知其然,知其所以然才应该是做学问的态度。在应用时可以忽略非常多的实现细节,但在做学问时要吹毛求疵而不要放过任何一个细节 前言 众所周知,Spring容器可以简单粗暴的把它理解为一个大大的Map,存储着容器所管理的所有的…

软件开发可以做网站么,seo技巧,免费咨询医生在线男科,东莞做网站多少钱每篇一句 知其然,知其所以然才应该是做学问的态度。在应用时可以忽略非常多的实现细节,但在做学问时要吹毛求疵而不要放过任何一个细节 前言 众所周知,Spring容器可以简单粗暴的把它理解为一个大大的Map,存储着容器所管理的所有的…

每篇一句

知其然,知其所以然才应该是做学问的态度。在应用时可以忽略非常多的实现细节,但在做学问时要吹毛求疵而不要放过任何一个细节

前言

众所周知,Spring容器可以简单粗暴的把它理解为一个大大的Map,存储着容器所管理的所有的单实例对象。我们从使用getBean(String beanName)方法,根据bean名称就能获得容器内唯一的Bean实例就能“证明”到这一点。

可你是否曾想过:既然它是Map,那万一我们写的@BeanbeanName重名了怎么办呢?Spring框架是怎么来处理这个事的呢?

Spring容器通俗描述

我们把它理解成一个Map,那Map里面的key-value你应该知道:

  • key:beanName
  • value:单例bean对象

其实为了辅助理解,从SingletonBeanRegistry注册Bean的方法中也可以看出:

public interface SingletonBeanRegistry {...// ===注意它没有remove方法====void registerSingleton(String beanName, Object singletonObject);Object getSingleton(String beanName);boolean containsSingleton(String beanName);int getSingletonCount();...
}

同样的bean定义信息的注册器BeanDefinitionRegistry也能类比的看到:

public interface BeanDefinitionRegistry extends AliasRegistry {...void registerBeanDefinition(String beanName, BeanDefinition beanDefinition) throws BeanDefinitionStoreException;// 请注意:SingletonBeanRegistry 可没有移除方法~void removeBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;boolean containsBeanDefinition(String beanName);int getBeanDefinitionCount();...
}

在我们现在的Spring应用中,动不动容器就需要管理上千个Bean(更有甚者在过去的one in all应用中可能出现上万个Bean的情况)。
既然Spring容器是个Map,那key的重要性不言而喻,他指向着全局唯一的Bean实例,若key被覆盖了,就相当于Map的key被覆盖一样,旧的value值可能将永远就触达不到了~

从而可见,确保beanName的唯一性意义重大。但是呢管理的Bean多了,怎么去确保这件事肯定就成了一个难题,那么接下来就了解一下Spring它是怎么造的~

beanName的生成规则

我把beanName的生成规则放在最开始描述,是因为我觉得既然涉及到beanName,那么首先就应该知道beanName是怎么来的。

我们知道,Spring提供了非常非常多的方式允许我们向容器内注册一个Bean,下面总结出常用的注册Bean方式对应的BeanName如下:

  1. xml的<bean/>标签方式,由id属性决定(若没指定则为全类名)
  2. @Component模式注解方式(包含其所有派生注解如@Service@Configuration等等)。指定了value值就是value值,否则是类名首字母小写
    1. 此种方式是最为常用,也是大批量注册Bean的首选方式
  3. @Bean方式。指定了value值就是它,否则就是方法名
  4. FactoryBean方式。(它其实需要结合上面任意一种方式使用,beanName请参考如上描述)

这是一个基本的结论。其实大多数时候我们自己都并不会去指定beanName,若没有自己没有指定的话,它怎么来的呢?Spring对它的生成有什么规律可循呢?那么接下来就就研究下这个策略:名称生成策略

BeanNameGenerator

为bean定义生成bean名称的策略接口

BeanNameGenerator接口位于 org.springframework.beans.factory.support 包下面,只声明了一个方法,接受两个参数:definition 被生成名字的BeanDefinition实例;registry 生成名字后注册进的BeanDefinitionRegistry

// @since 2.0.3  是2.0后出来的
public interface BeanNameGenerator {// 入参竟然有两个  definition和bean定义注册器String generateBeanName(BeanDefinition definition, BeanDefinitionRegistry registry);
}

看看它的继承树:
在这里插入图片描述
BeanNameGenerator有两个实现版本,DefaultBeanNameGeneratorAnnotationBeanNameGenerator。其中DefaultBeanNameGenerator是给资源文件加载bean时使用(BeanDefinitionReader中使用);AnnotationBeanNameGenerator是为了处理注解生成bean name的情况。

DefaultBeanNameGenerator

它是用来处理xml资源文件的Bean name生成器