前景概要

  对于现在的Java开发基本上可以说成是spring开发,spring全家桶可以说是把整个Java web安排的明明白白的。正因为使用的很多,所以作为一名开发者不应该仅仅是会使用spring,更要对spring的知识有一定深度的了解。这样不论是工作还是面试都是有所帮助的。spring的实现使用了大量的设计模式,单纯的看设计模式比较难以理解,结合spring代码来看效率应该会更高一些,这也是我想看spring的原因。spring的核心是ioc与aop,所以通过这次的学习希望对ioc与aop有更深层次的理解。最后说明一下这个专题的文章是我自己的学习笔记,由于我个人水平有限,所以如果有大佬偶然看到还希望能给予指正。

什么是spring

  spring是一款简便开发的轻量级框架(细节的概念我就不cv了)。

为什么要使用spring

  是因为别人都在用吗?为啥别人都用呢,简化开发你用不用?当然的用,现在的Javaweb开发基本上可以说就是spring开发了,spring开发不用spring用啥?

  正经点说就是,除了spring我也没用过别的,不然我写这个专题干嘛,就别为难我胖虎了。

怎么使用spring

  1. 导jar包

  1. <dependency>
  2. <groupId>org.springframework</groupId>
  3. <artifactId>spring-core</artifactId>
  4. <version>4.2.4.RELEASE</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.springframework</groupId>
  8. <artifactId>spring-context</artifactId>
  9. <version>4.2.4.RELEASE</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.springframework</groupId>
  13. <artifactId>spring-beans</artifactId>
  14. <version>4.2.4.RELEASE</version>
  15. </dependency>
  16. <dependency>
  17. <groupId>org.springframework</groupId>
  18. <artifactId>spring-expression</artifactId>
  19. <version>4.2.4.RELEASE</version>
  20. </dependency>

  2.需要一个被代理的类

  1. package com.jeff_code;
  2.  
  3. import org.springframework.beans.BeansException;
  4. import org.springframework.beans.factory.BeanNameAware;
  5. import org.springframework.beans.factory.DisposableBean;
  6. import org.springframework.beans.factory.InitializingBean;
  7. import org.springframework.context.ApplicationContext;
  8. import org.springframework.context.ApplicationContextAware;
  9.  
  10. public class Person implements BeanNameAware, ApplicationContextAware, InitializingBean, DisposableBean {
  11. private String name;
  12.  
  13. public Person() {
  14. System.out.println("1.构造器创建类");
  15. }
  16.  
  17. public String getName() {
  18. return name;
  19. }
  20.  
  21. public void setName(String name) {
  22. System.out.println("2.set参数");
  23. this.name = name;
  24. }
  25.  
  26. public void init() {
  27. System.out.println("7. 初始化方法");
  28. }
  29.  
  30. public void destory() {
  31. System.out.println("11.全部结束整个销毁方法");
  32. }
  33.  
  34. @Override
  35. public void setBeanName(String s) {
  36. System.out.println("3.将xml配置中的id/name的名字得到");
  37. }
  38.  
  39. @Override
  40. public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
  41. System.out.println("4.让我们的类了解工厂信息了");
  42. }
  43.  
  44. @Override
  45. public void afterPropertiesSet() throws Exception {
  46. System.out.println("6. 属性设置后执行");
  47. }
  48.  
  49. public void sayHello() {
  50. System.out.println("9. 如果调用了它的方法才会执行到这个生命周期,"+ name);
  51. }
  52.  
  53. @Override
  54. public void destroy() throws Exception {
  55. System.out.println("10. Spring的一个销毁方法");
  56. }
  57. }

  3.需要一个配置文件进行bean的注入

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  5.  
  6. <bean id="person" class="com.jeff_code.Person" init-method="init" destroy-method="destory">
  7. <property name="name" value="jeff"></property>
  8. </bean>
  9. <!--前后置处理器是生命周期的一个步骤,不需要我们配id调用的-->
  10. <bean class="com.jeff_code.MyBeanPostProcessor">
  11.  
  12. </bean>
  13. </beans>

  4. 我们就可以使用spring生成一个object了

  1. package com.jeff_code;
  2.  
  3. import org.springframework.context.support.ClassPathXmlApplicationContext;
  4.  
  5. public class Test {
  6.  
  7. @org.junit.Test
  8. public void testLife() {
  9. ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("spring-config.xml");
  10. Person person = ac.getBean("person", Person.class);
  11. person.sayHello();
  12. ac.close();
  13. }
  14. }

  我们就使用spring生成了一个我们要使用对象,关于对象是怎么init,destroy,怎么注入,何时属性赋值等操作,使用者是感知不到的。当然你要觉得写这么多还不如new Person()来的快,我觉得你说得对,就这个demo来说是这样的,我不反驳,如果你做过大一点的web项目,我觉得应该不会这么说。关于这个特点也是ioc带来的便利,我这里只是简单的概要,只讲一下实现的思路。

  使用spring是不难看出,我们使用了一个ApplicationContext,读取了我们的配置文件,这时你可能想这是spring提供的类,这个类的功能就是读取xml文件,解析出配置中需要注入的bean,然后通过反射机制生成一个对象,将对象存在ioc容器中,所以在第二步getBean方法直接就获取到这个对象,此时我们就可以使用这个对象了。粗略的说,我认为粗略地说(很粗)控制反转确实就是这样实现的。

什么是ioc

  IoC全称为Inversion of Control,翻译为 “控制反转”,他和依赖注入(DI,Dependency Injection)指的是一回事。专业名词不好懂是不是,那就说的简单一点,ioc就是取代了new Object()的方式,由 Spring IOC 容器来负责对象的生命周期和对象之间的关系。

为什么使用ioc

  最早接触面向对象就知道,创建一个对象的方法最简单常用的就是new Object().,这种方式首先就是不够优雅,其次众所周知,程序员都是懒得一笔的,我每次使用对象都要new这也太麻烦了吧,我直接就能用不是更好吗,当然最重要的ioc控制反转,将创建对象的正向操作变成一种由ioc容器反向提供的方式,但是你很难想象ioc还包含着依赖关系的。因为控制反转这个名字实在是联系不上两个对象的依赖关系,所以那位微服务架构大佬,马丁福乐给ioc起了个更为形象的名字“依赖注入”。

  

  后面主要写一下完成spring的五种类的源码实现,一下是简介:

  ①Resource,对资源的抽象,它的每一个实现类都代表了一种资源的访问策略,如ClasspathResource 、 URLResource ,FileSystemResource 等, 再用ResourceLoader 来进行统一资源加载。

  ②BeanFactory是一个非常纯粹的bean容器,它是IOC必备的数据结构,其中BeanDefinition是她的基本结构,它内部维护着一个BeanDefinition map,并可根据BeanDefinition的描述进行 bean 的创建和管理。

  ③BeanDefinition 用来描述 Spring 中的 Bean 对象。

  ④BeanDefinitionReader的作用是读取 Spring 的配置文件的内容,并将其转换成 Ioc 容器内部的数据结构:BeanDefinition。

  ⑤ApplicationContext就是Spring容器,它叫做应用上下文,与我们应用息息相关,她继承 BeanFactory,所以它是 BeanFactory 的扩展升级版,如果BeanFactory 是屌丝的话,那么 ApplicationContext 则是名副其实的高富帅。由于ApplicationContext的结构就决定了它与 BeanFactory 的不同,其主要区别有:

  1. 继承 MessageSource,提供国际化的标准访问策略。
  2. 继承 ApplicationEventPublisher ,提供强大的事件机制。
  3. 扩展 ResourceLoader,可以用来加载多个 Resource,可以灵活访问不同的资源。
  4. 对 Web 应用的支持。

参考文档:

https://www.martinfowler.com/articles/injection.html

http://cmsblogs.com/?p=2652

【spring专题】spring简介的更多相关文章

  1. Spring 系列: Spring 框架简介 -7个部分

    Spring 系列: Spring 框架简介 Spring AOP 和 IOC 容器入门 在这由三部分组成的介绍 Spring 框架的系列文章的第一期中,将开始学习如何用 Spring 技术构建轻量级 ...

  2. Spring Web Flow 简介

    Spring Web Flow 简介 博客分类: 转载 SSH 最近在TSS上看到了一片介绍Spring Web Flow的文章,顺便就翻译了下来,SWF的正式版估计要到6月份才能看到了,目前的例子都 ...

  3. Spring 系列: Spring 框架简介(转载)

    Spring 系列: Spring 框架简介 http://www.ibm.com/developerworks/cn/java/wa-spring1/ Spring AOP 和 IOC 容器入门 在 ...

  4. Spring中AOP简介与切面编程的使用

    Spring中AOP简介与使用 什么是AOP? Aspect Oriented Programming(AOP),多译作 "面向切面编程",也就是说,对一段程序,从侧面插入,进行操 ...

  5. Unit03: Spring Web MVC简介 、 基于XML配置的MVC应用 、 基于注解配置的MVC应用

    Unit03: Spring Web MVC简介 . 基于XML配置的MVC应用 . 基于注解配置的MVC应用 springmvc (1)springmvc是什么? 是一个mvc框架,用来简化基于mv ...

  6. spring 拦截器简介

    spring 拦截器简介 常见应用场景 1.日志记录:记录请求信息的日志,以便进行信息监控.信息统计.计算PV(Page View)等.2.权限检查:如登录检测,进入处理器检测检测是否登录,如果没有直 ...

  7. Spring HTTP invoker简介

    Spring HTTP invoker简介 Spring HTTP invoker是spring框架中的一个远程调用模型,执行基于HTTP的远程调用(意味着可以通过防火墙),并使用java的序列化机制 ...

  8. Spring Boot 之Spring data JPA简介

    文章目录 添加依赖 添加entity bean 创建 Dao Spring Data Configuration 测试 Spring Boot 之Spring data JPA简介 JPA的全称是Ja ...

  9. Spring专题1: 静态代理和动态代理

    合集目录 Spring专题1: 静态代理和动态代理 为什么需要代理模式? 代理对象处于访问者和被访问者之间,可以隔离这两者之间的直接交互,访问者与代理对象打交道就好像在跟被访者者打交道一样,因为代理者 ...

  10. Spring专题2: DI,IOC 控制反转和依赖注入

    合集目录 Spring专题2: DI,IOC 控制反转和依赖注入 https://docs.spring.io/spring/docs/2.5.x/reference/aop.html https:/ ...

随机推荐

  1. Python 正则表达式 利用括号分组

    如果想把区号从匹配的电话号码中分离,可以添加括号在正则表达式中创建分组,再使用group()方法,从一个分组中获取匹配的文本 正则表达式字符串中,第一个括号是第一组,第二个括号是第二组.向group( ...

  2. Redis之List类型操作

    接口: package com.net.test.redis.base.dao; import java.util.List; /** * @author *** * @Time:2017年8月10日 ...

  3. selenium中webdriver跳转新页面后定位置新页面的两种方式

    刚刚在写Python爬虫的时候用到了selenium , 在跳转新页面时发现无法定位新页面 , 查找不到新页面的元素 一番查询后得到了解决方法 , 便记录下来备忘 , 也与大家分享 # 页面跳转代码. ...

  4. 自动化运维之使用Python3收发电子邮件~~~附源码

    一.背景介绍   1.1  一些专业名称的解释 MUA——Mail User Agent,邮件用户代理.是用户与电子邮件系统的交互接口,一般来说它就是我们PC机上的一个程序,提供一个好的用户界面,它提 ...

  5. HDU 6053 ( TrickGCD ) 分块+容斥

    TrickGCD Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total ...

  6. TI C64X+通用库函数使用手册

    在使用前,当知悉以下几点: 函数进程由手动汇编而成,已充分发挥器件效率.同时TI对外提供C和线性汇编代码 对于个人一些特殊应用,DSPLIB可能会带来额外的cycle消耗 TI DSPLIB依平台和时 ...

  7. Linux下Oracle JDK替换Open JDK

    Oracle的产品需要Oracle JDK,但是Linux发行版附带的都是开源的Open JDK,这里给出的方法是在不删除原有Open JDK的情况下,安装Oracle JDK 环境 系统:CentO ...

  8. D3DXCreateTextureFromFile

    HRESULT D3DXCreateTextureFromFile( __in LPDIRECT3DDEVICE9 pDevice, __in LPCTSTR pSrcFile, __out LPDI ...

  9. RF、GBDT、XGBOOST常见面试算法整理

    1.  RF(随机森林)与GBDT之间的区别 相同点: 1)都是由多棵树组成的 2)最终的结果都是由多棵树一起决定 不同点: 1)  组成随机森林的树可以是分类树也可以是回归树,而GBDT只由回归树组 ...

  10. leetcode 【 Reorder List 】python 实现

    题目: Given a singly linked list L: L0→L1→…→Ln-1→Ln,reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→… You must do ...