问题描述
使用过滤器自定义扫描<context:component-scanbase-package="org.example">spring开发手册中这样写:3.12.4.自动检测组件的命名当一个组件在某个扫描过程中被自动检测到时,会根据那个扫描器的BeanNameGenerator策略生成它的bean名称。默认情况下,任何包含name值的Spring“典型”注解(@Component、@Repository、@Service和@Controller)会把那个名字提供给相关的bean定义。如果这个注解不包含name值或是其他检测到的组件(比如被自定义过滤器发现的),默认bean名称生成器会返回小写开头的非限定(non-qualified)类名。例如,如果发现了下面这两个组件,它们的名字会是'myMovieLister'和'movieFinderImpl':@Service("myMovieLister")publicclassSimpleMovieLister{//...}@RepositorypublicclassMovieFinderImplimplementsMovieFinder{//...}可是我的却是大写开头,请问这是为什么呢?
解决方案
解决方案二:
这么专业的话你看着不吃力?在Java中类名首字母肯定是大写,没有疑问的。在spring中,name的话很多是起到别名的作用<beanid="dmzbean"class="org.olat.commons.dispatcher.SessionDispatcher"><propertyname="chiefControllerCreator"><beanclass="org.olat.core.commons.chiefcontrollers.BaseChiefControllerCreator"><propertyname="contentControllerCreator"><beanclass="org.eyan.meeting.main.EyanContentControllerCreator"/></property></bean></property>
比如这里就可以看成是contentControllerCreator是org.eyan.meeting.main.EyanContentControllerCreator的别名,chiefControllerCreator是org.olat.core.commons.chiefcontrollers.BaseChiefControllerCreator的别名。在正式的项目里面很大部分都是利用的接口引用,在spring里这样写的话可以实现。我的理解是太书面的话很难理解透彻,自己多动手写一写,试一试,实在不理解的地方先学会用法,写点心得记下来怎么用的,可能隔段时间自己就能顿悟为什么这么写了。
解决方案三:
运行时spring自动建立的类的别名是小写开头,而不是你自己写的类代码吧???这如果小写开头不符合Java代码规范啊……
解决方案四:
我的意思是我配置spring环境的到bean名称是小写开头的类名,而不是他说的“默认bean名称生成器会返回小写开头的非限定(non-qualified)类名”。这是为什么?用注解写的:@Service
解决方案五:
终于明白了,如果连着两个大写的字母开头,则扫描进来的bean就是大写开头的;如果大写开头,后面跟小写,则扫描进来的是小写开头的原来如此。。。
解决方案六:
这也行。。。