经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Spring » 查看文章
Java面试题:你知道Spring的IOC吗?那么,它为什么这么重要呢?
来源:cnblogs  作者:猫鱼吐泡泡  时间:2024/4/29 9:30:58  对本文有异议

Spring的IOC(控制反转)是一种设计模式,它允许开发者将对象的创建和管理交给Spring框架来完成。在Spring中,IOC允许开发者将对象依赖关系从代码中分离出来,从而使代码更加灵活、可重用和易于管理。

IoC 全称Inverse of Control(反向控制或控制反转)。

在类和类之间存在控制权,控制权指的是对象的创建和使用,比如有类A和类B,我们之前的做法是在A中调用B,那么控制权就在A中,这样做的耦合度较高,如果修改了 B,A也要做相应修改。

  1. class A {
  2.  
  3. }
  4.  
  5. class B {
  6. // B需要将A的实例new出来,也就是我们说的控制 private A a = new A();
  7. public void use() {
  8. System.out.print(a);
  9. }
  10. }

 

引入Spring框架后,控制权由 spring 容器来负责。当A想使用B时,需要由 Spirng容器通过配置文件进行注入。这种思想就是IoC(为了更好的理解,我们可以这样认为,对象创建和使用的控制权转移到了Spring容器,由Spring容器来控制)。

  1. // 说明A自己控制自己,把自己初始化出来,注入给了容器
  2. @Component
  3. class A {
  4.  
  5. }
  6.  
  7. class B {
  8. // B不需要控制a,直接使用。如果A没有把自己注入给容器,B就不能使用
  9. @Resource private A a;
  10.  
  11. public void use() {
  12. System.out.print(a);
  13. }
  14. }

 

实现Spring的IOC(控制反转)有以下几种方式

  • 使用@Autowired注解:这是Spring中最常用的实现IOC的方式。通过在需要依赖注入的类上使用@Autowired注解,Spring会自动将依赖对象注入到该类中。

  • 使用配置文件:通过在Spring配置文件中定义bean,可以手动创建和管理对象。这种方式适合于需要灵活控制对象创建和生命周期的情况。

  • 使用Java配置:通过使用Java配置类,可以更灵活地定义bean和配置对象之间的关系。这种方式适合于需要更细粒度控制的情况。

 

如何实现一个简易的IOC功能?

上述是Spring容器简单的使用IOC功能,如果我们自己想实现一个简单版的,可以按照以下步骤:

  • 定义一个容器类,用于管理对象的创建和注入。

  • 实现对象的创建方法,可以使用常见的工厂模式或依赖查找等方式来创建对象。

  • 在容器类中定义一个注入方法,用于将对象注入到需要依赖的对象中。


下面是一个简单的代码示例,展示了如何实现一个简易的IOC功能:

  1. // 定义容器类
  2. public class ObjectContainer {
  3. // 创建对象的方法
  4. public static Object createObject(String className) throws Exception {
  5. // 使用反射创建对象
  6. return Class.forName(className).newInstance();
  7. }
  8.  
  9. // 注入对象的方法
  10. public static void injectObject(Object target, String className) throws Exception {
  11. // 将对象注入到目标对象中
  12. Field field = target.getClass().getField(className);
  13. field.set(target, ObjectContainer.createObject(className));
  14. }
  15. }
  16.  
  17. // 使用示例
  18. public class ExampleClass {
  19. private Object obj; // 需要注入的对象
  20.  
  21. public ExampleClass(String className) {
  22. try {
  23. // 注入对象
  24. ObjectContainer.injectObject(this, className);
  25. } catch (Exception e) {
  26. e.printStackTrace();
  27. }
  28. }
  29.  
  30. public void doSomething() {
  31. // 使用对象进行操作
  32. obj.method();
  33. }
  34. }

 

在上面的示例中,我们定义了一个ObjectContainer类,它包含了创建对象和注入对象的方法。在ExampleClass中,我们使用了ObjectContainer的注入方法将对象注入到目标对象中。使用时只需要传入对象的类名即可。

请注意,上述示例只是一个简单的实现,没有考虑一些复杂的场景,例如循环依赖、类型转换等问题。在实际开发中,需要根据具体的需求和场景进行适当的调整和优化。

使用IOC有哪些好处?

①、使用者不用关心引用Bean的实现细节,譬如对于B b = new A(c,d,e,f);来说,如果B要使用A,那还要 把c,d,e,f侈个类全都感知一遍,这显然是非常麻烦且不合理的。

②、不用创建多个相同的bean导致浪费,仍然是: 

  1. A b = new A();
  2. A c = new A();

如果B和C都引用了A,那么B和C就可能new两个A实例,实际上,我们只需要一个就好了。 

③、Bean的修改使用方无需感知。同样是上面的例子,假如说Bean A需要修改,如果没有IOC的话,所有引用到A的其他Bean都需要感知这个逻辑,并且做对应的修改。但是如果使用了IOC,其他Bean就完全不用感知到。

 

往期面试题:

Java面试题:SimpleDateFormat是线程安全的吗?使用时应该注意什么?

Java面试题:细数ThreadLocal大坑,内存泄露本可避免

Java面试题:请谈谈对ThreadLocal的理解?

Java面试题:为什么HashMap不建议使用对象作为Key?

原文链接:https://www.cnblogs.com/marsitman/p/18163209

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号