一览众山小

简单的理解Spring就是一个大的容器,它管理诸多不同职责的对象,我们把这些对象统称为Bean。说到Spring 有两个重要的概念不得不提,一个是依赖注入(DI),另一个是面向界面编程(AOP)。依赖注入降低我们代码的耦合度,使得对象间或模块间松散耦合,让我们的整个软件结构变的更加灵活、可变。这里我要多提一点,就是在设计Bean的时候一般是面向接口的,这一点对于模块外露的功能类来说至关重要。

名词解释

控制反转(IOC, Inversion of Control),是面向对象编程的一种设计原则,可以降低代码之间的耦合度。在Java中常见的有两种方式,一是依赖注入,另一个是依赖查找。

依赖注入(DI,Dependency Injection ),将依赖通过外部以参数的形式注入。

依赖查找(DL,Dependency Lookup) ,通过配置或其他方式指明接口的实现类。如Java 中的SPI。

面向切面编程(AOP,Aspect Oriented Programming),主要针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某一步骤或阶段,从而降低各部分的耦合性。我们可以通过Spring 对业务代码实现日志记录、安全控制、事务处理等。

父子容器

我们可以给一个容器设置父容器,父容器对于子容器是可见的,这里说的可见的是指子容器可以获取到父容器中的Bean,需要注意的是某些特殊职责的Bean只对本容器起作用,例如实现了BeanPostProcesser、ApplicationListener等接口的Bean,虽然可以在子容器中获取的到但它们的职责只对所在容器起作用。

容器的启动过程

  1. 装载Bean的配置,容器读取Bean的配置并生成一个相应的Bean的定义类。
  2. 实例化Bean

Bean的定义:我们在定义一个Bean时一般做三件事情,1、指定Bean的类 2、指定Bean的依赖 3、指定Bean的职责,我们可以通过接口或者是注解指定这个Bean是用来干什么的,例如我们可以为Bean指定实现BeanPostProcesser接口,那么在Bean创建的过程中会被调用。Spring支持三种方式让我们提供Bean的定义,1)配置文件 2)Java Config 3)在Spring 周期中动态设置ean的定义。

1、配置文件

1    <beans:bean name="loadEntityDataService" class="com.sprite.framework.base.entitydata.LoadEntityDataService">
2         <beans:property name="delegator" ref="delegator"/>
3     </beans:bean>

2、Java Config

 1 @Configuration2 @EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})3 public class EntityConfig {4     private static final String DIALECT = "hibernate.dialect";5     private static final String SHOW_SQL = "hibernate.show_sql";6     private static final String HBM2DDL_AUTO = "hibernate.hbm2ddl.auto"; 7 8  @Bean 9 public DataSource dataSource(Environment env) { 10 BasicDataSource druidDataSource = new BasicDataSource(); 11 druidDataSource.setPassword(env.getProperty("jdbc.password")); 12 druidDataSource.setUsername(env.getProperty("jdbc.username")); 13 druidDataSource.setUrl(env.getProperty("jdbc.url")); 14 druidDataSource.setDriverClassName(env.getProperty("jdbc.driver")); 15 druidDataSource.setMaxActive(Integer.parseInt(env.getProperty("jdbc.maxActive"))); 16 druidDataSource.setMaxIdle(Integer.parseInt(env.getProperty("jdbc.maxIdle"))); 17 druidDataSource.setMaxWait(Integer.parseInt(env.getProperty("jdbc.maxWait"))); 18 return druidDataSource; 19  } 20 }

3、动态设置

 1 public class AnnotationConfigBeanDefinitionParser implements BeanDefinitionParser {2 3     @Override4     public BeanDefinition parse(Element element, ParserContext parserContext) {5         Object source = parserContext.extractSource(element);6 7         // Obtain bean definitions for all relevant BeanPostProcessors.8         Set<BeanDefinitionHolder> processorDefinitions =9                 AnnotationConfigUtils.registerAnnotationConfigProcessors(parserContext.getRegistry(), source);
10
11         // Register component for the surrounding <context:annotation-config> element.
12         CompositeComponentDefinition compDefinition = new CompositeComponentDefinition(element.getTagName(), source); 13  parserContext.pushContainingComponent(compDefinition); 14 15 // Nest the concrete beans in the surrounding component. 16 for (BeanDefinitionHolder processorDefinition : processorDefinitions) { 17 parserContext.registerComponent(new BeanComponentDefinition(processorDefinition)); 18  } 19 20 // Finally register the composite component. 21  parserContext.popAndRegisterContainingComponent(); 22 23 return null; 24  } 25 26 }

实例化Bean:容器在实例化Bean时一般分为三部分,1、根据Bean的定义实例化原有对象2、设置对象属性、3、装饰对象(生成代理、切面编程等)。在这个过程中Spring为我们提供了一些接口,可以通过这些接口改对象属性或者生成特定功能的代理对象。

代理

代理可分为两种:动态代理 、静态代理。静态代理是通过编码或工具生成代理,动态代理在编译或运行时生成代理。

动态代理:Spring 动态代理的实现有两种,它们是CGLIB 和JDK动态代理。CGLIB 是一个可以操作字节码的库。

系列文章 <<Spring的里里外外>>

转载于:https://www.cnblogs.com/baozixiaopu/p/9525409.html

Spring 一览众山小相关推荐

  1. spring boot项目 中止运行 最常用的几种方法

    spring boot项目 中止运行 最常用的几种方法: 1. 调用接口,停止应用上下文 @RestController public class ShutdownController impleme ...

  2. html+spring boot简单的ajax数据传输实现

    本篇讲解在前后端不分离情况下的html+spring boot的项目数据传输实现 首先,后台我写了三个接口 package com.demo.ajax.controller;import com.de ...

  3. Spring Boot整合Spring Data JPA操作数据

    一. Sping Data JPA 简介 Spring Data JPA 是 Spring 基于 ORM 框架.JPA 规范的基础上封装的一套 JPA 应用框架,底层使用了 Hibernate 的 J ...

  4. Spring AOP + Redis解决重复提交的问题

    Spring AOP + Redis解决重复提交的问题 用户在点击操作的时候,可能会连续点击多次,虽然前端可以通过设置按钮的disable的属性来控制按钮不可连续点击,但是如果别人拿到请求进行模拟,依 ...

  5. Spring cloud 微服务docker容器化最佳实践

    Spring cloud 是当下最炙手可热的微服务套件,我们将介绍如何整合Docker容器达到高效快捷的构建发布 采用了dockerfile-maven-plugin插件发布镜像到远程docker主机 ...

  6. ssh(Struts+spring+Hibernate)三大框架整合-简述

    ssh(Struts+spring+Hibernate)三大框架配合使用来开发项目,是目前javaee最流行的开发方式,必须掌握: 注意: 为了稳健起见,每加入一个框架,我们就需要测试一下,必须通过才 ...

  7. Strutsw2与Spring整合流程-简述

    1.      新建WEB工程: 2.      导入struts2开发包,和资源配置文件 ① globalMessages.properties ② struts.properties 3.     ...

  8. spring Bean自动装配

    spring Bean自动装配 自动装配是使用spring满足bean依赖的一种方式. spring会在应用上下文中为某个bean寻找其依赖的bean. spring自动装配需要从两个角度来实现,或者 ...

  9. spring IOC创建对象方式

    spring IOC创建对象方式 通过无参构造来创建 验证方法: 创建实体类: public class User {private String name;public User() {System ...

最新文章

  1. sql server ssl安全错误_Nginx的这些安全设置,你都知道吗?
  2. 最新全球自由职业技能单日排行
  3. 求列表最大元素不用max_python3实现从一个无序列表中求取连续元素之和中最大的和...
  4. Python之父Guido推荐的命名规范
  5. SQL语言之DQL语言学习(二)条件查询
  6. 《系统集成项目管理工程师》必背100个知识点-08项目可行性研究内容
  7. DataTable的Ajax使用
  8. js list操作_使用 Node.js 实现一个命令行 todo-list(1)- 基本功能
  9. java 参数值_Java中的参数传值方式
  10. python的常用语句_python常用语句
  11. 程序员为什么越老越贬值的厉害?
  12. 转: maven进阶:一个多模块项目
  13. 计算机主板的位置,电脑主板在哪个位置(主板工作原理和主要种类)
  14. Class6 基于ECS和NAS搭建个人网盘
  15. iPhone 连接电脑后一直断开重连,删除.DS_Store文件
  16. 第6章第9节:幻灯片背景:使用纹理和图像作为幻灯片的背景 [PowerPoint精美幻灯片实战教程]
  17. 阿里巴巴直播内容风险防控中的AI力量
  18. 程序员用 Python 破解同事的加密压缩包!不小心知道了……
  19. 【姿态估计】PCK(Percentage of Correct Keypoints)指标及代码实现
  20. Mac下python2.7 升级到3.7

热门文章

  1. java实现串的反转
  2. php 10天自动确认收货,ECSHOP修正recieve.php判断不严谨导致邮件自动确认收货
  3. VMware Workstation创建Windows 7虚拟机
  4. setContentView剖析
  5. Bin文件和Hex文件相互转换
  6. Docker UCP介绍
  7. 高性能MySQL(第3版)(MySQL旗舰名著 惊献全面升级)
  8. PlatoFarm链上数据优异,最真实的元宇宙
  9. Java NIO学习笔记三------Chanel的四种实现篇
  10. CRO 管理系统(附源码)