上篇博客简单介绍了Spring的一些优点,现在来说一下Spring这些优点实现的基础:控制反转和依赖注入。
控制反转
IoC(Inversion of Control),我们可以把它理解为面向对象编程的一个名词概念。直白的说,就是:本来是你该控制的事,现在交由其他人控制,即权利或责任的反转。在编程中,常见的实例是,A对象需要依赖B对象(在A中new一个B),本该是A控制这个过程,现在交由系统处理,这种做法的优势是A与B的耦合性降低;如果这种依赖关系可以控制,也提高了程序的灵活性。
依赖注入
DI(Dependency Injection),控制反转是一个概念,如何什么手段实现?依赖注入是一个靠谱的方案,依赖注入的主要实现靠的是反射和面向接口编程,常见的如:
UserDao userDao=new userDao4Mysql();
依赖注入,就是把这个实例化的过程分为两步:- 第一步:UserDao userDao;
- 第二步:userDao=new userDao4Mysql();
XML
将使用到的userDao注入到UserManagerImpl中。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
<bean id="userDaoMysql" class="com.tgb.spring.dao.UserDao4MysqlImpl"/>
<bean id="userDaoOracle" class="com.tgb.spring.dao.UserDao4OracleImpl"/>
<bean id="userManager" class="com.tgb.spring.manager.UserManagerImpl">
<property name="userDao" ref="userDao4Mysql"/>
</bean>
</beans>
构造函数方式
public class UserManagerImpl implements UserManager {
private UserDao userDao;
public UserManagerImpl(UserDao userDao){
this.userDao=userDao;
}
}
Set方式
public class UserManagerImpl implements UserManager {
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
}
总结
如上所见,耦合性降低同时灵活性提升:
- 耦合性降低体现在UserManagerImpl不必再直接关联UserDao4MysqlImpl。
- 灵活体现在userDao4Mysql在配置文件中,可按需要修改,如替换为UserDao4OracleImpl。
以上说的是优点,那么缺点呢?
- 手写XML易产生拼写错误。
- 反射本身生成对象会有一些效率问题(一倍多于直接new)。
以上就是Spring的核心控制反转和依赖注入,下篇博客会说到Spring与Struts1的集成。