spring-IOC理论

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();
    }
}

运行截图:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

没有梦想的java菜鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值