日期:2014-05-17  浏览次数:20655 次

关于SSH框架的Spring3和struts2的问题!
<bean id="loginServiceImpl" class="serviceimpl.LoginServiceImpl"></bean>
<bean id="loginAction" class="action.LoginAction">
<property name="loginServiceImpl" ref="loginServiceImpl"></property>
</bean>

这里在给action注入的时候,为什么property name="loginServiceImpl"和 ref="loginServiceImpl"这两者要相同!还是struts的Action不需要Spring来注入的,直接通过Struts.xml里面的拦截器来实现?
因为你这里把property name="loginServiceImpl"和ref="loginServiceImpl"改成不一样的话,就会报空指针错误。
  这里面的机理到底怎么样,求大神解答谢谢!
Spring SSH Struts 框架

------解决方案--------------------
loginServiceImpl是上面定义的一个bean的id。

id,就是唯一区别不同bean的,Spring启动后,会创建一个个定义的类实体对象,用id作为索引保存在ApplicationContex中(容器),其它bean如果想用这样的对象,就把这个索引传过去即可。

如果id写一个不存在的类型,那容器中当然找不到这个bean实体,自然而然就“空指针”啦!
------解决方案--------------------
这里的property是指action里面的成员变量,你在action里面需要创建的类serviceimpl.LoginServiceImpl的名字是loginServiceImpl,而后面的ref指的是前面创建的这个类bean的id。原理的话推荐一本书<<SPRING技术内幕——深入解析SPRING架构与设计原理>>,求大家指正
------解决方案--------------------


property name="loginServiceImpl"和ref="loginServiceImpl

不需要相同,只要你对应名字就可以了...前者是你注入的类里面的那个set方法的名字,后者是你声明bean的名字...简单的说就是把通过xml配置把声明的指向注入通过你的set方法,当然还有的情况是比较特别的,就是你使用注解的时候,如果默认不使用别名的话,就是默认规则,类名的首字母变小写,例如UserDao...他的默认bean名就是userDao..你注入的时候就setUserDao,在这个方法上加入@Resource这样能匹配,或者是@Resource(name = "userDao")这样是强制指定对应bean名
------解决方案--------------------
<property name="loginServiceImpl" ref="loginServiceImpl"></property> 这里的两个loginServiceImpl是可以不一样的,如果你前一个loginServiceImpl不是叫这个,那么你在action中定义时也不能叫这个,action中的ref="xxx"必须保证xxx与这里的<property nam="xxx" ..../>保持一致,同理,如果你后一个loginServiceImpl不是叫这个,那么你在dao声明时也不能叫这个,LZ慢慢尝试吧,你会懂的
------解决方案--------------------
// id是唯一标识你这个bean的,自己想怎么改都行,只要符合语法规定就行
<bean id="loginServiceImpl" class="serviceimpl.LoginServiceImpl"></bean>
 <bean id="loginAction" class="action.LoginAction">