首页 > 其他分享 >IOC控制反转

IOC控制反转

时间:2022-10-03 22:00:10浏览次数:52  
标签:创建 控制 容器 对象 反转 Spring 赋值 IOC 属性

一、IOC概念

    IOC(Inversion of Control):控制反转,是个理论和指导思想,旨在将原来需要开发人员手动声明的Java对象,反转为由Spring(容器)统一控制管理。

1、控制反转

    控制:对象创建,属性赋值,对象生命周期管理【Bean的生命周期】

    反转:把管理对象的权限转移给了容器实现,由容器完成对象的管理

    正转:使用new 构造方法创建对象,开发人员掌握了对象的全部过程

2、技术实现

    DI(Dependency Injection)依赖注入:是IOC的技术实现,其实可以说它就是IOC。程序只需要提供要使用的对象名称或者类型,容器就会帮你实现:对象的创建、查找获取和属性赋值。

    通过Spring框架, 只需要提供要使用的对象名词或者类型就可以了。 从容器中获取名称对应的对象。Spring底层使用反射机制实现,通过反射创建对象,给属性赋值。

二、Spring的配置文件XML

Spring系统配置文件: xxx.xml

1、根标签是 beans
2、beans 后面是约束文件声明

        xmlns        声明命名空间         值:http://www.springframework.org/schema/beans
        xmlns:xsi   声明xsi命名空间    值:http://www.w3.org/2001/XMLSchema-instance
        xsi:schemaLocation  xsi命名空间下面的schemaLocation标签,约束文件具体路径:        
                      http://www.springframework.org/schema/beans:约束文件简短名称
                      http://www.springframework.org/schema/beans/spring-beans.xsd:约束文件路径
      表示:<beans>标签下面的子标签都是在spring-beans.xsd约束文件中指定的

<?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:该属性是 Bean 实例的唯一标识,程序通过 id 属性访问 Bean,Bean与 Bean 间的依赖关系也是通过 id 属性关联的。
        class:指定该 Bean 所属的类,注意这里只能是类,不能是接口。
      -->
    <bean id="dgjTestService" class="com.xinsteel.finance.api.service.DgsTestService"></bean>
</beans>

image

三、Spring容器创建

1、ApplicationContext 接口(容器)

    ApplicationContext 用于加载 Spring 的配置文件,在程序中充当“容器”的角色。可以通过ApplicationContext对象的getBean("bean的id") 来获取容器里面的Bean。其实现类有两个:①ClassPathXmlApplicationContext ②FileSystemXmlApplicationContext

image
/i/ll/?i=08a83dfd678f4f28b552453e78eb6a69.png

2、代码测试

image

3、逻辑关系

image

4、问题思考

Spring是在什么时候创建的对象?

创建Spring容器对象的时候,会读取配置文件,创建文件中声明的Java对象

优点:获取对象的速度快,因为对象已经创建好了

缺点:占用内存

Spring容器创建对象,一次创建几个?

在创建容器对象时,会把配置文件中所有的对象都创建出来(Spring的默认规则),放到map里面

Spring只能创建service类吗?

不止能创建service类,也可创建其他对象

例如:

四:依赖注入DI

Spring 调用类的无参数构造方法,创建对象,对象创建后给属性赋值。

给属性赋值可以使用 ①xml配置文件中的标签和属性 ; ②使用注解。

DI分类:容器在调用无参构造器创建对象后,就需要给对象属性赋值,进行初始化。初始化是由容器自动完成的,称为注入:①set方法注入 ②构造方法注入

1、基于XML的依赖注入

在XML配置文件中使用标签和属性,完成对象创建,属性赋值。

1)set方法注入

    set 注入,也叫设值注入,通过 setter 方法传入被调用者的实例。这种注入方式简单、直观,因而在 Spring 的依赖注入中大量使用。
①:简单类型的set注入
<?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="dgsTestEntity" class="com.xinsteel.finance.api.entity.eo.DgsTestEntity">
        <property name="name" value="DGS"/>
        <property name="address" value="南京"/>
    </bean>
</beans>

image

②:引用类型的set注入
<?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="dgsTestService"   class="com.xinsteel.finance.api.service.DgsTestService">
        <property name="dgsTestEntity"  ref="dgsTestEntity"/> <!--和实体类的  setDgsTestEntity    方法-->
    </bean>
 
    <bean id="dgsTestEntity"    class="com.xinsteel.finance.api.entity.eo.DgsTestEntity">
        <property name="name" value="DGS"/>         <!--和实体类的  setName       方法-->
        <property name="address" value="南京"/>      <!--和实体类的  setAddress    方法-->
    </bean>
</beans>

image

2)构造方法注入

<?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">
    <!--
        <constructor-arg />标签中用于指定参数的属性有:
             name:指定参数名称。
             index:指明该参数对应着构造器的第几个参数,从 0 开始。不过,该属性
                不要也行,但要注意,若参数类型相同,或之间有包含关系,则需要保证赋值顺
                序要与构造器中的参数顺序一致
    -->
    <bean id="dgsTestService"   class="com.xinsteel.finance.api.service.DgsTestService">
        <constructor-arg name="name" value="DGS" index="0"/>
        <constructor-arg name="dgsTestEntity" ref="dgsTestEntity" index="1"/>
    </bean>
    <bean id="dgsTestEntity"    class="com.xinsteel.finance.api.entity.eo.DgsTestEntity">
        <property name="name"       value="DGS"/>         <!--和实体类的  setName       方法-->
        <property name="address"    value="南京"/>      <!--和实体类的  setAddress    方法-->
    </bean>
</beans>

image

3)引用类型属性自动注入

概念:Spring可以根据某些规则给引用类型完成赋值,只对引用类型有效,规则byName,byType

①:byName(按名称注入):java类中的引用类型属性名称和Spring容器中bean的id名称一样的,且数据类型也是一样的,这些bean能够赋值给引用类型,autowire="byName"。

<?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="dgsTestService"   class="com.xinsteel.finance.api.service.DgsTestService" autowire="byName">
        <property name="name" value="DGS"/>
    </bean>
    <bean id="dgsTestEntity"    class="com.xinsteel.finance.api.entity.eo.DgsTestEntity">
        <property name="name"       value="DGS"/>
        <property name="address"    value="南京"/>
    </bean>
</beans>
![image](/i/l/?n=22&i=blog/1880163/202210/1880163-20221003214619109-130546718.png)

②:byType(按类型注入):java类中引用类型的数据类型和Spring容器中bean的class值是同源关系的,这样的bean赋值给应用类型。autowire="byType"

<?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="dgsTestService"   class="com.xinsteel.finance.api.service.DgsTestService" autowire="byType">
        <property name="name" value="DGS"/>
    </bean>
    <bean id="dgsTestEntity"    class="com.xinsteel.finance.api.entity.eo.DgsTestEntity">
        <property name="name"       value="DGS"/>
        <property name="address"    value="南京"/>
    </bean>
</beans>

image

2、基于注解的DI

基于注解的DI:使用Spring提供的注解,完成Java对象创建,属性赋值

注解使用的核心步骤:

1、在源代码加入注解,例如@Component

2、在Spring的配置文件,加入组件扫描器的标签

<context:component-scan base-package="注解所在的包名"/>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
    <!--
        声明组件扫描器:使用注解必须加入这个语句
            component-scan:翻译过来是主键扫描器,组件是Java对象
            base-package:用到注解的包名(框架会扫描这个包和子包中所有的类,找类中的所有注解,遇到注解后,按照注解表示的功能,去创建对象,给属性赋值)
    -->
    <context:component-scan base-package="com.dgs"/>
</beans>

1)定义Bean的注解

    @Repository,@Service,@Controller 是对@Component 注解的细化,标注不同层的对象。即持久层对象,业务层对象,控制层对象。

① @Component
/i/ll/?i=d933aff48cd74ef3bdbb9753c221845e.png
注解包含一个属性:value,表示对象名称,等同于《bean》标签的id属性;

位置作用于类的上面,表示创建此类的对象;

注解不指定 value 属性,bean 的 id 是类名的首字母小写;
表示创建对象,将对象放到容器里面,和XML形式的标签作用一样;

② @Repository:放在 dao 接口的实现类上面,表示创建dao对象,持久层对象,能访问数据库
③ @Service :放在业务层接口的实现类上面,表示创建业务层对象,业务层对象有事务的功能
④ @Controller:放在控制类的上面,表示创建控制器对象,属于表示层对象。控制器对象能接受请求,把请求的处理对象显示给用户
2)简单类型属性注入@Value
属性:value 简单类型属性值

位置:①:在属性定义上面,无需set方法

       ②:在set方法的上面

image

3)引用类型属性注入

①:@Autowired

Spring框架提供的,给引用类型赋值的,使用自动注入原理。支持byName,byType.默认是byType

位置:①在属性定义的上面,无需set方法,推荐使用

       ②在set方法的上面

byName自动注入:

    ①@Autowired:给引用类型赋值

    ②@Qualifier(value = "bean的id"):从容器中找到指定名称的对象,把这个对象赋值给引用类型

②:@Resource

来自JDK,Spring支持这个注解的使用,是给引用类型赋值的,支持byName,byType,默认是byName

位置:①:在属性定义的上面,无需set方法,推荐使用

       ②:在set方法的上面

注意:使用jdk1.8带有@Resource注解,高于jdk1.8没有这个@Resource,需要加入一个依赖

<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.2</version>
</dependency>

标签:创建,控制,容器,对象,反转,Spring,赋值,IOC,属性
From: https://www.cnblogs.com/guozhiqiang/p/16751398.html

相关文章

  • 实验4:开源控制器实践——OpenDaylight
    基本要求Mininet拓扑生成并连接控制器的结果、Mininet中ping测试截图通过Postman工具调用OpenDaylight提供的API下发流表,实现拓扑内主机h1和h3网络中断10s个人总结......
  • 实验4:开源控制器实践
    一、实验目的能够独立完成OpenDaylight控制器的安装配置;能够使用Postman工具调用OpenDaylightAPI接口下发流表。二、实验环境Ubuntu20.04Desktopamd64三、实验......
  • 实验4:开源控制器实践——OpenDaylight
    一、实验目的能够独立完成OpenDaylight控制器的安装配置;能够使用Postman工具调用OpenDaylightAPI接口下发流表。二、实验环境Ubuntu20.04Desktopamd64三、实验......
  • 实验4:开源控制器实践——OpenDaylight
    实验4:开源控制器实践——OpenDaylight一、实验目的能够独立完成OpenDaylight控制器的安装配置;能够使用Postman工具调用OpenDaylightAPI接口下发流表。二、实验环境Ub......
  • 跳转控制语句goto和return
    goto:  基本语法: 例子:  其中,lable1称为标签,运行后,输出start和一个ok3一个ok4 return:此语句主要与函数有关,此处只简单提及如有需要请翻阅后续函数章节......
  • 实验4:开源控制器实践——OpenDaylight
    一、实验目的1.能够独立完成OpenDaylight控制器的安装配置;2.能够使用Postman工具调用OpenDaylightAPI接口下发流表。二、实验环境Ubuntu20.04Desktopamd64三、实......
  • 实验4:开源控制器实践——OpenDaylight
    一、实验目的1.能够独立完成OpenDaylight控制器的安装配置;2.能够使用Postman工具调用OpenDaylightAPI接口下发流表。二、实验环境Ubuntu20.04Desktopamd64三、实......
  • 实验4:开源控制器实践——OpenDaylight
    实验4:开源控制器实践——OpenDaylight一、实验要求(一)基本要求1.利用Mininet平台搭建下图所示网络拓扑,并连接OpenDaylight控制器;拓扑图:启动ODL然后打开浏览器访问htt......
  • 驱动开发:应用DeviceIoContro开发模板
    内核中执行代码后需要将结果动态显示给应用层的用户,DeviceIoControl是直接发送控制代码到指定的设备驱动程序,使相应的移动设备以执行相应的操作的函数,如下代码是一个经典的......
  • 权限控制菜单
    由于不同的用户拥有不同的权限,所以在前端页面左侧侧边栏中,当用户拥有指定的权限时,才显示指定的子菜单做1个监听器,监听到用户认证成功后,则获取该用户拥有的权限,重新封装1个Sy......