Spring核心1----IoC控制反转、di技术、依赖注入、反射机制

一、基础理论和思想

  1、IOC Inversion of Control 控制反转

      控制:创建对象,对象属性赋值和对象之间关系管理

      反转:将创建对象的权限给代码之外的容器实现,由容器代替开发人员管理对象,创建对象及                  赋值

      正转:由开发人员在代码中通过new构造方法的方式创建对象,开发人员主动管理对象

  2、作用

         将对象的创建、赋值、管理工作都交给代码之外的容器实现

        减少对代码的改动,也能实现不同的功能,实现解耦合,对象的管理更松散

3、实现--di依赖注入

(1)    DI(Dependency Injection):依赖注入

              只需提供对象名称即可,通过对象名使用该对象

              至于对象如何创建,赋值,查找都是由容器内部实现

(2)spring使用di实现IOC功能

         底层创建使用的是反射机制(详见重点专栏,文尾链接)

         属性赋值利用的是依赖注入set 注入、构造注入、注解方式

4、spring默认创建对象的时间

  •     创建spring容器时,会创建配置文件中的所有对象
  •      spring创建对象时,默认调用无参构造函数

5、Spring的IoC容器初始化

(1)基于xml--applicationContex.xml

   <1>创建容器

  • 创建xml文件时,构造方法先调用父类构造方法为容器设置好Bean资源加载器
  •                                          再调用父类setConfigLoactions方法设置Bean配置信息的定位路径
  • 调用父类的refresh方法启动整个IoC容器载入Bean定义

<2>加载Bean配置资源

  • 通过loadBeanDefinitions方法:首先调用调用资源加载器的方法获取要加载的资源
  •                                                    真正执行加载过程
  • 加载过程:解析配置文件路径---读取配置文件内容--xml解析器将Bean信息转成文档对象---解析文档对象---存储在IoC容器的hashMap集合中(key 字符串,值 BeanDefinition)

  [注]加载注册过程用synchronized保证线程安全

(2)基于注解

   法1:  直接将注解Bean注册到容器中

   法2:通过扫描指定的包对所有类进行处理---指定自动扫描路径(用的多)

二、IOC的实现---di技术

1、属性赋值的两种方式:

(1)XML的di实现:在spring的配置文件中,使用bean标签和属性完成对象赋值

(2)注解的di实现:使用spring注解,完成对象属性的赋值

     【对象注入】

         @Autowired  按类型自动注入

         @Resource  按Bean的id注入,只能注入Bean类型

         @Qualifier  按类型自动注入的基础上,在按Bean的id注入

    【数据类型和String类型】

          @Value  

2、依赖注入的分类

    (1)set注入:Spring调用类中属性的set方法,在set方法可以实现属性的赋值(80%使用set注入)

 (2)构造注入:Spring调用有参构造方法,创建对象,在构造方法中完成赋值

3、依赖注入过程

  • 通过getBean方法获取Bean实例
  • 该方法调用doGetBeanIoC容器中获取bean
  • 通过createBean方法创建bean对象
  • 再通过CreateBeanInstance方法创建Java对象PopulateBean方法对bean属性注入

   getBean ---->doGetBean-----> createBean ----> CreateBeanInstance+PopulateBean

    获取Bean实例-----创建bean对象-----创建java对象-----bean属性输入

4、Bean的生命周期

(1)IoC的初始化:对Bean定义完成资源定位、加载读取配置文件xml

                                解析bean信息,并将其存储在一个HashMap中

(2)对Bean实例进行创建和通过依赖注入对属性赋值----bean达可用状态

  (3)Bean对象使用完成后,调用destroy方法销毁

5、Bean的作用范围---scope指定

  • singleton单例模式--无论收到多个个Bean亲求,每个容器只有一个唯一的Bean实例
  • prototype原型模式--每次Bean请求都会创建一个新的实例
  • request:每次HTTP请求都会创建一个新的Bean并将其放在request域中
  • session:同request,每个session中都有一个Bean实例(对象)
  • global session:公用全局存储变量

三、xml属性注入-----spring配置文件中(applicationContex.xml)

(一)set注入---bean节点+property  

<bean id="对象名" class="类路径">
    <property name="属性名" value="一般数据类型属性值"/>
     <property name="属性名" ref="引用属性值"/>
</bean>

1、一般数据类型 

2、引用数据类型

(二)构造注入---bean节点+constructor-arg

<bean id="对象名" class="类路径">
    <constructor-arg name="属性名" value="一般数据类型属性值"/>
    <constructor-arg name="属性名" ref="引用属性值"/>
</bean>

1、通过name属性注入

2、通过index注入(属性在类中的声明顺序)

3、注入文件对象 

     parent:文件夹路径

     child:文件夹中文件

(三)引用类型的自动注入

<bean id=""  class="" autowire="byName/byType">
   简单类型属性手动赋值
</bean>

  1、byName -----autowire="byName "

  2、byType -----autowire="byType"

 

四、注解方式属性赋值

1、实体类

   (1)类上----@Component("student") 声明一个student对象

                  -----@Bean    注入第三方没有源码的类对象

    (2)属性

             一般属性:@value(value=”张三“)

            引用类型属性:@Autowire   默认byType自动注入

2、持久层

     dao层接口实现类上(daoImpl)-----@Reponsitory("studentDao")

3、业务层

    service接口上------@Service("studentService")

4、控制层

  controller类上-----@Controller

详述 反射机制---创建对象、操作属性和方法_@snow'的博客-CSDN博客

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值