springIOC

来源:互联网 发布:centos 下载文件到本地 编辑:程序博客网 时间:2024/04/29 17:20
强调!!!以下只是我个人总结,如有错误的地方请文明指出微笑,如有其他看法请耐心讨论微笑,如有看不懂可以参考其他有关博客微笑,最后如有想喷的出门左转不谢。微笑    

1、控制反转:依赖对象的获得被反转了。
2、许多程序都是有两个以上的类通过彼此合作来实现业务逻辑的,这使得每个对象都要引用它所依赖的对象的引用,如果这个获取对象的过程要靠自身实现(一个类中引用了另一个类),那么会导致代码的高度耦合并且难以测试。
3、依赖控制反转的方式有很多,其中spring中的IOC容器是实现这个模式的载体。他可以在对象生成或初始化时直接将数据注入到对象中,也可以通过将对象的引用注入到对象数据域中的方式来注入对方法调用的依赖。这种依赖注入是可以递归的,对象被逐层注入。
4、spring IOC容器中有两个主要的容器系列:BeanFactory,用来实现容器的基本功能;ApplicationContext,应用上下文,在简单容器的基础上增加了许多面向框架的新特性。
5、BeanDefinition:是spring在提供基本的IOC容器的接口定义和实现的基础上,由spring定义的BeanDefinition用来管理spring中各种对象以及他们之间的依赖关系。对于IOC他是依赖反转模式中管理对象依赖关系的数据抽象,也是容器实现依赖反转功能的核心数据结构。
6、BeanFactory接口<——HierarchicalBeanFactory接口<——ConfigurableBeanFactory接口:BeanFactory接口定义了基本的IOC容器的规范,包括getBean()(从容器中获取Bean);HierarchicalBeanFactory接口继承了BeanFactory接口后,增加了getParentBeanFactory()(使得BeanFactory具备了双亲IOC容器的管理功能);ConfigurableBeanFactory接口继承了HierarchicalBeanFactory接口后增加了定义对BeanFactory的配置功能,例如setParentBeanFactory()(设置双亲IOC容器)、addBeanPostProcessor()(配置Bean后置处理器)。
7、BeanFactory接口<——ListableBeanFactory接口/HierarchicalBeanFactory接口<——ApplicationContext接口<——ConfigurableApplicationContext接口/WebApplicationContext接口
在ListableBeanFactory接口中细化了许多BeanFactory接口的功能,比如定义了getBeanDefinitionName()接口方法。ApplicationContext接口通过继承了MessageSource、ResourceLoader、ApplicationEventPublisher接口。
8、BeanFactory接口有如下接口方法:
接口里定义了一个变量String FACTORY_BEAN_PREFIX = "&";
  这是用来区分是获取FactoryBean还是FactoryBean的createBean创建的实例.如果&开始则获取FactoryBean;否则获取createBean创建的实例.
我们来看下定义的方法:
  a, 获取bean,这边可以实现单例,原型
    Object getBean(String name) throws BeansException; 可以用别名查找哦
    <T> T getBean(String name, Class<T> requiredType) throws BeansException;
    <T> T getBean(Class<T> requiredType) throws BeansException; 这边的类型可以是接口或者子类,但不能是null
    Object getBean(String name, Object... args) throws BeansException;
  b, 判断是否包含bean.陷阱出现:这边不管类是否抽象类,懒加载,是否在容器范围内,只要符合都返回true,所以这边true,不一定能从getBean获取实例
    boolean containsBean(String name);
  c, 单例,原型,bean类型的判断
    boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
    boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
    boolean isTypeMatch(String name, Class<?> targetType) throws NoSuchBeanDefinitionException;用来查询指定了名字的Bean的Class类型是否是特定的Class类型
  d, 获取bean 的类型,别名
    Class<?> getType(String name) throws NoSuchBeanDefinitionException;
    String[] getAliases(String name);查询Bean的别名
感觉乱乱的,不知道在写什么,好吧。。。。微笑