Spring 一览众山小
一览众山小
简单的理解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,虽然可以在子容器中获取的到但它们的职责只对所在容器起作用。
容器的启动过程
- 装载Bean的配置,容器读取Bean的配置并生成一个相应的Bean的定义类。
- 实例化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 一览众山小相关推荐
- spring boot项目 中止运行 最常用的几种方法
spring boot项目 中止运行 最常用的几种方法: 1. 调用接口,停止应用上下文 @RestController public class ShutdownController impleme ...
- html+spring boot简单的ajax数据传输实现
本篇讲解在前后端不分离情况下的html+spring boot的项目数据传输实现 首先,后台我写了三个接口 package com.demo.ajax.controller;import com.de ...
- Spring Boot整合Spring Data JPA操作数据
一. Sping Data JPA 简介 Spring Data JPA 是 Spring 基于 ORM 框架.JPA 规范的基础上封装的一套 JPA 应用框架,底层使用了 Hibernate 的 J ...
- Spring AOP + Redis解决重复提交的问题
Spring AOP + Redis解决重复提交的问题 用户在点击操作的时候,可能会连续点击多次,虽然前端可以通过设置按钮的disable的属性来控制按钮不可连续点击,但是如果别人拿到请求进行模拟,依 ...
- Spring cloud 微服务docker容器化最佳实践
Spring cloud 是当下最炙手可热的微服务套件,我们将介绍如何整合Docker容器达到高效快捷的构建发布 采用了dockerfile-maven-plugin插件发布镜像到远程docker主机 ...
- ssh(Struts+spring+Hibernate)三大框架整合-简述
ssh(Struts+spring+Hibernate)三大框架配合使用来开发项目,是目前javaee最流行的开发方式,必须掌握: 注意: 为了稳健起见,每加入一个框架,我们就需要测试一下,必须通过才 ...
- Strutsw2与Spring整合流程-简述
1. 新建WEB工程: 2. 导入struts2开发包,和资源配置文件 ① globalMessages.properties ② struts.properties 3. ...
- spring Bean自动装配
spring Bean自动装配 自动装配是使用spring满足bean依赖的一种方式. spring会在应用上下文中为某个bean寻找其依赖的bean. spring自动装配需要从两个角度来实现,或者 ...
- spring IOC创建对象方式
spring IOC创建对象方式 通过无参构造来创建 验证方法: 创建实体类: public class User {private String name;public User() {System ...
最新文章
- sql server ssl安全错误_Nginx的这些安全设置,你都知道吗?
- 最新全球自由职业技能单日排行
- 求列表最大元素不用max_python3实现从一个无序列表中求取连续元素之和中最大的和...
- Python之父Guido推荐的命名规范
- SQL语言之DQL语言学习(二)条件查询
- 《系统集成项目管理工程师》必背100个知识点-08项目可行性研究内容
- DataTable的Ajax使用
- js list操作_使用 Node.js 实现一个命令行 todo-list(1)- 基本功能
- java 参数值_Java中的参数传值方式
- python的常用语句_python常用语句
- 程序员为什么越老越贬值的厉害?
- 转: maven进阶:一个多模块项目
- 计算机主板的位置,电脑主板在哪个位置(主板工作原理和主要种类)
- Class6 基于ECS和NAS搭建个人网盘
- iPhone 连接电脑后一直断开重连,删除.DS_Store文件
- 第6章第9节:幻灯片背景:使用纹理和图像作为幻灯片的背景 [PowerPoint精美幻灯片实战教程]
- 阿里巴巴直播内容风险防控中的AI力量
- 程序员用 Python 破解同事的加密压缩包!不小心知道了……
- 【姿态估计】PCK(Percentage of Correct Keypoints)指标及代码实现
- Mac下python2.7 升级到3.7