Spring IOC详解

一、什么是IOC

  • Inversion of Control 控制反转. 指的是对象的创建权反转(交给)给 Spring 管理,想要让Spring帮我们管理对象,前提是将对象交由Spring来创建。
  • DI(依赖注入)是其一种实现方式。
  • 目的:创建对象并且组装对象之间的关系。

 二、什么是Spring Bean

凡是需要SpringIOC容器所管理的Java类,统称为Spring Bean。

Bean的配置项:

  1. Id:这个Bean的唯一标识
  2. class:具体要实例化的那一个类
  3. Scope:范围,作用域
  4. Constructor arguments:构造器的参数(构造器注入)
  5. properties:属性(设值注入)
  6. Autowiring mode:自动装配的模式
  7. lazy-initialization mode:懒加载的模式
  8. Initialization/destruction method:初始化和销毁的方法
     

我们在使用时,理论上只有class是必须的,其他都可以不配置,但是为了获取方便,一般也需要配置id。

 Bean的作用域:

  1. singleton:单例,指的是一个Bean容器只存在一份,IOC容器每次返回的是同一个Bean实例。
  2. prototype:使用该属性定义Bean时,IOC容器可以创建多个Bean实例,每次返回的都是一个新的实例。
  3. request:该属性仅对HTTP请求产生作用,使用该属性定义Bean时,每次HTTP请求都会创建一个新的Bean,适用于WebApplicationContext环境。
  4. session:该属性仅用于HTTP Session,同一个Session共享一个Bean实例。不同Session使用不同的实例。
  5. global-session:该属性仅用于HTTP Session,同Session作用域不同的是,所有的Session共享一个Bean实例。
     

 Bean的生命周期:

  • 定义:就是在XML配置文件中配置了这个bean的id,class等
  • 初始化:spring启动并加载配置文件里的bean
  • 使用:通过配置文件取出bean并使用
  • 销毁:回收bean容器中这个bean的所有实例

Bean的自动装配: 

Spring引入Autowire(自动装配)机制就是为了解决<bean>标签下<property>标签过多的问题,<property>标签过多会引发两个问题:

  • 如果一个Bean中要注入的对象过多,比如十几二十个(这是很正常的),那将导致Spring配置文件非常冗长,可读性与维护性差
  • 如果一个Bean中要注入的对象过多,配置麻烦且一不小心就容易出错

因此,为了解决使用<property>标签注入对象过多的问题,Spring引入自动装配机制,简化开发者配置难度,降低xml文件配置大小。

使用Autowire去除<property>标签

下面来看一下使用Autowire去除<property>,autowire有两处点:

  • 可以配置在<beans>根标签下,表示对全局<bean>起作用,属性名为default-autowire
  • 可以配置在<bean>标签下,表示对当前<bean>起作用,属性名为autowire

通常都是在<beans>根标签下配置自动装配比较多,default-autowire有四种取值:

  • No: 不做任何操作

  • byName:根据属性名自动装配。此选项将检查容器并根据名字查找与属性完全一致的bean,并将其与属性自动装配

  • byType:如果容器中存在一个与指定属性类型相同的bean,那么将该属性自动装配;如果存在多个类型bean,那么抛出异常,并指出不能使用byType方式进行自动装配;如果没有找到相匹配的bean,则什么事都不发生

  • Constructor:与byType方式类似,不同之处在于它应用于构造器参数。如果容器中没有找到与构造器参数类型一致的bean,那么抛出异常

这里研究的是去除<property>标签,因此第一种不管;constructor装配不太常用,因此这里也不管,重点看最常用的byName与byType,至于具体使用哪种根据自己的业务特点进行相应的设置。

byName意为在spring配置文件中查询beanName与属性名一致的bean并进行装配,若类型不匹配则报错;

byType意为在spring配置文件中查询与属性类型一致的bean并进行装配,若有多个相同类型则报错。

 

三、 Spring Bean的三种配置方式

  1. XML声明配置
  2. 注解声明配置 (推荐)
  3. JavaConfig声明配置 (推崇)

XML申明配置:

 顾名思义,就是将bean的信息配置.xml文件里,通过Spring加载文件为我们创建bean。现在很SSM的项目里,都将第三方类库或者一些配置工具类都以这种方式进行配置,主要原因是由于第三方类不支持Spring注解。但其实更好的方式是通过JavaConfig的方式进行声明。

      优点: 可以使用于任何场景,结构清晰,通俗易懂

      缺点: 配置繁琐,不易维护,枯燥无味,扩展性差

注解声明配置:

通过在类上加注解的方式,来声明一个类交给Spring管理,Spring会自动扫描带有@Component,@Controller,@Service,@Repository这四个注解的类,然后帮我们创建并管理,前提是需要先配置Spring的注解扫描器。

 优点:开发便捷,通俗易懂,方便维护。

缺点:具有局限性,对于一些第三方资源,无法添加注解。只能采用XML或JavaConfig的方式配置

JavaConfig声明配置:

将类的创建交给我们配置的JavcConfig类来完成,Spring只负责维护和管理,采用纯Java创建方式。其本质上就是把在XML上的配置声明转移到Java配置类中

      优点:适用于任何场景,配置方便,因为是纯Java代码,扩展性高,十分灵活

      缺点:由于是采用Java类的方式,声明不明显,如果大量配置,可读性比较差

举个栗子:

1、创建一个配置类 , 添加@Configuration注解声明为配置类

2、创建方法,方法上加上@bean,该方法用于创建实例并返回,该实例创建后会交给spring管理,方法名建议与实例名相同(首字母小写)。注:实例类不需要加任何注解

3、加载配置类(类似于之前加载application.xml配置文件)


@Configuration
public class BeanConfig {
 
	@Bean
	public User user() {
		return new User();
	}
}
  1. @Bean标识一个用于配置和初始化一个由SpringIoC容器管理的新对象的方法,类似于xml配置文件的<bean/>
  2. 可以在spring的@Component注解的类中使用@Bean注解任何方法。
  3. 上一点中,通常用的是@Configuration

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值