1.UserDao接☐
package com.kuang.dao;
public interface UserDao {
void getUser();
}
2.UserDaolmpl实现类
package com.kuang.dao;
public class UserDaoImpi implements UserDao{
@Override
public void getUser() {
System.out.println("获取用户的数据");
}
}
3.UserService业务接口
package com.kuang.service;
public interface UserService {
void getUser();
}
4.UserServicelmpl业务实现类
package com.kuang.service;
import com.kuang.dao.UserDao;
import com.kuang.dao.UserDaoImpi;
public class UserServiceImpi implements UserService{
private UserDao userDao=new UserDaoImpi();
@Override
public void getUser() {
userDao.getUser();
}
}
测试类:
import com.kuang.service.UserService;
import com.kuang.service.UserServiceImpi;
public class MyTest {
public static void main(String[] args) {
//用户实际调用的是业务层,dao层他们需要接触!
UserService userService = new UserServiceImpi();
userService.getUser();
}
}
在我们之前的业务中,用户的需求可能会影响我们原来的代码,我们需要根据用户的需求去修改原代码!如果程序代码量答,修改一个的成本十分大!
我们使用一个Set接口实现,已经发生了革命性变化!
//利用set进行动态实现值的注入。
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
![image.png](https://img-blog.csdnimg.cn/img_convert/bc46a834f93bad969af7c570bf34fcc0.png#clientId=u5d848ef0-0ede-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=208&id=ua5d431f5&margin=[object Object]&name=image.png&originHeight=260&originWidth=1008&originalType=binary&ratio=1&rotation=0&showTitle=false&size=37129&status=done&style=none&taskId=u594b4512-3e01-45cc-b33c-a42092f4cdc&title=&width=806.4)
使用setUserDao的时候需要用到强制转化,这是因为上装修对象只能调用父类未重写的方法或子类已重写的方法
- 之前,程序是主动创建对象,我们直接在测试类直接改变
- 使用set注入后,程序不在具有主动性,而是变成了被动的接受对象
这种思想,从本质上解决了问题,我们程序猿不用再去管理对象的创建了。系统的耦合性大大降低~,可以更加专注的在业务的实现上!这是OC的原型!
那如何去使用我们的ioc理念呢?
dao层UserDao接口类:
package com.kuang.dao;
public interface UserDao {
void getUser();
}
dao层UserDaoMysqlImpi类:
package com.kuang.dao;
import org.springframework.context.event.SourceFilteringListener;
public class UserDaoMysqlImpi implements UserDao{
@Override
public void getUser() {
System.out.println("mysql获取用户的数据");
}
}
service层UserService接口类
package com.kuang.service;
public interface UserService {
void getUser();
}
service层UserServiceImpi类
package com.kuang.service;
import com.kuang.dao.UserDao;
import com.kuang.dao.UserDaoImpi;
public class UserServiceImpi implements UserService{
private UserDao userDao;
//利用set进行动态实现值的注入。
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void getUser() {
userDao.getUser();
}
}
按正常来说我们一般是去调用service层,客户不会去接触到dao层,
那我们怎么去优化他们呢,就像上面所说的将主动权放在用户,我们可以去使用springIOC容器去注入
首先我们在resources里面配置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">
<!-- 使用Spring来创建对象,在Spring称为Bean
Hello hello = new 类型();
bean = 对象 new Hello();
id=变量名
class = new的对象
property 相当与给对象中的属性设置一个值!
-->
<bean id="mysqlImpl" class="com.kuang.dao.UserDaoMysqlImpi"></bean>
<bean id="UserServiceImpi" class="com.kuang.service.UserServiceImpi">
<!-- ref:引用Spring容器中创建好的对象
value:具体的值,基本数据类型
-->
<property name="userDao" ref="mysqlImpl"/>
</bean>
</beans>
配置完之后我们可以不去new一个对象也可以直接使用我们的方法了。
测试类
import com.kuang.service.UserServiceImpi;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
UserServiceImpi userServiceImpi = (UserServiceImpi) context.getBean("UserServiceImpi");
userServiceImpi.getUser();
}
}
运行截图: