spring IoC

什么是spring

Spring 框架是 Java 应用最广的框架,它的成功来源于理念,而不是技术本身,它的理念包括 IoC (Inversion of Control,控制反转) 和 AOP(Aspect Oriented Programming,面向切面编程)。
spring的根本使命是简化java开发,提倡以“最少侵入的方式来管理我们项目中的代码”

spring的框架结构

spring的框架结构

Data Access/Integration层:JDBC、ORM、OXM、JMS和Transaction模块。
**对数据库之间操作的一些支持
Web层:-------------------------:Web、Web-Servlet、WebSocket、Web-Porlet模块。
**对web模块的支持。
AOP模块-----------------------:提供了一个符合AOP联盟标准的面向切面编程的实现。
Core Container(核心容器)-:包含有Beans、Core、Context和SpEL模块。
**IOC容器, 解决对象创建及依赖关系
Test模块------------------------:支持使用JUnit和TestNG对Spring组件进行测试。

spring IoC和DI简介

spring设计的目的是为了管理bean

IOC(Spring的核心思想之一):

Inverse of Control(控制反转)是一种设计思想,就是将原本在程序中手动创建对象的控制权,交给Spring框架来管理。
就是一种通过描述(在java中可以是XML或者注解)并通过第三方去生产或者获取特定对象的方式。
正控:若要使用某个对象,需要自己负责对象的创建
反控:若要使用某个对象,只需要从 Spring容器中获取要使用的对象,不关心对象的创建过程,也就是把对象的控制全交给spring框架。(也就是你只是描述了需求,而不关心事情具体怎么做,只需要等待一个结果就好)

获取对象的不同方式

引入IOC容器,利用依赖关系注入(DI)的方式,实现对象之间的解耦。
IoC的一个重点就是在系统的运行中,动态的向某个对象提供它所需的其他对象。这一点是通过DI(依赖注入)来实现的。
Spring的IoC容器在实现控制反转和依赖注入的过程中,可以划分为两个阶段:
1,容器启动阶段
2,Bean实例化阶段
image.png

IoC实现方式:

1,属性注入(setter注入)
2,构造器注入
构造器注入,顾名思义,就是在构造器里面注入依赖对象。那是怎么实现的呢?其实跟属性注入差不多,定义一个有参构造器,然后配置xml文件就行了
3,自动装配
4,p名称空间
对set注入方式的一种优化,支持spring3+;
在xml文件当中,不用写property节点,直接使用p名称空间
5,注解
限制:
如果使用了构造器注入或者setter注入,那么将覆盖自动装配的依赖关系。
基本数据类型的值、字符串字面量、类字面量无法使用自动装配来注入。
有先考虑使用显式的装配来进行更精确的依赖注入而不是使用自动装配。
和自动装配的注解相关:
@Required:该依赖关系必须装配(手动或自动装配),否则将抛出BeanInitializationException异常。
@Autowired:自动装配,默认按类型进行自动装配。
@Qualifier:如果按类型自动装配时有不止一个匹配的类型,那么可以使用该注解指定名字来消除歧义。

spring Ioc简单例子

core模块是:IoC容器,解决对象创建之间的依赖关系,因此Core模块主要是学习IoC容器,通过IoC容器来创建对象,解决对象之间的依赖关系

Spring IoC的体系

(1) BeanFactory
Spring Bean的创建是典型的工厂模式,这一系列的Bean工厂,也即IOC容器为开发者管理对象间的依赖关系提供了很多便利和基础服务,在Spring中有许多的IOC容器的实现供用户选择和使用,其相互关系如下:


其中BeanFactory作为最顶层的一个接口类,它定义了IOC容器的基本功能规范,BeanFactory 有三个子类:ListableBeanFactory、HierarchicalBeanFactory 和AutowireCapableBeanFactory。但是从上图中我们可以发现最终的默认实现类是 DefaultListableBeanFactory,他实现了所有的接口。那为何要定义这么多层次的接口呢?查阅这些接口的源码和说明发现,每个接口都有他使用的场合,它主要是为了区分在 Spring 内部在操作过程中对象的传递和转化过程中,对对象的数据访问所做的限制。例如 ListableBeanFactory 接口表示这些 Bean 是可列表的,而 HierarchicalBeanFactory 表示的是这些 Bean 是有继承关系的,也就是每个Bean 有可能有父 Bean。AutowireCapableBeanFactory 接口定义 Bean 的自动装配规则。这四个接口共同定义了 Bean 的集合、Bean 之间的关系、以及 Bean 行为.
最基本的IOC容器接口BeanFactory

public interface BeanFactory {    
     
     //对FactoryBean的转义定义,因为如果使用bean的名字检索FactoryBean得到的对象是工厂生成的对象,    
     //如果需要得到工厂本身,需要转义           
     String FACTORY_BEAN_PREFIX = "&"; 
        
     //根据bean的名字,获取在IOC容器中得到bean实例    
     Object getBean(String name) throws BeansException;    
   
    //根据bean的名字和Class类型来得到bean实例,增加了类型安全验证机制。    
     Object getBean(String name, Class requiredType) throws BeansException;    
    
    //提供对bean的检索,看看是否在IOC容器有这个名字的bean    
     boolean containsBean(String name);    
    
    //根据bean名字得到bean实例,并同时判断这个bean是不是单例    
    boolean isSingleton(String name) throws NoSuchBeanDefinitionException;    
    
    //得到bean实例的Class类型    
    Class getType(String name) throws NoSuchBeanDefinitionException;    
    
    //得到bean的别名,如果根据别名检索,那么其原名也会被检索出来    
   String[] getAliases(String name);    
    
 }

spring提供了许多IOC容器的实现。比如XmlBeanFactory,ClasspathXmlApplicationContext等。其中XmlBeanFactory就是针对最基本的ioc容器的实现,这个IOC容器可以读取XML文件定义的BeanDefinition(XML文件中对bean的描述,而ClasspathXMlApplication则相当于高级版
ClasspathXmlApplicationConrext的特点:
1,支持信息源,可以实现国际化。(实现MessageSource接口)
2, 访问资源。(实现ResourcePatternResolver接口,这个后面要讲)
3,支持应用事件。(实现ApplicationEventPublisher接口)
从中我们可以看出BeanFactory位于设计的最底层,它提供了Spring IoC最低层的设计

你可能感兴趣的:(spring IoC)