Spring原理以及流程

Spring IOC、DI、MVC核心原理

配置阶段

  • web.xml –> DispatcherServlet
  • init-param–> contextConfigLocation classpath:application.xml
  • url-pattern–> /*

初始化阶段

  • init –>加载配置文件
  • IOC容器初始化–>Map

运行阶段

  • doPost/doGet–>request/response
  • 从HandlerMapping去匹配–>找到Method、通过反射机制invoker,再讲返回的结果交付
  • invoker
  • response.getWrite()

多说两句

IOC初始化阶段

  1. BeanDifinition的Resource定位
    • FileSystemResource:以文件的绝对路径方式进行访问资源,效果类似于Java中的File;
    • 以类路径的方式访问资源,效果类似于this.getClass().getResource(“/”).getPath();
    • ServletContextResource:web应用根目录的方式访问资源,效果类似于request.getServletContext().getRealPath(“”);
    • UrlResource:访问网络资源的实现类。例如file: http: ftp:等前缀的资源对象;
    • ByteArrayResource: 访问字节数组资源的实现类。
  2. BeanDifinition的载入与解析
    • 官方文档中对BeanDefinition的解释如下:
        A BeanDefinition describes a bean instance, which has property values, constructor argument values, and further information supplied by concrete implementations.
    • BeanDefinition相当于一个数据结构,这个数据结构的生成过程是根据定位的resource资源对象中的bean而来的,这些bean在Spirng_IoC容器内部表示成了的BeanDefintion这样的数据结构,IoC容器对bean的管理和依赖注入的实现都是通过操作BeanDefinition来进行的。
  3. BeanDifinition在Ioc容器中的注册
    • 最终Bean配置会被解析成BeanDefinition并与beanName,Alias一同封装到BeanDefinitionHolder类中, 之后beanFactory.registerBeanDefinition(beanName, bdHolder.getBeanDefinition()),注册到DefaultListableBeanFactory.beanDefinitionMap中。
    • beanDefinitionMap是一个concurrentHashMap

DI

  1. 什么是DI
    • Dependence Injection依赖注入(DI是IOC的一种具体实现):解决主键之间的装配问题
  2. Spring中DI的实现方式
    • 基于xml的DI(Dependency Injection)
    • 属性(setter)注入





    • 构造器注入






    • 命名空间注入
    • 集合属性注入[List、Set、Map]
    • list




      wj
      sj
      zj



    • set




      wj
      sj
      zj



    • map





      hello


      hella




    • 基于注解的DI
    • 配置component-scan路径,扫描对应的包

注解的理解

  1. 注入方法
    • constructor:通过构造方法进行自动注入,spring会匹配与构造方法参数类型一致的bean进行注入,如果有一个多参数的构造方法,一个只有一个参数的构造方法,在容器中查找到多个匹配多参数构造方法的bean,那么spring会优先将bean注入到多参数的构造方法中。
    • byName:被注入bean的id名必须与set方法后半截匹配,并且id名称的第一个单词首字母必须小写,这一点与手动set注入有点不同。–>@Resource(jdk)
    • byType:查找所有的set方法,将符合符合参数类型的bean注入。–>@Autowired(Spring)/@Inject
  2. 注册bean的注解
    • @Component:可以用于注册所有bean
    • @Repository:主要用于注册dao层的bean
    • @Controller:主要用于注册控制层的bean
    • @Service:主要用于注册服务层的bean

你可能感兴趣的:(Spring)