继承树
BeanFactory(接口)
—DefaultListableBeanFactory(实现类)
—ApplicationContext(接口)
——FileSystemXmlApplicationContext(实现类)
——ClassPathXmlApplicationContext(实现类)
——AnnotationConfigWebApplicationContext(实现类)
注入方式
1. 构造注入(通过反射调用构造器时传递参数)
2. 设值注入(通过反射调用setter方法时传递参数)
国际化
ApplicationContext继承了MessageSource接口,其中响应的方法的调用依赖于id为messageSource的bean(常用ResourceBundleMessageSource这个实现类),如ctx.getMessage(String code,Object[] args[],Locate loc)
事件机制
事件:ApplicationEvent(事件必须由容器触发,ctx.publishEvent(eve))
监听器:ApplicationListener(只要配置在容器中就会起用,不需要注册等操作)
内置事件:ContextRefreshEvent、ContextStartEvent、ContextCloseEvent、ContextStopedEvent、RequestHandledEvent等。
BeanFactoryAware
bean实现这个接口后,spring会用容器本身作为参数调用相应的方法,如在web应用中经常采用声明式配置方式,通过listener将生成Spring的容器对象放置到servletContext中,此时就可以通过此种方式获得容器的引用。
bean的作用域
scope
singleton、prototype、request(Web)、session(Web)、global session(Web)。为了让request等作用域生效,需要将http请求对象绑定到相应的线程上,让bean实例能在后面的调用链中被访问到,可以配置listener或者filter来实现(SpringMVC不用)
自动装配
autowrite:no、byName、byType、constructor、autodetect
autowrite-candidates:true、false 是否会注入到别的bean
注入嵌套bean
如果不希望bean被容器访问,可以使用嵌套的方式
<property name="person">
<bean class="com.wang.Person" />
</property>
注入集合
list、map、set 都可以
<property name="collectionExample">
<set>
<value>普通的字符串</value>
<bean class="org.crazyit.app.service.impl.SteelAxe"/>
<ref bean="stoneAxe"/>
<list>
<value>20</value>
<set>
<value type="int">30</value>
</set>
</list>
<props>
<prop key="血压">正常</prop>
<prop key="身高">175</prop>
</props>
<map>
<entry key="数学" value="87"/>
<entry key="英语" value="89"/>
<entry key="语文" value="82"/>
</map>
<list>
<value>小学</value>
<value>中学</value>
<value>大学</value>
</list>
</set>
</property>
组合属性
除了最后一个属性外都不可以是null 如
<property name="person.name" value="zhangsan"/>
创建bean的方式
1. new:class : class
2. 静态工厂:class、factory-method
2. 实例工厂: factory-bean、factory-method
3. BeanFactory:class(getObject()、isSingleton()、getObjectType())
bean的继承
parent、abstract
强制初始化bean
depends-on
BeanNameAware
在bean中获取ID
bean生命周期
init-method、Initializing接口、destory-method、Disposable接口
延迟初始化
ApplicationContext会默认
初始化所有的singleton,可以用lazy-init=”true”取消这中行为
协调不同作用域的bean
look-up属性: Spring通过使用CGLIB修改客户端代码,实现了为Bean修改look-up所指定的方法,默认方法体室返回当前容器中的bean
高级依赖关系配置
FieldRetrievingFactoryBean:可访问类静态Field或对象实例的Field值,所获的值可以注入其他bean,也可以直接定义为新的bean。
MethodInvokingFactoryBean:获得方法的返回值,所获的值可以注入其他bean,也可以直接定义为新的bean。
PropertyPathFactoryBean:用来获取目标bean的属性值,所获的值可以注入其他bean,也可以直接定义为新的bean。
bean后处理器
BeanPostProcessor(接口):常用来生成代理等
Object postProcessBeforeInitializing(Object bean,String name)
Object postProcessAfterInitializing(Object bean,String name)
容器后处理器
BeanFactoryProcessor(接口):在初始化容器中其余bean之前起作用,常用来设置属性址,覆盖属性值,动态的注入bean(BeanDefinitionRegistry)等
postProcessorBeanFactory(ConfigurableLisListableBeanFactory beanfactory)