Spring中的IOC与DI学习笔记

  • 本篇文章主要记录自学java期间,学习IOC与DI汇总。

IOC汇总

1.什么是IOC?

IOC全名为Inversion of Control(控制反转),它是一种设计思想,是将自己所设计好的对象交给一个容器处理,也相对减少了开发时创建对象的一些重复性代码和内存消耗,以及降低了耦合度。通俗来讲,是将new一个新对象的过程交给容器进行操作。

2.IOC包括哪些具体内容?

1.首先我们需要导入jar包:
Spring中的IOC与DI学习笔记
2.开始创建目标类
Spring中的IOC与DI学习笔记

通常在使用到spring容器时,属性基本都得有set方法。

3.装配bean
(1)装配bean基于xml文件
Spring中的IOC与DI学习笔记
配置好xml文件后,在xml文件中通过bean标签获取到目标类。
Spring中的IOC与DI学习笔记
class后是实现类的全限定类名。

  • 测试获取到的目标类对象
    测试类通过ApplicationContext对象,利用其getBean(“目标类id’”)方法来获取到目标类对象
    Spring中的IOC与DI学习笔记
    点击run进行测试,显示了实现类的方法spring创建对象成功。
    Spring中的IOC与DI学习笔记
    (2)装配bean基于注解
    注解方式:直接在实现类上直接使用@注解名称,替代xml文件的装配bean的方式。
    Spring中的IOC与DI学习笔记
    注解名称设置好后,需要在xml配置文件中告诉spring容器是以注解方式装配的bean。
    Spring中的IOC与DI学习笔记即将原来的bean标签替代为context:component-scan标签,表示spring以扫描的方式进行装配。
    注解名称分类:
    @Component(“id名称”)取代<bean id="" class="">
    Component在web开发中有3个衍生注解,取代<bean id="" class="">
    @Repository:dao层;
    @Service:service层;
    @controller:web层;
    用法与Component一样。

  • 测试与基于xml文件装配一样

DI汇总

1.DI简介

DI—Dependency Injection,即“依赖注入”。
依赖:一个对象需要另外一个对象。
注入:通过setter方法对一个对象注入另一个对象的实例设置。

2.DI具体内容

1.创建xml配置文件
Spring中的IOC与DI学习笔记
2.提供目标类。
Spring中的IOC与DI学习笔记
Spring中的IOC与DI学习笔记
我们会发现创建的service类是需要dao类的方法,所以此时我们需要使用到spring的DI依赖注入。
模拟spring容器的执行过程:

  • 创建service实例 UserService:userservice = new UserService();-----------IOC操作

  • 创建dao实例 UserDAO:userdao = new UserDAO();---------------------------IOC操作

  • 将dao设置给service:userservice.setUserDAO();-------------------------------DI操作
    (1)基于xml文件的DI操作。
    根据spring的执行过程在xml文件进行装配:Spring中的IOC与DI学习笔记

  • 进行测试
    开始运行测试类
    Spring中的IOC与DI学习笔记
    最后显示userservice对象所注入的userdao对象里show方法,表示DI操作成功。Spring中的IOC与DI学习笔记
    (2)基于注解的DI操作

  • 首先我们先使用注解方式代替IOC操作,即bean标签的作用。
    在我们需要创建对象的类上添加注解(使用@Component也可以,下面注解都是它的衍生注解):
    Spring中的IOC与DI学习笔记
    Spring中的IOC与DI学习笔记

  • 然后使用注解方式替代DI依赖注入。
    在需要注入对象的类里找到要注入的属性对象上添加注解:
    普通值注入(就像是初始化普通变量一样,类似赋值):直接在属性上添加@value(“ ”)
    Spring中的IOC与DI学习笔记
    引用某个对象注入添加注解有两种方式:

    • 直接在属性上添加
      @Autowired
      @Qualifier(“id名称”)
      Spring中的IOC与DI学习笔记
  • 直接在属性上添加

    @Resource(name=“id名称”)
    Spring中的IOC与DI学习笔记

  • 注解方式测试
    与IOC注解测试一样,直接在xml配置文件中利用context:component-scan标签扫描添加了注解的包。
    Spring中的IOC与DI学习笔记
    最后运行测试类,若显示userservice对象所注入的userdao对象里show方法,表示DI注解方式成功。

关于spring中bean标签的三种实例化方式

bean标签的三种实例化方式:默认构造,静态工厂,实例化工厂。
1.默认构造

  • 我们常用的<bean id="" class=""></bean>这中方式就是默认构造。
  • 即在配置好的xml文件中,利用对象的全限定类名,spring容器就可以实例化出对象。

2.静态工厂

  • 创建一个静态工厂实现类,我们需要创建的对象,都用静态工厂的实现类创建静态方法返回一个对象的方式获取到对象。
  • 然后在配置好的xml文件中利用bean标签实例化一个静态工厂,以此来获取到想要的对象
    Spring中的IOC与DI学习笔记
    此时工厂获取到的就是factory-method指向方法返回的对象Category。

3.实例化工厂

  • 与静态方法不同的是,实例化工厂的实现类不是以静态方法去创建对象再返回。每次它都是返回的一个新对象。
  • 同样在xml文件利用bean标签去实例化工厂来获取对象。具体配置如下:
    Spring中的IOC与DI学习笔记

总结

  • 我们在平时开发中需要对象时都是自己直接去new一个,需要哪个就new哪个,当一个对象需要依赖另一个对象进行使用时,我们也是将两个对象分别new出来,然后手动注入,这样就会使两个对象的耦合度高了,因为需要的时候我们才会new出来。然而当我们使用spring的IOC与DI操作时,spring容器时一直存放着对象,并不会去关心对象什么时候创建,只要拿出来能用即可,所以当我们的一个对象需要依赖另一个对象时,只需要从容器拿出这两个对象进行注入使用就行。
  • IOC与DI 在开发中也能让所有对象都能在spring容器进行管理,起到一定程度的板块管理。
  • 静态工厂与实例化工厂本质区别就在于作用域不同,静态工厂不管实例化多少次,获取到的对象都是同一个,类似于单例模式;实例化工厂则是多例模式,每次获取到的实例对象都是新的对象。