Spring IOC与Spring DI区别

Spring IOC

什么是IOC

        Spring IOC(控制反转):是一种实现思想,通过第三方完成我们对实例Bean的管理,而不是通过传统的方式构建实例,交给第三方进行实例化,从而降低代码之间的耦合度
        Spring IOC 控制反转,由Spring容器控制程序之间的关系,而非传统实现中,由程序代码直接控制,IOC发生了 “主从换位” 的变化

高内聚,低耦合概述

        高内聚低耦合是软件工程中的概念,在软件设计中通常用耦合度与内聚度作为衡量模块独立程度的标准
        划分模块的准则:高内聚低耦合

专业术语描述含义
高内聚尽可能的每个成员只完成一件事情(最大限度的聚合)
低耦合减少类内部,一个成员方法调用另一个成员方法

        从类的角度考虑:减少类内部,对其它类的调用

IOC底层实现原理

        Spring IOC是通过工厂模式与反射原理的结合

  • 工厂模式:对我们用户注入的Bean进行实例化
  • 反射原理:便于用户获取实例,而获取的过程是通过反射原理

Spring IOC的理解

        我们在平时的Java Web应用程序开发中,若需要构建一个对象进行使用时,都需要将他们创建出来,也就是传统的使用new操作符的方式进行对象的构建,而这个创建对象的过程是我们自己手动的创建。譬如:有一个A对象要连接数据库需要通过Connection对象,但这个连接数据库的过程中,A对象需要Connextion对象,从而A对象就对Connection对象产生了依赖,提高了两个对象对象之间的耦合度
        为了降低耦合度就需要通过第三方工具的使用来降低耦合度,便于更好的提高内聚度。若使用IOC容器的话,我们的A对象与Connection对象的创建就会交给IOC容器,从而既降低了对象与对象之间的依赖,又提高了内聚度
        因此,Spring IOC具体来说不是一种技术的实现,而是一种设计思想,在我们开发的角度,就不需要去过度的关注怎么来的对象,而是当需要某一个对象时我们更好的进行应用调度

Spring IOC日常生活中的案例

        富士康直接从中介劳务公司中获取劳动力并直接使用,而不用与每一个员工建立劳务关系,就降低了耦合度

  • 富士康:就是我们程序员自己
  • 中介劳务公司:Spring IOC 容器
  • 员工:我们的实例Bean

Spring DI

Spring DI 概述

        Spring DI我们又称依赖注入, 是一种实现思想的手段,将参数注入及给参数赋值的过程

Spring IOC与Spring DI的关系

        当我们需要去构建对象时,一般都会有两个步骤:①构建对象 ②给对象的属性赋值

专业术语作用
Spring IOC构建我们的Bean实例
Spring DI给我们Spring IOC容器构建的实例对应的属性进行赋值

使用Spring DI 前提

        我们使用的Spring DI 依赖注入本质是对属性赋值的一个过程,而我们前提就是需要实例,但实例的构建是通过我们的Spring IOC容器。因此,在Spring容器中使用依赖注入是建立在IOC容器基础之上,且POJO中必须包括无参构造方法

实现依赖注入的四种实现方式

        以下实现方式中我贴出对应的纯净类

@Data //包括get/set/toString/equals/hashCode等
@NoArgsConstructor //无参构造
@AllArgsConstructor //有参构造
public class User {
    private int id;
    private String name;
    private String pwd;
}

set注入(set方法)

        实现步骤:① 纯净类中加入set方法[可以使用lombok中的 @Date 注解添加set方法] ② 在IOC容器中配置实例对象

属性作用
name纯净类中对应相关属性的名称
value设置纯净类中对应属性的属性值

        Spring配置文件相关配置

<?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">

    <!--Bean注入方式:set方法注入-->
    <bean id="user" class="com.spring.pojo.User">
        <property name="id" value="1"/>
        <property name="name" value="刘一"/>
        <property name="pwd" value="321"/>
    </bean>
</beans>

构造注入(构造方法)

        实现步骤:① 纯净类中需要添加构造方法,可通过lombok注解添加 ②IOC容器中配置实例对象
        bean节点的相关属性描述

节点作用描述
index纯净类中属性名称的索引,初值为0
name纯净类中属性名称
type纯净类中属性对应的数据类型
value纯净类中对应的属性值

        Spring配置文件相关配置

<?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">
       
    <!--Bean注入方式:构造方法注入-->
    <bean id="user1" class="com.spring.pojo.User">
        <constructor-arg index="0" name="id" type="int" value="2"/>
        <constructor-arg index="1" name="name" type="java.lang.String" value="小二"/>
        <constructor-arg index="2" name="pwd" type="java.lang.String" value="321"/>
    </bean>
</beans>

工厂注入

        工厂注入的方式顾名思义我们需要结合工厂类。通过工厂注入实例的步骤:①构建纯净类 ② 构建工厂类,并设计方法,在方法体中完成对象的创建 ③在IOC容器中写入相关配置项
        纯净类

@Data 
@NoArgsConstructor 
@AllArgsConstructor
public class User {
    private int id;
    private String name;
    private String pwd;
    private Dog dog;
}

        工厂类

public class UserFactory {
	//非静态工厂方式[没有static修饰的方法]
    public User createUser(){
        User user = new User();
        user.setId(3);
        user.setName("小仓鼠");
        user.setPwd("321");
        return user;
    }
    
	//静态工厂
    public static User createUser1(){
        User user = new User();
        user.setId(5);
        user.setName("热爱分享的小仓鼠");
        user.setPwd("123456");
        return user;
    }
}

        配置相关文件


<?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">
       
    <!--构建工厂实例-->
    <bean id="userFactory" class="com.spring.config.UserFactory"/>
    
     <!--Bean注入方式:非静态工厂注入-->
    <bean id="user3" factory-bean="userFactory" factory-method="createUser"/>

    <!--Bean注入方式:非静态工厂注入-->
    <bean id="user4" class="com.spring.config.UserFactory" factory-method="staticCreateUser"/>

</beans>

        bean节点中相关属性使用描述

bean节点属性名称描述
factory-bean用于引入工厂类bean得id
factory-method用于指定工厂类中设计得方法

注解注入

        注解相关描述如下

注解名称注解作用
@Autowired根据default-autowired得byType方式进行自动注入
@Qualifier根据default-autowired得byName方式进行自动注入
@Resource是@Autowired与@Qualifier两注解得结合
@Repository该注解适用于dao层
@Service适用于service层(业务层),默认值value为类名得首字母小写
@Controller适用于控制层,主要在Spring MVC中使用
@Value适用于给成员完成赋值
@Component该注解为元注解,可以在任意层使用,类似Object类性质

补充

        关于注解得方式大家知道对应的作用,如何使用就可以了,核心还是在IOC容器得配置项,注解也是在配置配件上做的更彻底得一次封装,从而提高开发的效率,不需要在配置文件中配置大量的内容

         感谢大家的阅读,热爱分享的仓鼠,请大家多多指教,么么哒~~~~~

  • 2
    点赞
  • 1
    收藏
  • 打赏
    打赏
  • 2
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:数字20 设计师:CSDN官方博客 返回首页
评论 2

打赏作者

被风吹过的忧伤

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

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值