初识Spring
- Spring是一个轻量级的
控制反转(IOC)和面向切面(AOP)的容器(框架)。 - Spring是一个开源免费的框架,容器
- Spring是一个轻量级的框架,非侵入式的
- 控制反转IOC,面向切面 AOP
- 对事物的支持 , 对框架的支持
- Spring理念:使现有技术更加实用 . 本身就是一个大杂烩 , 整合现有的框架技术
IOC基础
IOC:控制反转。
何为控制反转呢?
控制:谁来控制对象的创建,传统应用程序的对象是由程序本身控制创建的,使用Spring后,对象是由Spring来创建的。
反转: 程序本身不创建对象,而变成被动的接收对象。
听到这个解释是不是人还是有点懵逼,没事,下面通过一个例子来说明
准备工作:
- 创建一个UserDao接口
package dao;
public interface UserDao {
public void getUser();
}
- 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");
}
}
- UserService接口
package service;
public interface UserService {
public void getUserService();
}
- 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();
}
}
- 测试类
import service.UserService;
import service.UserServiceImpl;
public class DemoTest {
public static void main(String[] args) {
UserService service = new UserServiceImpl();
service.getUserService();
}
}
- 实验结果:
当UserService接口实现类UserServiceImpl中new的对象是
UserDaoImpl时
当UserService接口实现类UserServiceImpl中new的对象是UserDaoMysqlImpl时
当UserService接口实现类UserServiceImpl中new的对象是UserDaoOrcalImpl时
从这里可以看出,如果是这样写的代码,每次用户需要改变需求,我们都要重新去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哪一种。
====> 这两种不同的处理方式,就体现了控制反转。第一种是程序员控制,第二种是用户控制。
有个很详细的例子:控制反转就好比如你去餐馆吃饭,第一种是,餐馆买好菜,你想吃什么等你到了餐馆,餐馆再去做;第二种是,你想吃什么直接和餐馆说,餐馆直接给你送过去。