如今各种Spring框架甚嚣尘上,但是终归还是属于spring的东西。所以在这里,个人谈一谈对spring的认识,笔者觉得掌握spring原理以及spring所涉及到的设计模式对我们具有极大的帮助。我们基于what ,why ,how来研究Spring。

Spring是什么?

Spring为什么?

如何使用Spring?

关于这三个问题可以先自行百度!!!针对这个3个问题提出以下几点。

Spring有三大地方值得注意:

1.IOC容器

2.IOC控制反转和DI依赖注入

3.AOP面向切面编程

首先谈一下这个IOC容器:

提到容器,我们最先就能想到的就是WEB容器,那么WEB容器是干什么的?WEB容器就是用来对servlet管理,创建,销毁等一些操作的东西。通俗的讲,servlet“住”在WEB容器,它的一切都与这个容器有关。所以IOC容器也有这么一个概念,但是他是用来管理Bean的,Bean之于Spring就相当于对象之于java。java是面对对象编程,而spring是面向Bean编程的。Spring IoC容器如何知道哪些是它管理的对象呢?这就需要配置文件,Spring IOC容器通过读取配置文件中的配置元数据,通过元数据对应用中的各个对象进行实例化及装配。一般使用基于xml配置文件进行配置元数据,而且Spring与配置文件完全解耦的,可以使用其他任何可能的方式进行配置元数据,比如注解、基于java文件的、基于属性文件的配置都可以。这就需要提出第二个概念IOC和DI了。

DI依赖注入:这里首先声明一点:IOC容器是一个容器,而IOC就是一个概念性的东西。这就好比,我是TOM,而TOMCAT就是TOM的猫而跟TOM这个人不是一个物种。

IOC是“Inversion of Control“的缩写,翻译过来就是控制反转。为什么说它是控制反转呢?我们可以用程序来描述一下:

public class WQ {int x; } 

这里有一个类WQ

平常我们要使用的话一般都是自己去创建一个

public static void main(String[] args) {WQ wq = new WQ();}

但是如果用Spring呢?

@Autowired
private WQ wq;

这里是基于注解的注入方式。加上这个注解IOC容器就会在Spring的配置文件中自行查找。这就相当于本来我们是全权来控制这个对象的,而在我们队这个对象添加了@Autowired之后,IOC容器就会自动去创建,这就相当于我们把控制权交给了IOC容器。所以就叫控制反转。可能有人会问为什么private属性的对象也可以呢?不好意思,Spring就是可以为所欲为。

但是,Spring并不是只有注解这一种方式,只是注解开发的效率高,所以基本都用注解开发了。DI依赖注入有4种方式:

①通过接口注入

这里的接口注入又分为两种模式:1.静态工厂模式 2.非静态工厂模式

创建需要实例化的类

类中必须带有无参构造器,因为IOC容器是通过反射的方式来创建对象的。

public class Car {public Car() {}private String brand;private double price;public Car(String brand, double price) {super();this.brand = brand;this.price = price;}public String getBrand() {return brand;}public void setBrand(String brand) {this.brand = brand;}public double getPrice() {return price;}public void setPrice(double price) {this.price = price;}
}

静态工厂模式:这种工厂模式必须先创建工厂类

public class StaticCarFactoty {private static Map<String , Car > cars = new HashMap<String ,Car>();static {cars.put("Audi", new Car("Audi",300000));cars.put("Ford", new Car("Ford",200000));}public static Car getCar(String name) {return cars.get(name);}
}

XML的配置

<!--class要写工厂的类;factory-method要写工厂类中用于创建bean的方法-->
<bean id="car1" class="com.wq.factory.StaticCarFactoty"factory-method="getCar">
<constructor-arg value="Audi"></constructor-arg>
</bean>

非静态模式:这要创建工厂类,并在XML中实例化工厂

public class InstanceCarFactory {private Map<String,Car> cars =null;public InstanceCarFactory() {// TODO Auto-generated constructor stubcars = new HashMap<String,Car>();cars.put("Audi", new Car("Audi",300000));cars.put("Ford", new Car("Ford",200000));}public Car getCar(String brand) {return cars.get(brand);}
}

XML配置

<!-- 通过实例工厂方法,需先实例工厂 -->
<bean id="Carfactory" class="com.wq.factory.InstanceCarFactory"></bean>
<!-- 配置bean -->
<bean id="car2" factory-bean="Carfactory" factory-method="getCar"><constructor-arg value="Ford"></constructor-arg>
</bean>

②通过Setter方法注入

XML配置

<bean id="car3" class="com.wq.enties.Car"><property name="brand" value="BMW"></property><property name="price" value="400000"></property>
</bean>

③通过构造器注入

XML配置

<bean id="car4" class="com.wq.enties.Car"><constructor-arg value="Benz" index="0"></constructor-arg><constructor-arg value="800000" index="1"></constructor-arg>
</bean>

这里构造器注入必须使在这个类中存在这个构造器,index表示该参数在构造器中是第几个。

也可以使用通过类型指定

<bean id="car4" class="com.wq.enties.Car"><constructor-arg value="800000" type="java.lang.Double"></constructor-arg><constructor-arg value="Benz" type="java.lang.String"></constructor-arg>
</bean>

④通过注解方式注入

就如同之前说的在需要实例化的类上添加@Autowired

最后就来讲一下AOP了

AOP是叫面向切面编程,主要是找到横切关注点。这段话说起来很绕口,实际上我们可以认为它是在找规律,或者直接说是找到一个合适的规则。AOP的核心思想就是独立开发,一起运行。用两个字来形容的话就是:解耦。

AOP就是从多个业务中找到相同的部分并他们模块化,并在需要使用到这些相同的模块的时候用注解的形式来添加,体现了可重用性。如日志的输出,事务的开启关闭等。

以上,就是个人对spring特点的浅谈,后续会增加从源码的角度来分析。

希望各路豪杰不宁赐教,有不同理解的可在下方评论区讨论。

转载于:https://www.cnblogs.com/Qiansion/p/9780658.html

1.1浅谈Spring(一个叫春的框架)相关推荐

  1. 浅谈:Spring Boot原理分析,切换内置web服务器,SpringBoot监听项目(使用springboot-admin),将springboot的项目打成war包

    浅谈:Spring Boot原理分析(更多细节解释在代码注释中) 通过@EnableAutoConfiguration注解加载Springboot内置的自动初始化类(加载什么类是配置在spring.f ...

  2. 由openSession、getCurrentSession和HibernateDaoSupport浅谈Spring对事物的支持

    由openSession.getCurrentSession和HibernateDaoSupport浅谈Spring对事物的支持 Spring和Hibernate的集成的一个要点就是对事务的支持,op ...

  3. 浅谈 Spring IOC

    浅谈 Spring IOC 什么是IOC 理解 IOC 和 DI Spring IOC 相关操作个人总结 什么是IOC Ioc-Inversion of Control,即"控制反转&quo ...

  4. 编程浅谈-以一个初出茅庐的Java程序员视角

    编者是一个从事Java开发的普通软件攻城狮,迄今为止,粗粗算来不过刚刚进入编程的世界不过两年,但在这两年的光阴里,每当我抬头仰望星空(苦命加班)时脑海里总有这样一个疑问--"什么是编程&qu ...

  5. 浅谈Spring定时任务

    浅谈Spring定时任务 三种定时任务基于原理 多定时任务并发配置 动态定时任务 定时任务Demo 三种定时任务基于原理 SpringBoot配置定时任务主要有Spring Schedule.JDK自 ...

  6. 浅谈Spring IOC的理解

    浅谈Spring IOC的理解 学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊 ...

  7. 浅谈 Spring IOC和AOP

    浅谈 Spring IOC和AOP IOC 控制反转 以前创建对象的主动权和时机是由于自己把握的,现在将这种权利转移到Spring容器中,并且根据配置文件去创建对象管理对象 ioc的注入方式有三种:构 ...

  8. 浅谈Spring IOC和DI及Spring工厂类

    浅谈Spring IOC和DI及Spring的工厂类 文章目录 浅谈Spring IOC和DI及Spring的工厂类 一. IOC 1.什么是IOC 2.为什么使用IOC 传统开发模式的弊端 3. 使 ...

  9. 浅谈Spring MVC知识

    关于MVC框架,我相信大家都不陌生,都会说也就是模型-视图-控制器这三层的框架结构,如果你参加面试的时候考官会问:"MVC框架是什么?你说一说."其实我们都知道这个问题还需要问的, ...

  10. 浅谈Spring的Bean生命周期和作用域

    学习spring有一段时间了.有的人说Spring的发展就是Java的发展,Spring就是Java的半壁江山,而且AOP思想更是OOP思想的一种扩展和延申.所以今天来浅谈一下spring的生命周期和 ...

最新文章

  1. hbase shell 查看列名_Hbase的简单命令使用
  2. [原创]存储过程里面的递归
  3. BZOJ1001 狼抓兔子
  4. 还在用Matplotlib? 又一可视化神器pyecharts登场
  5. 《构建之法》阅读第四章、第十七章收获
  6. 静态和动态web的区别与联系
  7. was css,Sass无效的CSS…:期望的表达式(例如,1px,粗体),是“{”
  8. Gym 101915J(并查集)
  9. 大数据_MapperReduce_Hbase配置参数说明_以及部分源码说明---Hbase工作笔记0031
  10. 最新的CocoaPods的使用教程(一)
  11. Python redis 批量模糊删除keys
  12. 解决新电脑的系统安装问题:针对BIOS的UEFI模式
  13. PHP发微信消息必须开网吗,关于php微信订阅号开发之token验证后自动发送消息给订阅号但是没有消息返回的问题...
  14. cudnn下载与安装
  15. 基于单片机的公交车系统
  16. Java完成excel表格导出
  17. 嵌入式 linux 之 Lzma 移植
  18. 笔记本UIOP几个键总是输入数字的问题
  19. SAP中文档管理用户需求与简要分析笔记
  20. 手机信号排行榜出炉!教你一招查看、提升手机信号

热门文章

  1. SQLAlchemy基本使用
  2. 记一次物理服务器Linux系统中未找到网卡的处理方式
  3. XPath 基本语法
  4. 帆软关于排名公式、分组排名问题开窗函数
  5. 计算机报名登录服务器超时,登录服务器超时
  6. 一般性网络错误 请检查网络文档_“网络工程团队”公众号投稿须知!
  7. 加速晶圆代工业务创新 开创智能互联世界
  8. 网络医疗的进步让智能穿戴设备找到市场新蓝海
  9. 线性代数与矩阵论 定理 1.3.9 唯一析因定理
  10. one hot encoding