SSM框架实战详细教程(十六)Spring DI
Spring 是一个在设计层面上进行模块之间解耦合的框架。
DI和AOP是它为解耦合提供的两大主要功能。 DI(Inversion of Control)即依赖注入,它强调的是怎么找到接口所对应的实现类,怎么将实现类对象装配给这个接口类型的属性。 DI这一功能原本被称为IOC。 IOC(Inversion of Control)即控制反转,它强调的是如果A类要使用B类,那A类就有生成B类对象的控制权,但是现在这个控制权交给了Spring容器管理,所以就认为是控制权反转了,但是“反转”这个词不是很好理解,后来在编程大师Martin Fowler的建议下,将控制反转改称依赖注入。现在Spring官网已经舍弃IOC这种叫法,规范命名为DI了。 可以通过下图来理解DI和IOC所侧重的含义不同,以及实质上是一回事。 在我们之前的代码中StudentController中,调用StudentService接口的实体类对象,如下代码所示,只需要在Spring配置文件中指定扫描service包,Spring就会扫描到该包下拥有@Service注解的类,为其生成对象,放到容器中。在StudentController中用@Autowired注解使用StudentService类型对象时,就会去容器中通过byType方式找到该对象,使用属性注入的方式为 StudentService stuService赋值:
@Controller
public class StudentController {
@Autowired
StudentService stuService;
@Autowired
BanJiService bjService;
// 省略
}
public interface StudentService {
}
@Service
public class StudentServiceImpl implements StudentService {
}
applicationContext.xml:
<context:component-scan base-package="service" />
如果以上代码中,如StudentServiceImpl 没有实现StudentService 接口,或没有添加@Service注解,都会引发NoSuchBeanDefinitionException。 而如果StudentService 接口的实现类不止一个,则byType的方式便不适用,会报NoUniqueBeanDefinitionException。这时候要使用byName的方式指定实现类:
@Service("stu")
public class StudentServiceImpl implements StudentService {
}
@Controller
public class StudentController {
@Autowired
@Qualifier("stu")
StudentService stuService;
@Autowired
BanJiService bjService;
}
即如上代码所示,在@Service注解中定义名称,在调用处使用@Qualifier注解指定名称。
