一、什么是IOC
- Inversion of Control 控制反转. 指的是对象的创建权反转(交给)给 Spring 管理,想要让Spring帮我们管理对象,前提是将对象交由Spring来创建。
- DI(依赖注入)是其一种实现方式。
- 目的:创建对象并且组装对象之间的关系。
二、什么是Spring Bean
凡是需要SpringIOC容器所管理的Java类,统称为Spring Bean。
Bean的配置项:
- Id:这个Bean的唯一标识
- class:具体要实例化的那一个类
- Scope:范围,作用域
- Constructor arguments:构造器的参数(构造器注入)
- properties:属性(设值注入)
- Autowiring mode:自动装配的模式
- lazy-initialization mode:懒加载的模式
- Initialization/destruction method:初始化和销毁的方法
我们在使用时,理论上只有class是必须的,其他都可以不配置,但是为了获取方便,一般也需要配置id。
Bean的作用域:
- singleton:单例,指的是一个Bean容器只存在一份,IOC容器每次返回的是同一个Bean实例。
- prototype:使用该属性定义Bean时,IOC容器可以创建多个Bean实例,每次返回的都是一个新的实例。
- request:该属性仅对HTTP请求产生作用,使用该属性定义Bean时,每次HTTP请求都会创建一个新的Bean,适用于WebApplicationContext环境。
- session:该属性仅用于HTTP Session,同一个Session共享一个Bean实例。不同Session使用不同的实例。
- 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的三种配置方式
- XML声明配置
- 注解声明配置 (推荐)
- 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();
}
}
- @Bean标识一个用于配置和初始化一个由SpringIoC容器管理的新对象的方法,类似于xml配置文件的<bean/>
- 可以在spring的@Component注解的类中使用@Bean注解任何方法。
- 上一点中,通常用的是@Configuration