Spring的IOC在J2EE项目中的应用

  前些天大概学习了一下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层的基本代码都是通过工具自动生成,效率大大的提高了,维护起来结构也非常清晰。
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值