-
UserDao 接口
package com.huisang.dao; public interface UserDao { void getUser(); }
此处只定义接口
-
UserDaoImpl 实现类
package com.huisang.dao; public class UserDaoImpl implements UserDao { @Override public void getUser() { System.out.println("默认获取用户的数据"); } }
该抽象实体的一种实现方法
-
UserService 业务接口
package com.huisang.service; public interface UserService { void getUser(); }
业务接口声明
-
UserServiceImpl业务实现类
package com.huisang.service; import com.huisang.dao.UserDao; import com.huisang.dao.UserDaoImpl; public class UserServiceImpl implements UserService { private UserDao userDao=new UserDaoImpl(); @Override public void getUser() { userDao.getUser(); } }
通过业务层实现类去调用实体层实现类
测试类:
package com.huisang; import com.huisang.service.UserService; import com.huisang.service.UserServiceImpl; public class AppTest { public static void main(String[] args) { //用户调用的是业务层,dao层它们不需要接触 UserService userService=new UserServiceImpl(); userService.getUser(); } }
测试结果截图:
我们可以思考一个问题,当我们想要去实现另外一种抽象实体的方法时,我们需要对业务层实现类进行更改,如实现一个以下方法
package com.huisang.dao;
public class UserDaoMysqlImpl implements UserDao {
@Override
public void getUser() {
System.out.println("MySql获取用户数据");
}
}
这时候我们观察UserServiceImpl业务实现类,发现这一语句private UserDao userDao=new UserDaoImpl();将方法写死了,要想实现当前这个UserDaoMysqlImpl的方法,必须修改代码为private UserDao userDao=new UserDaoMysqlImpl();
这也就出现一个问题,我们要根据用户的需求去修改代码,显然在一个运行的项目中,这个操作是不可行的,而且如果需求很多岂不是程序员要不停的敲代码了?
当我们将UserServiceImpl业务实现类进行以下修改
package com.huisang.service;
import com.huisang.dao.UserDao;
public class UserServiceImpl implements UserService {
private UserDao userDao;
//利用set进行动态实现值的注入!
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void getUser() {
userDao.getUser();
}
}
这时我们发现,这个userDao的值不是直接赋值,而是需要进行set来设置值,我们再看测试类
package com.huisang;
import com.huisang.dao.UserDaoMysqlImpl;
import com.huisang.service.UserService;
import com.huisang.service.UserServiceImpl;
public class AppTest
{
public static void main(String[] args) {
//用户调用的是业务层,dao层它们不需要接触
UserService userService=new UserServiceImpl();
((UserServiceImpl)userService).setUserDao(new UserDaoMysqlImpl());//这里强转是因为setUserDao方法存在于UserServiceImpl中
userService.getUser();
}
}
这时我们发现,从原来的用户需求改代码变成了当前的根据用户需求更改了实体类的实现
这就叫做控制反转!