IOC理论推导
在Sping前创建项目的操作
1.UserDao 接口
2.UserDaoImpl 实现类
3.UserService 业务接口
4.UserServiceImpl 业务实现类
新建一个maven项目
File->new->project
选择maven项目->next
修改成自己的
在pom.xml文件导入jar包
记得修改maven仓库位置
删除src文件
删除后:
目的:
为了建子项目,可以在一个项目中管理很多东西
新建一个module
Spring出现前的项目流程
1.新建包:com.kuang.dao
2.新建UserDao接口
3.为UserDao接口添加方法
package com.kuang.dao;
public interface UserDao {
void getUser();
}
4.创建UserDao接口的实现类UserDaoImpl
package com.kuang.dao;
public class UserDaoImpl implements UserDao{
@Override
public void getUser() {
System.out.println("默认获取用户的数据");
}
}
5.创建UserDao接口的实现类UserDaoMysqlImpl
package com.kuang.dao;
public class UserDaoMysqlImpl implements UserDao{
@Override
public void getUser() {
System.out.println("默认获取mysql的数据");
}
}
6.创建UserDao接口的实现类UserDaoOracleImpl
package com.kuang.dao;
public class UserDaoOracleImpl implements UserDao{
@Override
public void getUser() {
System.out.println("默认获取oracle的数据");
}
}
7.创建com.kuang.service包
8.创建UserService接口
9.创建UserService接口实现类UserServiceImpl
package com.kuang.service;
import com.kuang.dao.UserDao;
import com.kuang.dao.UserDaoImpl;
/*
* 业务层(service层)调用数据访问层(dao层)
*
* java中除了继承还有组合的概念
* */
public class UserServiceImpl implements UserService{
// 将UserDao引入UserService
private UserDao userDao = new UserDaoImpl();
@Override
public void getUser() {
//调用
userDao.getUser();
}
}
10.测试
在Test包下创建myTest类
代码:
import com.kuang.service.UserService;
import com.kuang.service.UserServiceImpl;
public class myTest {
public static void main(String[] args) {
//用户实际调用的是业务层,dao层用户不需要接触
UserService userService= new UserServiceImpl();
// 用户调用业务层的getUser方法
userService.getUser();
}
}
测试结果
在Dao层添加一个mysql的实现
service层的代码需要去改变
package com.kuang.service;
import com.kuang.dao.UserDao;
import com.kuang.dao.UserDaoImpl;
import com.kuang.dao.UserDaoMysqlImpl;
/*
* 业务层(service层)调用数据访问层(dao层)
*
* java中除了继承还有组合的概念
* */
public class UserServiceImpl implements UserService{
// 将UserDao引入UserService
// private UserDao userDao = new UserDaoImpl();
// 要想实现UserDaoMysqlImpl,private UserDao userDao = new UserDaoImpl();需要修改为下面的
private UserDao userDao = new UserDaoMysqlImpl();
@Override
public void getUser() {
userDao.getUser();
}
}
测试结果
只要用户请求发生变更,service层就需要手动去更改。程序无法适应用户的变更
优化:利用set动态实现值的注入
只需要变更UserDaoServiceImpl层代码
package com.kuang.service;
import com.kuang.dao.UserDao;
import com.kuang.dao.UserDaoImpl;
import com.kuang.dao.UserDaoMysqlImpl;
/*
* 业务层(service层)调用数据访问层(dao层)
*
* java中除了继承还有组合的概念
* */
public class UserServiceImpl implements UserService{
// 将UserDao引入UserService
// private UserDao userDao = new UserDaoImpl();
// 要想实现UserDaoMysqlImpl,private UserDao userDao = new UserDaoImpl();需要修改为下面的
// private UserDao userDao = new UserDaoMysqlImpl();
private UserDao userDao;
//利用set方法进行动态实现值的注入
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void getUser() {
userDao.getUser();
}
}
测试
import com.kuang.dao.UserDaoMysqlImpl;
import com.kuang.service.UserService;
import com.kuang.service.UserServiceImpl;
public class myTest {
public static void main(String[] args) {
//用户实际调用的是业务层,dao层用户不需要接触
UserService userService= new UserServiceImpl();
((UserServiceImpl)userService).setUserDao(new UserDaoMysqlImpl());
// 用户调用业务层的getUser方法
userService.getUser();
}
}
在我们之前的业务中,用户的需求可能会影响我们原来的代码,我们需要根据用户的需求去修改原代码!
如果程序代码量非常大,修改一个代码的成本十分昂贵
我们使用一个Set接口实现,代码发生了革命性的变化
private UserDao userDao;
//利用set方法进行动态实现值的注入
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
● 之前:程序是主动创建对象!控制权在程序员手上
● 使用set注入后,程序不再具有主动性,而是变成了被动的接收对象!
这种思想,从本质上解决了问题,程序员不需要去管理对象的创建了,系统的耦合性大大降低,可以更加专注的在业务的实现上
通过配置文件的方式
上述1-9步骤不变
然后再resource包中新建beans.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="mysqlImpl" class="com.kuang.dao.UserDaoMysqlImpl" />
<bean id="oracleImpl" class="com.kuang.dao.UserDaoOracleImpl" />
<bean id="UserServiceImpl" class="com.kuang.service.UserServiceImpl">
<!-- ref:引用Spring中创建好的对象
value:具体的值,基本数据类型
-->
<property name="userDao" ref="oracleImpl" />
</bean>
</beans>
测试:
import com.kuang.dao.UserDaoMysqlImpl;
import com.kuang.service.UserService;
import com.kuang.service.UserServiceImpl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class myTest {
public static void main(String[] args) {
//获取ApplicationContext:拿到Spring的容器
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
UserServiceImpl userServiceImpl = (UserServiceImpl)context.getBean("UserServiceImpl");
userServiceImpl.getUser();
}
}