使用Spring之前
UserDao.java
package com.geng.dao;
public interface UserDao {
void getUser();
}
UserDaoImpl.java
package com.geng.dao;
public class UserDaoImpl implements UserDao{
@Override
public void getUser() {
System.out.println("默认获取用户的数据");
}
}
UserService.java
package com.geng.service;
public interface UserService {
public void getUser();
}
UserServiceImpl.java
package com.geng.service;
import com.geng.dao.UserDao;
import com.geng.dao.UserDaoImpl;
public class UserServiceImpl implements UserService{
// 调dao层,除了继承还有组合的概念
// 把dao引到service里面了
private UserDao userDao = new UserDaoImpl();
@Override
public void getUser() {
// 业务层调dao层
userDao.getUser();
}
}
测试类:MyTest.java
import com.geng.service.UserServiceImpl;
public class MyTest {
public static void main(String[] args) {
// 用户实际调用的是业务层,dao层不需要接触
UserServiceImpl userService = new UserServiceImpl();
userService.getUser();
}
}
执行结果:
类结构图:
快捷键:Ctrl+Alt+Shift+U
执行过程:
此处没有理解怎么执行的原因:
1.new的过程,为什么只创建了那个类的属性,而到执行这个类的方法的时候才回去执行这个类的方法?
2.多态的理解,不知道 UserServiceImpl userService = new UserServiceImpl()是怎样的一个执行过程。
上述代码的弊端:
当我们有多种方法获取数据的时候,必须手动的修改 UserServiceImpl.java中的代码。当方式很多,代码量很大的时候就很不方便了:如下
public class UserServiceImpl implements UserService{
// 方式一
private UserDao userDao = new UserDaoImpl();
// 方式二
private UserDao userDao = new UserDaoMysqlImpl();
// 方式三
private UserDao userDao = new UserDaoOracleImpl();
// 方式四
private UserDao userDao = new UserDaoSqlServerImpl();
}
上述这种方式是程序控制对象的创建。
用控制反转(IOC)的思想对上述代码进行修改,把创建对象的方式交到用户手里。
IOC改进代码
如果每次获取数据的方式不同的话,在 UserServiceImpl中修改很麻烦,干脆就在里面设置一个 setUserDao()方法用来对后面new的对象的控制交到 最外面测试类里面。这样当用户需要什么方式获取数据的时候,就传一个什么类型的数据就可以啦。
对 UserServiceImpl.java 的改进:
public class UserServiceImpl implements UserService{
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void getUser() {
userDao.getUser();
}
对 MyTest.java 的改进:
public class MyTest {
public static void main(String[] args) {
UserServiceImpl userService = new UserServiceImpl();
userService.setUserDao(new UserDaoOracleImpl());
userService.getUser();
}
}
代码执行过程: