注解
Autowired
Configuration
Bean
给容器中注册一个Bean;类型为返回值的类型,id默认是用方法名作为id
ComponentScan
Service
Controller
@Controller用于标注控制层组件(如struts中的action)
Repository
@Repository用于标注数据访问组件,即DAO组件
Component
@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
Value
- 基本数值
- 可以写SpEL; #{}
- 可以写${};取出配置文件【properties】中的值(在运行环境变量里面的值)
PropertySource
使用@PropertySource读取外部配置文件中的k/v保存到运行的环境变量中;加载完外部的配置文件以后使用${}取出配置文件的值
Scope
- 调整作用域
_
- prototype:多实例的:ioc容器启动并不会去调用方法创建对象放在容器中。每次获取的时候才会调用方法创建对象
- singleton:单实例的(默认值):ioc容器启动会调用方法创建对象放到ioc容器中。以后每次获取就是直接从容器(map.get())中拿,
- request:同一次请求创建一个实例
- session:同一个session创建一个实例
Lazy
- 懒加载
- 单实例bean:默认在容器启动的时候创建对象;
懒加载:容器启动不创建对象。第一次使用(获取)Bean创建对象,并初始化;
Conditional
按照一定的条件进行判断,满足条件给容器中注册bean
- 如果系统是windows,给容器中注册(“bill”)
- 如果是linux系统,给容器中注册(“linus”)
小结
给容器中注册组件
- 包扫描+组件标注注解(@Controller/@Service/@Repository/@Component)[自己写的类]
- @Bean[导入的第三方包里面的组件]
- @Import[快速给容器中导入一个组件]
- @Import(要导入到容器中的组件);容器中就会自动注册这个组件,id默认是全类
- ImportSelector:返回需要导入的组件的全类名数组;*
- ImportBeanDefinitionRegistrar:手动注册bean到容器中
- ImportBeanDefinitionRegistrar:手动注册bean到容器中
- 使用Spring提供的 FactoryBean(工厂Bean)
- 默认获取到的是工厂bean调用getObject创建的对象
- 要获取工厂Bean本身,我们需要给id前面加一个&
bean的生命周期:
bean创建—-初始化——销毁的过程
容器管理bean的生命周期;
我们可以自定义初始化和销毁方法;容器在bean进行到当前生命周期的时候来调用我们自定义的初始化和销毁方法
构造(对象创建)
单实例:在容器启动的时候创建对象
多实例:在每次获取的时候创建对象\
BeanPostProcessor.postProcessBeforeInitialization
初始化:
对象创建完成,并赋值好,调用初始化方法.
BeanPostProcessor.postProcessAfterInitialization
销毁:
单实例:容器关闭的时候
多实例:容器不会管理这个bean;容器不会调用销毁方法;
遍历得到容器中所有的BeanPostProcessor;挨个执行beforeInitialization,
一但返回null,跳出for循环,不会执行后面的BeanPostProcessor.postProcessorsBeforeInitialization
BeanPostProcessor原理
populateBean(beanName, mbd, instanceWrapper);给bean进行属性赋值
initializeBean
{
applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
invokeInitMethods(beanName, wrappedBean, mbd);执行自定义初始化
applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
}
1)、指定初始化和销毁方法;
通过@Bean指定init-method和destroy-method;
2)、通过让Bean实现InitializingBean(定义初始化逻辑),
DisposableBean(定义销毁逻辑);
3)、可以使用JSR250;
@PostConstruct:在bean创建完成并且属性赋值完成;来执行初始化方法
@PreDestroy:在容器销毁bean之前通知我们进行清理工作
4)、BeanPostProcessor【interface】:bean的后置处理器;
在bean初始化前后进行一些处理工作;
postProcessBeforeInitialization:在初始化之前工作
postProcessAfterInitialization:在初始化之后工作
Spring底层对 BeanPostProcessor 的使用;
bean赋值,注入其他组件,@Autowired,生命周期注解功能,@Async,xxx BeanPostProcessor;
自动装配
Spring利用依赖注入(DI),完成对IOC容器中中各个组件的依赖关系赋值;<br />1)、@Autowired:自动注入:<br /> 1)、默认优先按照类型去容器中找对应的组件:applicationContext.getBean(BookDao.class);找到就赋值<br /> 2)、如果找到多个相同类型的组件,再将属性的名称作为组件的id去容器中查找<br /> applicationContext.getBean("bookDao")<br /> 3)、@Qualifier("bookDao"):使用@Qualifier指定需要装配的组件的id,而不是使用属性名<br /> 4)、自动装配默认一定要将属性赋值好,没有就会报错;<br /> 可以使用@Autowired(required=false);<br /> 5)、@Primary:让Spring进行自动装配的时候,默认使用首选的bean;<br /> 也可以继续使用@Qualifier指定需要装配的bean的名字<br /> BookService{<br /> @Autowired<br /> BookDao bookDao;<br /> }<br />2)、Spring还支持使用@Resource(JSR250)和@Inject(JSR330)[java规范的注解]<br /> @Resource:<br /> 可以和@Autowired一样实现自动装配功能;默认是按照组件名称进行装配的;<br /> 没有能支持@Primary功能没有支持@Autowired(reqiured=false);<br /> @Inject:<br /> 需要导入javax.inject的包,和Autowired的功能一样。没有required=false的功能;<br /> @Autowired:Spring定义的; @Resource、@Inject都是java规范<br />AutowiredAnnotationBeanPostProcessor:解析完成自动装配功能;<br />3)、 @Autowired:构造器,参数,方法,属性;都是从容器中获取参数组件的值<br /> 1)、[标注在方法位置]:@Bean+方法参数;参数从容器中获取;默认不写@Autowired效果是一样的;都能自动装配<br /> 2)、[标在构造器上]:如果组件只有一个有参构造器,这个有参构造器的@Autowired可以省略,参数位置的组件还是可以自动从容器中获取<br /> 3)、放在参数位置:<br />4)、自定义组件想要使用Spring容器底层的一些组件(ApplicationContext,BeanFactory,xxx);<br /> 自定义组件实现xxxAware;在创建对象的时候,会调用接口规定的方法注入相关组件;Aware;<br /> 把Spring底层一些组件注入到自定义的Bean中;<br /> xxxAware:功能使用xxxProcessor;<br /> ApplicationContextAware==》ApplicationContextAwareProcessor;
参考资料