Spring实战这本书真的是零零碎碎,东一笔西一笔的。
或者说就是高手写作的通病,有的东西对于刚入门的人来说根本不知道怎么操作,但在高手眼里都是刚写项目就全部写好的东西,提都不提或者前面提了一下然后即使也是后面操作的必要前提也提都不提。
第二章第二节提到了自动化装配Bean,说到要在java-config文件中使用@ComponentScan注解,才告知了项目开启了注解扫描。。
可问题是你这个java-config文件如何让项目知道啊???ApplicationContext context = new AnnotationConfigApplicationContext(CDPlayerConfig.class);
这样子嘛?可这个创建在项目的哪个java文件呢??如果是web项目的话感觉放在ServletContext的监听器的出生方法里比较合适,那其它项目呢?
哎。。心累
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)的时候就去尝试。