Spring——IoC容器

Spring IoC容器

1.思想

bean对象的创建、依赖关系交给Ioc容器来管理,无需手动new对象,方便解耦,便于开发。

2.IoC容器

Spring容器的最顶层接口是BeanFactory,实际开发中常用ApplicationContext

两个接口的区别:

  • ApplicationContext:立即加载。读取配置文件后马上创建对象放入容器。
  • BeanFactory:延迟加载。什么时候根据id获取对象,什么时候才真正创建对象。

ApplicationContext的三个常用实现类

  • ClassPathApplicationContext:加载类路径下的配置文件。

  • FileSystemXmlApplicationContext:加载磁盘任意路径下的配置文件。

  • AnnotationConfigApplicationContext:读取注解 创建容器。

3.Bean

1.创建bean的三种方式

  1. 使用默认的无参构造器(如果没有无参构造器,则报错)
  2. 使用静态工厂的静态方法创建对象
  3. 使用实例工厂的方法创建对象

2.bean对象的生命周期

  1. 单例
    • 出生:当容器创建时对象出生
    • 活着:只要容器还在,对象一直活着
    • 死亡:容器销毁,对象消亡
    • 总结:单例对象的生命周期与容器相同
  2. 多例
    • 出生:使用对象时才创建(延迟加载)
    • 活着:对象只要在使用过程中就一直活着
    • 死亡:当对象长时间不用且无其他对象引用时,由GC回收

3.依赖注入

依赖关系的管理交给Spring来维护在当前类需要用到其他类的对象时,由Spring为我们提供,只需在配置文件中说明。

依赖注入的数据有三类:

  1. 基本类型和String
  2. 其他bean类型(在配置文件中或注解中配置过的bean)
  3. 复杂类型(集合类型)

注入的方式有三种:

  1. 使用构造方法
  2. 使用set方法
  3. 使用注解

4.常用注解

  1. 用于创建对象的注解(作用类似于bean标签)
  • @Component

作用:写在类之前,把当前类的对象注入到容器中

属性:value 指定bean的id 默认值是当前类名首字母改为小写

  • @Controller:一般用在表现层

  • @Serive:一般用在业务层

  • @Repository:一般用在持久层

    以上三个注解的作用与属性和Component一样,
    他们三个是Spring框架提供的明确的三层使用的注解,使三层对象更加清晰。


  1. 用于注入数据的注解(作用相当于properties标签)
  • @Autowired:

    作用:自动按照类型注入。只要容器中有唯一的一个bean对象类型和要注入的变量类型匹配,就可以注入成功

    使用的位置:变量上或方法上

    注意:如果容器中没有任何bean的类型匹配,则报错。
    如果容器中有多个bean的类型和要注入的变量类型匹配,如果要注入的变量名称和beanid相匹配,则注入之,否则报错。
    另外,使用注解的方法注入时,set方法不是必须的

  • @Qualifier

    作用:在按照类中注入的基础上再按名称注入。

    注意:它给类成员注入时不能单独使用,必须和Autowired配合使用,但是在给方法参数注入时可以单独使用。

    属性value 用于指定注入beanid

  • @Resource

    作用:直接按照bean的id注入,可以独立使用,不需要再和Autowired一起使用

    属性:name 用于指定注入beanid

    注意:以上三个注解只能注入其他bean类型的数据,而基本类型和String类型无法使用上述注解

另外,集合类型注入只能使用xml

  • @Value

    作用:用于注入基本类型和String类型的数据

    属性value:用于指定数据的值

    它可以使用Spring中的SpELSpEL写法:${表达式}


  1. 一些和配置有关的注解
  • 可以使用配置类以代替bean.xml配置文件的作用

  • @Configuration

    作用:指定当前类是一个配置类

    细节:当配置类作为AnnotationConfigApplicationContext对象创建的参数时,可以不写。

  • @ComponentScan

    作用:指定创建容器时要扫描的包

  • @Bean

    作用:用在方法前,将方法的返回值作为bean对象存入IoC容器

    属性name 用于指定beanid 默认值为当前方法名

    细节:使用注解配置方法时,如果方法有参数,Spring框架会去容器中查找是否有该类型的bean,查找方式和Autowired相同

  • @Import

    作用:用于导入其他配置类

    属性value 用于指定其他配置类的字节码

  • @PropertySource

    作用:用于指定properties文件的位置

    属性value 指定文件名称和路径
    关键字classpath表示类路径下