java,spring:如何让项目知道开启了注解扫描?

Spring实战这本书真的是零零碎碎,东一笔西一笔的。
或者说就是高手写作的通病,有的东西对于刚入门的人来说根本不知道怎么操作,但在高手眼里都是刚写项目就全部写好的东西,提都不提或者前面提了一下然后即使也是后面操作的必要前提也提都不提。

第二章第二节提到了自动化装配Bean,说到要在java-config文件中使用@ComponentScan注解,才告知了项目开启了注解扫描。。
可问题是你这个java-config文件如何让项目知道啊???
ApplicationContext context = new AnnotationConfigApplicationContext(CDPlayerConfig.class);
这样子嘛?可这个创建在项目的哪个java文件呢??如果是web项目的话感觉放在ServletContext的监听器的出生方法里比较合适,那其它项目呢?
哎。。心累

阅读 5.4k
3 个回答

ApplicationContext context = new ......(..)
对注解扫描自动装配也好还是显式配置也好,都是必须的。
因为即使是注解扫描也只是不需要你在配置文件中具体写@Bean方法以及其中可能有的注入,而由Spring扫描有@Component的类以及其中可能有的@Autowired后由Spring创建 对应对应该类的@Bean方法并实现可能有的注入 到配置文件中去。所以配置文件也是必须加载的。

然后就一个最普通最简单的JAVA程序来说,必然会有一个public static void main(String args[])方法才能运行起来。
应当在这个main方法中加载Spring上下文context,并且要用的引用变量的对象应当由上下文context的getBean方法来得到。只有这样得到的引用变量所指的对象(实例)才是会被自动装配好的(比如这个类中有@Autowired的成员变量,那么只有通过contex.getBean得到的实例里这个成员变量才会被已经注入了合适的Bean(成员变量所需要的类必须有@Component注解)。

在解决了这些问题之后,就不难理解在一个web应用程序中,为何向要向Servlet中无法自动注入成员变量(或者实现在Servlet中注入成员变量不应该在入门Spring时考虑)。因为整个web项目,你是看不到main方法的,servlet也不是被Spring的上下文的getBean()方法创建出来,而是经由Tomcat创建。这样创建出来的Servlet中你期望自动注入的成员变量自然而然为空。而如果要干涉Servlet的创建,就要插手Tomcat创建Servlet的过程并做出修改,这件事不应该在入门Spring(或者入门JavaEE)的时候就去尝试。

你可以参考一下文档的这部分

文档中创建 context 是在 main 方法。

在xml中有这样一行配置

<context:component-scan base-package="com.fuck.java.*"/>

如果是使用的Java配置方式就是在main方法所在类上的注解@ComponentScan

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题