前些天大概学习了一下Spring的IOC,感觉还是很方便的,没有那么多繁琐的配置文件,只需要一个配置文件就可以跑起来,用起来也十分方便,因为也是初学,所以也只是用了其中的很小一部分功能。
首先了解一下什么是IOC,IOC就是Inversion of Control,中文意思是控制反转,现在的程序为了有个清晰的结构还有将实现和接口分开,一般都会创建一些接口,利用IOC可以在实际调用中确定应该调用这个接口的哪个实现而不需要依赖于某个特定的实现。
举个简单的例子说明:比如,通常在开发J2EE项目中都需要有数据层,实现数据层的方法很多,比如Hibernate、直接使用JDBC、或者其他持久层的框架,同时或许这个项目开始使用Mysql数据库,后来要修改成使用oracle,如果用传统的方式,比如:
public class UserDAO
{
public void insert(String userName,String password)
{
//连接数据库
Connection conn = .....
//执行sql语句
......
//关闭连接....
........
}
}
public class UserService
{
public void addUser(String userName,String password)
{
UserDAO dao = new UserDAO();
//判断数据合法
.....
.....
dao.insert(userName,password);
//后续操作
}
}
public class UserAction
{
public static void main(String[] arg)
{
UserService service = new UserService();
service.addUser("CnXiaowei","hahahah");
}
}
各个数据库的语法都可能有不同,如果某天突然要求换数据库,有几种方式,一种是可以修改UserDAO,修改里面的sql语句和获取连接的方式等等,另外一种是可以重新做一个类,比如UserDAONew,里面重新写进各种方法,然后再修改调用这个类的所有地方。可以想象,如果整个项目的文件非常多,里面调用数据库操作的地方也非常多,修改起来有多麻烦。使用类似Hibernate的数据持久层框架也是一个好办法,虽然可以解决换数据库出现的问题,但如果某天因为某种原因项目不再用Hibernate,而是使用JDBC或者其他方式,这样的问题同样存在。因为这里没有体现针对接口编程的面向对象的方法。而如果使用IOC,我们不用关心到底是谁来实现这个操作,一旦数据库更换或者实现方式更换,所有调用这个接口的客户端都不需要做任何修改。
使用IOC以后的结构:
package test;
public interface UserDAO
{
public void insert(String userName,String password);
public void delete(String userName);
public void find(....)
//各种操作的接口
}
//JDBC实现
package test;
public class UserDAOJDBCImpl implemtents UserDAO
{
public void insert(String userName,String password)
{
//使用JDBC操作数据库插入数据
}
public void delete(String userName)
{
}
public void find(....)
//各种操作的具体实现
}
public interface UserService
{
public void addUser(String userName,String password);
....
}
//UserService的实现
package test;
public class UserServiceImpl implements UserService
{
private UserDAO userDAO;
public void setUserDAO(UserDAO userDAO)
{
this.userDAO = userDAO;
}
public void addUser()
{
//判断数据合法
.....
.....
userDAO.insert(userName,password);
//后续操作
}
}
//使用UserService的类
package test;
public class UserAction
{
public static void main(String[] arg)
{
ApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext.xml");
UserService service = (UserService)ctx.getBean("UserServiceBean");
service.addUser("CnXiaowei","hahaha");
}
}
配置文件
applicationContext.xml
<beans>
<description>Test of IOC</description>
<bean id="UserDAO" class="test.UserDAOJDBCImpl"/>
<bean id="UserService" class="test.UserServiceImpl">
<property name="userDAO"><ref local="UserDAO"/></property>
</bean>
</beans>
其中UserDAO和UserService都是一个标识,可以在程序中用ApplicationContext 的getBean方法通过这个名字找到实现这个接口的类,而在UserService里面的Property里面,是将UserDAO,也就是test.UserDAOJDBCImpl给“注入“到UserServiceImpl里的userDAO属性中去,因此在UserServiceImpl里面,属性userDAO的具体实现就是test.UserDAOJDBCImpl。
看上去用了IOC反而代码量增加了,但是想想看如果需要把原来JDBC操作数据库的方式修改成使用Hibernate,我们只需要增加一个实现UserDAO的类,比如:
//Hibernate实现
package test;
public class UserDAOHibernateImpl implemtents UserDAO
{
public void insert(String userName,String password)
{
//使用Hibernate操作数据库插入数据
}
public void delete(String userName)
{
}
public void find(....)
//各种操作的具体实现
}
然后将配置文件的<bean id="UserDAO" class="test.UserDAOJDBCImpl"/>修改成<bean id="UserDAO" class="test.UserDAOHibernateImpl"/>就可以了,完全不需要修改其他的代码,如果一个项目很大,类和接口都很多,使用IOC对于整个系统的维护和移植都是非常方便的。
现在我在做的一个项目的结构就是这样,DAO层目前采用的是JDBC方式,Service层也是定义的接口,单独有一个ServiceLocator负责管理Service层的具体实现。而目前的DAO和Service层的基本代码都是通过工具自动生成,效率大大的提高了,维护起来结构也非常清晰。
分享到:
相关推荐
这个"J2EE项目实训Spring框架技术"压缩包可能包含一系列关于如何在实际项目中运用Spring的教程或案例。 Spring框架的主要特点包括依赖注入(Dependency Injection,DI)、面向切面编程(Aspect-Oriented ...
Spring 是一个开源的 Java 应用框架,由 Rod Johnson 在其著作《Expert One-on-One J2EE Design and Development》中首次提出。它旨在简化企业级应用开发,通过依赖注入(Dependency Injection,DI)和面向切面编程...
在Java企业级开发中,J2EE(Java 2 Platform, Enterprise Edition)是一个重要的平台,它为构建分布式、多层的企业应用提供了全面的框架。这个压缩包“j2ee项目中所用到的包”包含了在J2EE项目中常用的框架和库,...
在Java企业级开发中,J2EE(Java 2 Platform, Enterprise Edition)是一个重要的平台,它为构建分布式、多层的Web应用程序提供了...通过实践这些概念,开发者能够更好地掌握Spring框架,并在实际项目中有效地应用它们。
通过这两个项目的源码分析,你将有机会了解Spring MVC的实际应用,以及如何在J2EE环境中利用Spring框架解决具体问题。这不仅有助于加深对Spring框架的理解,也能够提升你的项目开发能力。在实践中,你可以尝试调整...
在IT行业中,J2EE(Java 2 Platform, Enterprise Edition)是用于构建企业级应用程序的平台,它提供了服务器端的编程模型和环境。本实例源代码着重于一个经典的开发框架集成,即Struts2.0、Hibernate和Spring的组合...
在IT行业中,J2EE(Java 2 Platform, Enterprise Edition)是一个广泛使用的平台,用于构建企业级的分布式应用。它提供了各种服务、API和工具,用于开发、部署和管理复杂的企业软件。J2EE的核心组件包括JDBC(Java ...
Spring与Struts和Hibernate的整合是企业级开发中的常见实践,书中会阐述如何在Spring环境中配置Struts和Hibernate,以及如何利用Spring的IoC容器来管理应用的生命周期。 通过这本书,读者不仅可以学习到各个框架的...
这个名为"WebBlog"的项目是一个利用SSH技术实现的博客系统,它展示了如何将这三个强大的框架整合到一个完整的应用程序中。 1. **Struts**: - Struts是MVC(Model-View-Controller)设计模式的一种实现,主要负责...
压缩包内的"J2EE项目开发框架实例源代码"涵盖了以上技术的实际应用,开发者可以通过阅读源码学习到如何在实际项目中集成和使用这些框架。演示动画则进一步直观地展示了这些技术在运行时的工作原理,帮助开发者理解...
这个工程demo,是本人在企业应用中的项目缩影,绝对实用于企业的应用。 适合朋友: 1.一直用单独的servlet和jsp做J2EE,想使用框架做J2EE的朋友。尤其是对于那些想找工作又不会框架的朋友,会了这个后,你可以很...
Hibernate的目标是在任何使用Java的地方都可以使用,无论是在桌面应用程序还是在服务器端的J2EE应用中。通过Hibernate,开发者能够摆脱繁琐的SQL编写工作,专注于业务逻辑的开发。Hibernate不仅支持基本的CRUD(创建...
《轻量级 J2EE 企业应用实战:Struts+Spring+Hibernate 整合开发》是一本深入探讨Java企业级应用程序开发的经典...书中可能涵盖从基本概念、配置、设计模式到最佳实践的全面内容,帮助开发者提升J2EE应用的开发技能。
DWR在基于Spring框架的Web应用中的研究.pdf J2EE平台上消息驱动Bean对客户的响应与回传的实现.pdf J2EE轻量级框架的研究与应用.pdf Spring_IoC集成原理的应用设计.pdf Sturts2与以其它Web应用框架整合的研究.pdf ...