Spring是j2ee领域比较出名的一个应用框架,其中包括AOP、IoC/DI、MVC等方面的应用,而且可以灵活的根据项目情况来是用它的一部分。在所有内容中,IoC/DI(反向控制,依赖注入)是比较好的一个东西。
注:什么是依赖注入?
面向对象的一个基础叫做基于/面向接口编程,即将接口与实现分离,对象之间的协作、依赖完全靠接口实现;
在传统的实现方式中,依赖被硬编码到代码中,如UserService依赖UserDAO,即UserService中需要创建UserDAO的事例;
DI(Depand injection)的引入即在编码阶段不比直接创建UserDAO的事例,紧紧需要声明UserService依赖IUserDAO的接口(当然UserDAO要实现这个接口),这样就彻底将实现、接口分离,而且将对象之间的依赖转换为对象与抽象接口之间的关联;
DI当然不会自己晓得对象之间的联系,所以需要一个配置文件来声明各个对象之间的联系,同时UserService需要提供一个setter(即,属性的set子句),DI容器会根据配置文件在运行时利用setter为对象创建所依赖的对象的事例,同时利用setter方法将被依赖对象事例赋予根对象。这里的情况是容器(或称框架,容器这个词更加通用些)首先创建UserSerivce的事例,然后依据配置文件,创建其所依赖的UserDAO的事例,然后调用UserService事例的setUserDAO方法(实际的C#代码为srv.UserDAO=objUserDAO;实际上这条语句所转化的msidl语言代码是srv.set_UserDAO(objUserDAO);)。
代码示例:
配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="userDAO" class="onest.dao.UserDAO" abstract="false" singleton="true" lazy-init="default" autowire="default" dependency-check="default"></bean>
</beans>
程序代码:
public interface IUserDAO
{
public UserData getById(int userId);
}
public class UserService
{
private IUserDAO userDao;
public UserDAO
{
set
{
userDao = value;
}
}
public UserData getById(int userId)
{
return userDao.getById(userId);
}
}
public class UserDAO:IUserDAO
{
public UserData getById(int userId)
{
.....
}
}
除了DI之外,声明式事务处理以及ServiceLocator、ServiceProxy更令人感兴趣。
一些心得不敢独享..
P.S.代码用了类似C#的语法,因为这是给C#开发人员的一个入门介绍。Springframework.net已经可以发布了,不过还没有深入研究:(