Spring所依赖的两个核心概念,一个是控制翻转(IoC),另一个是面向切面编程(AOP)。IOC是一种通过描述来生成或获取对象的技术,Spring是通过描述来创建对象的。在Spring中把每个需要管理的对象称为Spring Bean(简称Bean),而Spring管理这些Bean的容器被称为Spring IoC容器(简称IoC容器)。IoC容器需要具有两个基本的功能:
- 通过描述管理Bean,包括发布和获取Bean
- 通过描述完成Bean之间的依赖关系
在Spring的定义中,所有的IoC容器都需要实现BeanFactory接口,他是一个顶级容器接口。在这个接口中提供了很多getBean重载的方法,他是从IoC容器中获取Bean的方法。还提供的方法有isSingleton,判断bean是不是单例,默认情况下,bean都是以单例存在的,也就是使用getBean方法返回的都是同一个对象,其他的方法有isPrototype,与isSingleton方法相反,每当使用getBean方法获取Bean的时候,容器就会创建一个新的Bean返回给调用者。
在BeanFactory的基础上,还设计了一个更加高级的接口ApplicationContext,他是beanfactory的子接口之一。在实际使用中大部分springIOC容器是applicationContext接口的实现类,如AnnotationConfigApplicationContext()
注解
- @Configuration 用在类上,代表这是一个Java配置文件,Spring对的容器会根据他来生成IOC容器区装配bean
- @Bean 用在方法上,代表将方法返回的pojo装配到IOC容器中,而其属性name定义这个bean的名称,如果没有配置他,则将方法名称作为bean的名称保存到springioc容器中
- @Component 用在类上,标明哪个类被扫描进入springIOC容器
- @Value 用在属性上,指定具体的值
- @ComponentScan 标明采用何种策略去扫描装配bean,用在类上,只会扫描类所在的当前包和其子包。可以通过配置项basePackage定义扫描的包名,在没有定义下,只会扫描当前包和其子包下的路径;还可以通过basePackageClasses定义扫描的类;includeFilters是定义满足过滤器(Filter)条件的bean才去扫描,excludeFilter则是排除过滤器条件的bean,都需要@Filter去定义,他有一个type类型
- @Autowired 最基本的一条是根据类型找到对应的bean进行注入,如果对应的bean不是唯一的,那么他会根据其属性名称和bean的名称进行匹配。如果匹配得上,就会使用该bean;如果还无法匹配,就会抛出异常
- @Primary 用在类上,修改优先权,当一个bean有多个实现类时,@Primary定义的类优先注入,但当实现类都用Primary定义时,容器就无法采用哪个bean的实例进行注入,这时可用@Qualifier,他的配置项value需要一个字符串去定义,他将@Autowired组合在一起,通过类型和名称一起找到bean
生命周期
bean的生命周期大致分为:bean的定义、bean的初始化、bean的生存期、bean的销毁4个部分
作用域
singleton:默认值,IOC容器只存在单例
prototype:每当从IOC容器中取出一个bean,则创建一个新的bean
session:HTTP会话
application:web工程生命周期
request:一次请求
globalsession:在一个全局的HTTP session中,一个bean定义对应一个实例。基本不使用
@Scope:定义生命周期
@Profile
可以在各个环境之间实现切换
假设存在两个数据库,dev_spring_boot和test_spring_boot,这样可以用注解@Profile定义两个bean如下:
@Profile(“dev”)、@Profile(“test”)
在Java启动项目中,只需要如下配置就能够启动Profile机制