Spring-入门,初识IOC

145 阅读2分钟

初识Spring

  1. Spring是一个轻量级的控制反转(IOC)面向切面(AOP)的容器(框架)。
  2. Spring是一个开源免费的框架,容器
  3. Spring是一个轻量级的框架,非侵入式的
  4. 控制反转IOC,面向切面 AOP
  5. 对事物的支持 , 对框架的支持
  6. Spring理念:使现有技术更加实用 . 本身就是一个大杂烩 , 整合现有的框架技术

IOC基础

IOC:控制反转。

何为控制反转呢?

控制:谁来控制对象的创建,传统应用程序的对象是由程序本身控制创建的,使用Spring后,对象是由Spring来创建的。

反转: 程序本身不创建对象,而变成被动的接收对象。

听到这个解释是不是人还是有点懵逼,没事,下面通过一个例子来说明

准备工作:

  1. 创建一个UserDao接口
package dao;

public interface UserDao {
    public void getUser();
}
  1. UserDao接口实现类UserDaoImpl
package dao;

public class UserDaoImpl implements UserDao{
    public void getUser() {
        System.out.println("UserDao");
    }
}

UserDao接口实现类UserDaoMysqlImpl

package dao;

public class UserDaoMysqlImpl implements UserDao {
    public void getUser() {
        System.out.println("Mysql");
    }
}

UserDao接口实现类UserDaoOrcalImpl

package dao;

public class UserDaoOrcalImpl implements UserDao{
    public void getUser() {
        System.out.println("orcal");
    }
}
  1. UserService接口
package service;

public interface UserService {
    public void getUserService();
}

  1. UserService接口实现类UserServiceImpl
package service;

import dao.UserDao;
import dao.UserDaoMysqlImpl;
import dao.UserDaoImpl;

public class UserServiceImpl implements UserService {

    private UserDao userDao = new UserDaoImpl();

    public void getUserService() {
        userDao.getUser();
    }
}

  1. 测试类
import service.UserService;
import service.UserServiceImpl;

public class DemoTest {

    public static void main(String[] args) {
        UserService service = new UserServiceImpl();
        service.getUserService();
    }
}

  1. 实验结果: 当UserService接口实现类UserServiceImpl中new的对象是UserDaoImpl

image.png

UserService接口实现类UserServiceImpl中new的对象是UserDaoMysqlImpl

image.png

UserService接口实现类UserServiceImpl中new的对象是UserDaoOrcalImpl

image.png

从这里可以看出,如果是这样写的代码,每次用户需要改变需求,我们都要重新去new对象的话,这样的代码就显得非常的垃圾。这就让我们改进,怎么改进呢?很简单,利用set方法。

以上代码仅需要修改UserService接口实现类UserServiceImpl和测试类

UserService接口实现类UserServiceImpl

package service;

import dao.UserDao;

public class UserServiceImpl implements UserService {

    private UserDao userDao;

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    public void getUserService() {
        userDao.getUser();
    }
}

测试类

import dao.UserDaoMysqlImpl;
import dao.UserDaoOrcalImpl;
import service.UserService;
import service.UserServiceImpl;

public class DemoTest {

    public static void main(String[] args) {
        UserServiceImpl userService = new UserServiceImpl();
        userService.setUserDao(new UserDaoOrcalImpl());
        userService.getUserService();
    }
}

这样子,我们只需要去修改测试类的userService.setUserDao(new UserDaoOrcalImpl());中的new UserDaoOrcalImpl(),用户需要哪一种,我们就new哪一种。

====> 这两种不同的处理方式,就体现了控制反转。第一种是程序员控制,第二种是用户控制。

有个很详细的例子:控制反转就好比如你去餐馆吃饭,第一种是,餐馆买好菜,你想吃什么等你到了餐馆,餐馆再去做;第二种是,你想吃什么直接和餐馆说,餐馆直接给你送过去。