Spring简介

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的实现发生改变,应用程序本身不用改变。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值