这几天在用Struts1+Spring2.5+Hibernate3做课程设计,使用Spring的自动扫描和注解的方式管理bean和注入值;在Spring的配置文件中已经使用<context:component-scan base-package="com.jiangnan"/>打开了自动扫描机制,在service层接口的实现类里面也打上了@Service注解,可是在action中使用@Resource注解注入值,这个值确是null。按理来说使用<context:component-scan base-package="com.jiangnan"/>配置后就无需再配置<context:annotation-config />,因为<context:component-scan base-package="com.jiangnan"/>会打开注解;其次,在属性上打上@Service注解时可以不指定名称(也可以指定,如@Service(name="xxx")),不指定name属性,则name属性默认为类的简单名称,比如你要讲类UserServiceBean交由Spring管理,类上打的注解为@Service,效果与@Service(name="userServiceBean")一样;获取bean时使用@Resource注解,该注解默认按名称装配,搜索不到时按类型装配,到此,看不出什么原因导致注入失败。
然后我在@Resource注解中指定了name属性,结果还是获取不到注入的值;仔细查看配置文件、该导入的包,都没问题,奇了怪了。
接着我写了一个jUnit TestCase,在测试用例中用getBean("xxx")方法获取到了使用@Resource配置的bean;在action中使用ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(session.getServletContext()); ctx.getBean("xxx")也获取到了那个Bean,
说明Spring容器已经正常启动,那个serviceBean已经交由Spring管理了,<context:component-scan base-package="com.jiangnan"/>已经起作用了,问题应该出在@Resource注解上。
可是之前使用的@Resource注解看不出有什么问题啊,网上搜了一下,有提到说使用@Resource获取值时那个action需要交由Spring管理,在我的struts-config.xml里已经有了相应的配置<controller>
<set-property property="processorClass" value="org.springframework.web.struts.DelegatingRequestProcessor"/>
</controller>,那个action上也打上了@Controller注解,问题是获取那个注入值还是为空。
后来发现我的action继承的是MappingDispatchAction,在struts-config.xml中配置的action的path属性的值与action类中@Controller注解中的值不一致,我把他们改成一致,结果就可以获取到注入的值了。
那照这么说要使用Spring的依赖注入,Action就不能是MappingDispatchAction了。