/*
* bean的生命周期:
* 1:构造(对象创建)
* 单实例:在容器启动时创建对象
* 多实例:在每次获取bean时创建对象
* 2:初始化:
* 对象创建完成并赋好值后初始化
* 指定初始化和销毁的方法:
* 2.1:通过@Bean(initMethod="方法名",destroyMethod="方法名"),
* 这里的initMethod等同于配置文件xml中的init-Method方法,destroyMethod等同于配置文件xml中的destroy-Method方法
* 2.2:通过bean实现接口InitializingBean(定义初始化逻辑):afterPropertiesSet()方法,
* 实现接口DisposableBean(定义销毁逻辑):destroy()方法
* 2.3:使用JSR250:
* 使用方式:标注在方法上
* @PostCorstruct:在bean创建完成并属性赋值后执行初始化方法
* @ProDestroy:在容器销毁bean之前通知我们进行清理工作
* 2.4:使用spring提供的接口BeanPostProcessor(后置处理器):
* 在bean的初始化前后进行一些处理工作:
* @postProcessBeforeInitialization:在初始化之前处理工作
* @postProcessAfterInitialization:在初始化之后处理工作
*
* 3:销毁:
* 单实例:在关闭容器时销毁对象
* 多实例:不管理对象的销毁
*/
/*
* 容器的赋值的方式:
* 使用@Value:等同于配置文件xml中的<property name="name"
value=“赋值的内容”>
* 1.1:常用的:@Value("赋值的内容")
* 1.2:使用SPEL表达式:@Value("#{赋值的内容}")
* 1.3:使用${}取出配置文件的值
* 1.3.1:加载xxx.properties配置文件:
* @PropertySource(value="classpath:配置文件的名称"):等同于配置文件xml中的<context:property-placeholder
location=“xxx.properties”/>
* 1.3.2:使用${}取出配置文件中的值,如:${properties.name}
*/
/*
* 自动装配的方式:
* spring利用依赖注入(DI)来实现对IOC容器中各个组件的依赖关系赋值
* 1:@Autowired:常用,
* 1.1:优先按照类型去IOC容器中找到对应的组件并赋值
* 1.2:如果找到多个相同的类型,再将属性的名称做为id去IOC容器中查找
* 1.3:配合使用@Qualifier(value="组件ID或名称"),明确的指导通过这个组件ID去IOC容器中查找
* 1.4:注意:自动装配默认必须将属性赋值好,没有就会报错
* 1.5:如果不想报错,可以使用@Autowired(required=false):将它变成不必须的,没有时就不报错,返回空
* 1.6:如果不想使用@Qualifier来明确指定,那么可以使用:
* @Primary:让spring进行自动装配时,默认使用首选的bean(优先装配)
* 注意:当使用@Qualifier明确指定时,@Primary无效
* 2:@Resource,@Inject;(java规范的注解):
* 2.1:@Resource:JSR250:
* 2.1.1:虽然能跟@Autowired一样实现自动装配,但只能通过名称去IOC容器查找,没有能支持@Primary和@Autowired(required=false)的功能
* 2.2:@Inject:JSR330:要使用这个注解,还需要导入一个jar包依赖:javax.inject.jar
* 2.2.1:虽然能跟@Autowired一样实现自动装配,但是没有能支持@Autowired(required=false)的功能
*
* 自动装配的实现原理的一部分:
* AutowiredAnnotationBeanPostProcessor:解析完成自动装配功能
*
* @Autowired:使用的方式:
* 因为@Autowired的目标是@Target({ElementType.CONSTRUCTOR, ElementType.METHOD,
ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
* 所以它能标识在:构造函数(CONSTRUCTOR),普通方法(METHOD),参数(PARAMETER),场(FIELD),类(ANNOTATION_TYPE)
* 不管标识在哪个地方,都是从容器中获取对象,都是一样的
*
* 3:自定义的组件想要使用spring容器底层的一些组件(比如ApplicationContext,BeanFactory,xxx...等等),
* 那么可以通过实现(ApplicationContextAware,BeanFactoryAware,xxxAware等等)
*/