Spring-IOC

IOC是一种设计思想,旨在减少对象间的耦合,通过容器管理对象的创建、装配和依赖关系。依赖注入(DI)是IOC的常见实现方式,Spring通过BeanFactory和ApplicationContext接口提供了IOC容器的功能。应用程序只需声明依赖关系,由容器自动完成注入。XML配置和注解是声明依赖的两种方式。
摘要由CSDN通过智能技术生成

IOC

(Inversion Of Control,控制倒转)的简写

Ioc 不是什么技术,而是一种设计思想,在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。它实现了对象之间的松耦合,通过将对象的创建、组装、管理等过程交由容器来完成,从而使得代码更加灵活、可扩展、易于维护。

IoC是一个很大的概念,可以用不同的方式实现。

其主要形式有两种:
依赖查找:容器提供回调接口和上下文条件给组件。EJB和Apache Avalon 都使用这种方式。这样一来,组件就必须使用容器提供的API来查找资源和协作对象,仅有的控制反转只体现在那些回调方法上,容器将调用这些回调方法,从而让应用代码获得相关资源。

依赖注入:组件不做定位查询,只提供普通的Java方法让容器去决定依赖关系。容器全权负责的组件的装配,它会把符合依赖关系的对象通过JavaBean属性或者构造函数传递给需要的对象。通过JavaBean属性注射依赖关系的做法称为设值方法注入(Setter Injection);将依赖关系作为构造函数参数传入的做法称为构造器注入(Constructor Injection)

IOC底层

​ xml解析、工厂模式、反射

Spring提供的IOC容器实现的两种方式(两个接口):

BeanFactory接口:IOC容器基本实现是Spring内部接口的使用接口,不提供给开发人员进行使用(加载配置文件时候不会创建对象,在获取对象时才会创建对象。)

ApplicationContext接口:BeanFactory接口的子接口,提供更多更强大的功能,提供给开发人员使用(加载配置文件时候就会把在配置文件对象进行创建)推荐使用!

在IOC中,容器负责创建对象、管理对象、注入依赖等任务,而应用程序则只需要声明依赖关系,由容器自动完成依赖注入。

以下是一些关于IOC的链接:

Spring IOC 官方文档:https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html#beans

以下是一些关于IOC的代码示例:

使用Spring IOC容器创建对象:

ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = context.getBean(UserService.class);

使用注解实现依赖注入:

@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserDao userDao;
    //...
}

使用XML配置文件声明依赖关系:

<bean id="userService" class="com.example.UserService">
    <property name="userDao" ref="userDao"/>
</bean>

<bean id="userDao" class="com.example.UserDaoImpl"/>

除了上面我对IOC的最基础的解释之外,下面这个更是清晰

https://zhuanlan.zhihu.com/p/466731141

IOC和DI的区别:

IOC(Inversion of Control)是一种设计模式,它将控制权从调用方转移到框架或容器中。DI(Dependency Injection)是IOC的一种实现方式,它通过将依赖项注入到对象中来实现控制反转。

简单来说,IOC是一种思想,DI是一种实现方式。

在IOC中,控制权由框架或容器掌握,它们负责创建、管理和调用对象。而在DI中,对象不再自己创建或管理它们所依赖的对象,而是将它们的依赖关系委托给框架或容器来管理。

这种思想和实现方式的好处是可以降低代码的耦合度,提高代码的可重用性和可维护性。

以下是一个简单的Java代码示例,演示了DI的实现方式:

public class MyService {
  private MyDao myDao;
  
  public MyService(MyDao myDao) {
    this.myDao = myDao;
  }
  
  public void doSomething() {
    myDao.doSomething();
  }
}

public class MyDao {
  public void doSomething() {
    // do something
  }
}

public class MyApp {
  public static void main(String[] args) {
    MyDao myDao = new MyDao();
    MyService myService = new MyService(myDao);
    myService.doSomething();
  }
}

在这个例子中,MyService依赖于MyDao,但它并不自己创建或管理MyDao,而是将它的依赖关系委托给了MyApp来管理。这种方式可以使代码更加灵活和可扩展。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

LD白哥

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

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

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

打赏作者

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

抵扣说明:

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

余额充值