- Spring Ioc容器 注册Bean对象的方式:(ioc来实例化,注入依赖关系,管理bean对象)
- 利用类注解
@Controller :
@Service:
@Repository
@Component
@Configuration
常见的就这集中类注解注册Bean对象
- 利用方法注解
@Bean
注意:类注解产生的是单例的Bean对象,方法注解可以产生多个Bean对象
获取Bean对象,利用
传入bean id 就是类名或者方法名,类名的首字母小写
或者传入类的class对象,这个要求ioc容器中只有一个当前类的对象
- 装配注入/依赖注入
Bean对象中的属性需要依赖其它的Bean对象 注入到属性中
一般@Contoller注册的Bean对象中的属性是@Service注册的Bean对象然后其中有包括@Repository注解的类的属性,将service注册的对象注入Controller中,service中注入Repository对象。这些注册到ioc容器中包括装配注入属性都是Springioc容器做的
一般都是一个Contorller注解的类中完成http请求和响应处理 然后注入Service注解的类对象完成业务逻辑处理,其中service又调用repository处理数据库的crud操作。
实现方式:
- 属性注入:把其它的Bean对象注入到自己的成员变量中(利用Autowired注解(自动接线的))
- 构造注入:利用构造方法注入对应的依赖关系(本质还是属性注入,注入给了构造方法的参数,然后又传递给属性)
还可以使用@Resourse注解。@Autowired是Spring框架提供的,Resource是jdk提供的
如果注入的类型在ioc容器中又多个Bean对象,怎么注入?
注入的变量名称可以是对应的bean id值最简单
- Bean的作用域
Bean的五种作用域
默认的scope(范围的意思)是singleton(单例注册表的方式实现) :Bean在ioc 中只有一个实例
prototype(原型的)每次注入的都是新建的对象
request:每次http请求都会创建一个新的bean,适用于webApplicationContext
session:一个会话的范围,一个httpsession定义一个
globalsession:全局的httpsession定义一个bean
- Bean的生命周期
1.容器启动,会对非懒加载的bean进行实例化,分配空间。
@Lazy注解标注会将这个类的bean设置为懒加载,启动时不会立即创建实例,需要使用的时候才初始化,可以节省系统启动的时间和资源开销。
2.设置属性。Bean的注入和装配,注入所有的属性。
3.Bean的初始化:
实现各种Aware通知方法,BeanNameAware,BeanFactoryAware,ApplicationContextAware
第一个会调用setBeanName方法传入该Bean的id就可以获取该Bean id
SetBeanFactory 传入BeanFactory
setApplicationContext 传入ApplicationContext
如果实现了BeanpostProcessor 接口会调用接口的postProcessBforeInitialzation 方法初始化前置方法
初始化方法:如果有配置的指定的init-method方法,还可以执行@Postconstruct 初始化方法
执行初始化后置方法 BeanPostProcess,接口中的 postprocessAfterInitlzation方法
4.使用bean,对于scope为singleton的bean,springioc只有一份实例,而prototype的bean每次调用都会new新对象,生命周期会交给调用放管理,不是spring容器
5.销毁:容器关闭,如果bean实现了DisposableBean接口,会调用接口的destroy方法
如果有配置的destroy-method方法,会执行配置的方法。
配置方法在配置注解的类中,注册bean对象,完成配置,比如上述的配置了initmethod
和destroymethod