您现在的位置是:主页 > news > 软件开发可以做网站么/seo技巧
软件开发可以做网站么/seo技巧
admin2025/4/26 11:23:14【news】
简介软件开发可以做网站么,seo技巧,免费咨询医生在线男科,东莞做网站多少钱每篇一句 知其然,知其所以然才应该是做学问的态度。在应用时可以忽略非常多的实现细节,但在做学问时要吹毛求疵而不要放过任何一个细节 前言 众所周知,Spring容器可以简单粗暴的把它理解为一个大大的Map,存储着容器所管理的所有的…
每篇一句
知其然,知其所以然才应该是做学问的态度。在应用时可以忽略非常多的实现细节,但在做学问时要吹毛求疵而不要放过任何一个细节
前言
众所周知,Spring容器
可以简单粗暴的把它理解为一个大大的Map
,存储着容器所管理的所有的单实例对象
。我们从使用getBean(String beanName)
方法,根据bean名称
就能获得容器内唯一的Bean实例就能“证明”到这一点。
可你是否曾想过:既然它是Map,那万一我们写的@Bean
的beanName
重名了怎么办呢?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
如下:
- xml的
<bean/>
标签方式,由id属性决定(若没指定则为全类名) @Component
模式注解方式(包含其所有派生注解如@Service
、@Configuration
等等)。指定了value值就是value值,否则是类名首字母小写
1.此种方式是最为常用,也是大批量注册Bean的首选方式
@Bean
方式。指定了value值就是它,否则就是方法名
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
有两个实现版本,DefaultBeanNameGenerator
和AnnotationBeanNameGenerator
。其中DefaultBeanNameGenerator
是给资源文件加载bean
时使用(BeanDefinitionReader
中使用);AnnotationBeanNameGenerator
是为了处理注解生成bean name
的情况。
DefaultBeanNameGenerator
它是用来处理xml资源文件的Bean name生成器