Spring简介

来源:互联网 发布:西门淘宝店网址 编辑:程序博客网 时间:2024/06/06 19:08

Spring 春天 给软件行业带来了春天
理念:使现有技术更加实用。本身是个大杂烩,整合现有的框架技术。
Spring的优点:

  1. 本身是个轻量级框架
  2. IOC容器——控制反转 核心
  3. AOP——面向切面编程 核心
  4. 对事务的支持
  5. 对框架的支持
    主要内容:
    这里写图片描述
    Spring的核心就是IOC容器(图中第三层Core Container 核心容器)和AOP

IOC:inversion of control 控制反转 一种解耦的思想
下面举个例子进行对比来了解这个思想


以前的方式:
UserDao层:

package cn.sxt.dao;public interface UserDao {    public void getUser();}
package cn.sxt.dao.impl;import cn.sxt.dao.UserDao;public class UserDaoMysqlImpl implements UserDao{    @Override    public void getUser() {        System.out.println("Mysql获取用户数据");    }}
package cn.sxt.dao.impl;import cn.sxt.dao.UserDao;public class UserDaoOracleImpl implements UserDao{    @Override    public void getUser() {        System.out.println("Oracle获取数据");    }}

service层

package cn.sxt.service;public interface UserService {    public void getUser();}
package cn.sxt.service.impl;import cn.sxt.dao.UserDao;import cn.sxt.dao.impl.UserDaoMysqlImpl;import cn.sxt.service.UserService;public class UserServiceImpl implements UserService{    private UserDao userDao=new  UserDaoMysqlImpl();    @Override    public void getUser() {        userDao.getUser();    }}

这个是我们以前的方式,我们自己创建对象,service层里面

private UserDao userDao=new  UserDaoMysqlImpl();

这就带来了一个坏处,比如随着业务量的增大,我们要把Mysql换成Oracle,那么所有用到Mysql的地方都要换成Oracle,那就完了,这种设计的耦合性太高了。我们用面向接口编程的目的就是为了降低耦合性,而这将我们的目的跑偏了。
那怎么改呢?


service层修改

package cn.sxt.service.impl;import cn.sxt.dao.UserDao;import cn.sxt.dao.impl.UserDaoMysqlImpl;import cn.sxt.service.UserService;public class UserServiceImpl implements UserService{    private UserDao userDao=null;    public void setUserDao(UserDao userDao){        this.userDao=userDao;    }    @Override    public void getUser() {        userDao.getUser();    }}

测试

package cn.sxt.test;import cn.sxt.dao.impl.UserDaoMysqlImpl;import cn.sxt.dao.impl.UserDaoOracleImpl;import cn.sxt.service.impl.UserServiceImpl;public class Test {    public static void main(String[] args) {        UserServiceImpl userService=new  UserServiceImpl();        userService.setUserDao(new UserDaoMysqlImpl());        userService.getUser();        System.out.println("----------------------");        userService.setUserDao(new UserDaoOracleImpl());        userService.getUser();    }}

改过以后看上去还是自己创建对象,但是其实已经发生了根本性的变化,
原来是应用程序来创建对象,现在是给客户端来创建,不用修改源码。这种方法是我们手动new放进去,那么有没有一种方法让程序自己本身创建对象放进去。比如Struts2那个Action客户端并没有创建,是Struts2本身为我们创建的。同样的道理,这里我们也是创建对象,我 们有没有办法把它封装到一个配置文件,我们通过读取这个配置文件创建对象。这就完成了一件伟大的事情,原来对象是应用程序本身来创建的,现在应用程序根本不需要管具体实现,哪个对象我们也不需要管,对象外面去给他,在合适的时机给一个对象就ok了,对象怎么创建也不用管,程序员不用再关心具体的对象,可以更关注业务。修改后的案例其实就是IOC的原型。

优点:

  1. 对象的创建不用应用程序本身来创建,应用程序本身原来是主动去创建对象,现在是被动地接受这个对象
  2. 程序员主要的精力集中于业务的实现
  3. 实现了Dao层和Service层的解耦。Service层和Dao层实现了分离。没有直接依赖关系,通过上面修改前的案例可以看出,Service需要导入Dao层的类,所以存在依赖关系。
  4. 如果Dao的实现发生改变,应用程序本身不用改变。
原创粉丝点击