Spring之IOC本质简述

38 篇文章 0 订阅
  • IOC的本质是:控制反转loC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现loC的一种方法,也有人认为DI只是loC的另一种说法。没有loC的程序中,我们使用面向对象编程,对象的创建与对象间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制,控制反转后将对象的创建转移给第三方,个人认为所谓控制反转就是:获得依赖对象的方式反转了。
    在这里插入图片描述

  • loC是Spring框架的核心内容,使用多种方式完美的实现了loC,可以使用XML配置,也可以使用注解,新版本的Spring也可以零配置实现loC。

  • Spring容器在初始化时先读取配置文件,根据配置文件或元数据创建与组织对象存入容器中,程序使用时再从loc容器中取出需要的对象。
    在这里插入图片描述

  • 采用XML方式配置Bean的时候,Bean的定义信息是和实现分离的,而采用注解的方式可以把两者合为一体,Bean的定义信息直接以注解的形式定义在实现类中,从而达到了零配置的目的。

  • 控制反转是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。在Spring中实现控制反转的是loC容器,其实现方法是依赖注入(Dependency Injection,Dl)。

    // 创建一个bean
    public class User {
        private String name;
    	public User() {
            System.out.println("user的无参构造!");
        }
        public User(String name) {
            this.name = name;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        @Override
        public String toString() {
            return "User{" +
                    "name='" + name + '\'' +
                    '}';
        }
    }
    // 模型层接口
    public interface UserDao {
        void getUser();
    }
    // 丢入spring容器
    public class UserDaoMysqlImpl implements UserDao {
        @Override
        public void getUser() {
            System.out.println("Mysql获取用户数据!");
        }
    }
    // 业务层接口
    public interface UserService {
        void getUser();
    }
    // 丢入spring容器
    public class UserServiceImpl implements UserService {
        private UserDao userDao;
        //利用set进行动态实现值的注入!
        public void setUserDao(UserDao userDao){
            this.userDao = userDao;
        }
        @Override
        public void getUser() {
            userDao.getUser();
        }
    }
    
  • 控制反转的配置

    <?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 http://www.springframework.org/schema/beans/spring-beans.xsd">
        <!-- 使用Spring来创建对象,在Spring这些都称为Bean;
            类型变量名= new类型();
            User user = new User();
            id =变量含
            class = new的对象;
            property相当于给对象中的属性设置一个值!
         -->
        <bean id="user" class="com.toec.pojo.User">
            <!--无参构造-->
            <!--<property name="name" value="鲁智深" />-->
            <!--有参构造-->
            <!--<constructor-arg index="0" value="武松" />-->
            <!--<constructor-arg type="java.lang.String" value="林冲" />-->
            <constructor-arg name="name" value="卢俊义" />
        </bean>
        <bean id="mysqlImpl" class="com.dao.UserDaoMysqlImpl" />
        <bean id="userServiceImpl" class="com.service.UserServiceImpl">
            <!--  ref : 引用Spring容器中创建好的对象
              value :具体的值,基本数据类型!-->
            <property name="userDao" ref="mysqlImpl" />
        </bean>
    </beans>
    
  • 使用测试

    import com.toec.pojo.User;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class Test {
        public static void main(String[] args) {
            // 获取Spring的上下文对象
            ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
            // 我们的对象现在都在iSpring中的管理了,我们要使用,直接去里面取出来就可以!
            User user =(User) context.getBean("user");
            System.out.println(user.toString());
            UserServiceImpl userServiceImpl = (UserServiceImpl) context.getBean("userServiceImpl");
            userServiceImpl.getUser();
        }
    }
    
    
  • User对象是谁创建的?

    • user对象是由Spring创建的。
  • User对象的属性是怎么设置的?

    • user对象的属性是由Spring容器设置的,
  • 这个过程就叫控制反转:

  • 控制:谁来控制对象的创建,传统应用程序的对象是由程序本身控制创建的,使用Spring后,对象是由Spring来创建的.

  • 反转︰程序本身不创建对象,而变成被动的接收对象.

  • 依赖注入:就是利用set方法来进行注入的.

  • IOC是一种编程思想,由主动的编程变成被动的接收.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

脑袋不够用的小渣渣

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

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

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

打赏作者

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

抵扣说明:

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

余额充值