Spring——绝对彻底搞懂IOC容器原理以及使用

本文深入探讨了Spring框架中的核心概念IOC(Inversion of Control),解释了IOC的作用和用法,指出它如何帮助降低代码之间的耦合度。通过实例展示了如何通过配置文件将对象的依赖关系交由Spring管理,从而在需要更改依赖时无需修改代码,只需更新配置。最后,提到了通过Spring提供的接口来查看配置文件中的bean数量。
摘要由CSDN通过智能技术生成

上一节,我介绍了什么是Spring以及Spring的优势,其中Spring最核心的两个知识点,一个是IOC,另一个是AOP。

今天我会用最通俗易懂的话让大家明白什么是IOC,IOC的作用,IOC的用法。

上课!

我们在使用Javaweb开发网站的时候,写的代码是这样的:

定义接口类:UserDao.java

public interface UserDao
{
    public void getName();
}
定义实现类:UserDaoImpl.java

public class UserDaoImpl implements UserDao
{
    public void getName()
    {
        System.out.println("我是一名研究生");
    }
}
定义业务层:UserService.java

public interface UserService
{
    public void getName();
}
定义实现类:UserServiceImpl.java

public class UserServiceImpl implements UserService
{
    UserDao ud = new UserDaoImpl();

    public void getName()
    {
        ud.getName();
    }
}

可以看出在Service层需要new一个Dao层的对象,这样两者就会产生依赖,而且这种依赖被硬编码在程序里,如果需要修改,则需要在程序内部修改,使得程序耦合度非常高,这样的程序是不好的。

那么怎么做可以让对象之间实现解耦呢?之前我们是把对象间的依赖关系硬编码在程序里,造成了高耦合,那么我们能不能把这种依赖关系交给第三方进行处理呢?这个第三方就是IOC容器

我们可以通过Spring的IOC容器,把对象间的依赖关系交给Spring控制,这个时候如果Service层需要调用Dao层的对象,就不需要硬编码了,而是取Spring容器里面去取出来,完全不需要硬编码,实现了解耦的作用。

看这些文字可能有点绕,没关系,直接上代码,一看就懂了:

ApplicationContext.xml

<bean id="udi" class="com.DaoImpl.UserDaoImpl">

解释:首先创建一个配置文件,一般命名为ApplicationContext.xml
      
      然后创建一个bean标签,每一个bean标签代表一个对象,比如上面的bean标签代表的是UserDaoImpl对象
        
      id 表示 该对象的唯一标识符,通过id就可以找到这个对象, class 表示的是该对象的全限定名
        
      通过XML配置文件,通过反射机制就完成了对象的创建:UserDao ud = new UserDaoImpl();
        
      创建完对象之后,需要保存对象,Spring采用Map的方式来存放对象,即springMap.put(id,对象):SpringMap.put("udi",new UserDaoImpl);

写完配置文件后,我们开始去获取对象

UserServiceImpl.java

public class UserServiceImpl implements UserService
{
    1.定义配置文件

    String config="ApplicationContext.xml";

    2.创建表示Spring容器的对象:ApplicationContext

      ApplicationContext是一个接口,ClassPathXmlApplicationContext是它的实现类

      ClassPathXmlApplicationContext用来读取配置文件并且创建出配置文件中的所有对象

    ApplicationContext ac = new ClassPathXmlApplicationContext(config);

    3.获取对象,可以看出没有使用new关键字了,实现了解耦的效果
    
    UserDao ud =(UserDao) ac.getBean("udi");
    
    4.调用方法
    
    ud.getName();

}

这样写之后,如果我们想进行修改,比如在ServiceImpl中我们不想new UserDaoImpl 了,我们想new 一个别的Impl,那么我们就不需要在代码中修改,只需要去配置文件里面去做修改,实现了解耦,方便开发。

总结一下流程:

  1. 创建配置文件
  2. ApplicationContext ac = new ClassPathXmlApplicationContext(config)读取配置文件
  3. 通过ac.getBean(id) 来获取对象并调用方法

如何知道xml中有多少个bean呢?我们总不能一遍一遍去看吧,spring给我们提供了接口:

获取bean的数量

public void getBeanCount()
{
     String config="ApplicationContext.xml";


     ApplicationContext ac = new ClassPathXmlApplicationContext(config);

     System.out.println(ac.getBeanDefinitionCount());
}
public void getBeanName()
{
     String config="ApplicationContext.xml";


     ApplicationContext ac = new ClassPathXmlApplicationContext(config);

     String [] bean_names=ac.getBeanDefinitionName());

     for(String bean_name:bean_names)
     {
        System.out.println(bean_name);
     }
}

大家如果有什么疑问,欢迎评论区留言。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值