一般的java程序中,如果某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用这个类实例的方法,这种方法存在的问题是new的类实例不好统一管理。spring对此提出了依赖注入的思想,即依赖类不由程序员实例化,而是通过spring容器帮我们new指定实例并且将实例注入到需要该对象的类中。依赖注入DI(Dependency Injection)又称作控制翻转IOC(Inversion Of Control),通俗的理解是:平常我们new一个实例,这个实例的控制权是我们,而控制反转是指new实例工作不由我们来做而是交给spring容器来做。

虽然有很多种依赖注入的方式,下面只说一下最简单的一种依赖注入的方式,这里最主要的是了解依赖注入的这种思想。

看一下代码:LoginAction类中需要使用LoginService类中的方法,可以在LoginAction类中private声明LoginService类的对象,这里不是new的,而一般情况下想要使用其他类的方法,需要先new这个类的对象,LoginAction类的set方法就是IOC的入口,spring容器帮我们创建LoginService类的对象再通过set方法注入到当前类中

  1. public class LoginAction extends ActionSupport {
  2. private LoginService loginService;
  3. public LoginService getLoginService() {
  4. return loginService;
  5. }
  6. public void setLoginService(LoginService loginService) { //IOC的入口
  7. this.loginService = loginService;
  8. }
  9. public String execute() throws Exception {
  10. Boolean b = loginService.isLogin();
  11. if (b) {
  12. return SUCCESS;
  13. } else {
  14. return ERROR;
  15. }
  16. }
  17. }

看一下配置文件: bean 中的name属性(即loginAction)是class属性的一个别名,class属性指类的全名。在LoginAction类中有一个公共属性loginService,因此下面配置property,name=”loginService”, 这个name对应了与LoginAction类中set方法setLoginService的一致。而ref指下面<bean id=”loginService” …>,这样其实就是spring将LoginServiceImpl对象实例化并且调用LoginAction的setLoginService方法将loginService注入:

  1. <!--配置bean,配置后该类由spring管理-->
  2. <bean id="loginAction" class="com.iip.actions.LoginAction" scope="prototype">
  3. <property name="loginService" ref="loginService"></property>
  4. </bean>
  5. <!-- 业务逻辑层 -->
  6. <bean id="loginService" class="com.service.LoginServiceImpl></bean>

另外: spring 默认scope 是单例模式,这样只会创建一个Action对象,每次访问都是同一个Action对象,数据不安全,scope=”prototype” 可以保证 当有请求的时候 都创建一个Action对象