1.1浅谈Spring(一个叫春的框架)
如今各种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 stub
cars = 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特点的浅谈,后续会增加从源码的角度来分析。
希望各路豪杰不宁赐教,有不同理解的可在下方评论区讨论。
1.1浅谈Spring(一个叫春的框架)的更多相关文章
- 浅谈Spring中的Quartz配置
浅谈Spring中的Quartz配置 2009-06-26 14:04 樊凯 博客园 字号:T | T Quartz是一个强大的企业级任务调度框架,Spring中继承并简化了Quartz,下面就看看在 ...
- 浅谈Spring的两种配置容器
浅谈Spring的两种配置容器 原文:https://www.jb51.net/article/126295.htm 更新时间:2017年10月20日 08:44:41 作者:黄小鱼ZZZ ...
- 浅谈Spring MVC知识
关于MVC框架,我相信大家都不陌生,都会说也就是模型-视图-控制器这三层的框架结构,如果你参加面试的时候考官会问:“MVC框架是什么?你说一说.”其实我们都知道这个问题还需要问的,只要你是一个开发人员 ...
- 浅谈Spring(一)
一.Spring引言 Spring是一款轻量级框架,代码入侵量很小,并且还是众多优秀的设计模式的组合(工厂.代理.模板.策略). 特点: 1.方便解耦,简化开发 通过Spring提供的IoC容器,我们 ...
- 浅谈Spring发展史
1 码农的春天----------Spring来了 Spring官网 :http://www.springframework.org 关于Spring的发展起源要回溯到2002年,当时正是Java E ...
- 浅谈spring 声明式事物
此处主要讲讲事物的属性. 事物属性包含了五个方面: 1.传播行为 2.隔离规则 3.回滚规则 4.事物超时 5.是否只读 一.传播行为 事务的第一个方面是传播行为(propagation behavi ...
- 浅谈spring security 403机制
403就是access denied ,就是请求拒绝,因为权限不足 三种权限级别 一.无权限访问 <security:http security="none" pattern ...
- [SSH 3]以网上商城项目浅谈spring配置
导读:在做ITOO项目的时候,就用到了容器+反射,从而运用了依赖注入和依赖查找.如果看过WCF端的配置文件,那么对于这个spring的配置就很容易理解.本篇博客,是对于自己做的一个小项目中所运用到的s ...
- 浅谈Spring(四)
一.Spring+MyBatis整合 spring大大简化了Mybatis的开发步骤. 1.MyBatis的开发要点: mybatis-config.xml配置文件:配置与数据库的链接.mapper文 ...
随机推荐
- C# -- 结构、访问修饰符
C# -- 结构.访问修饰符 1. 结构: struct 类型 对于结构,不像类那样存在继承. 一个结构不能从另一个结构或类继承,而且不能作为一个类的基. 但是,结构从基类 Object 继承. 结构 ...
- LeetCode算法题-Reshape the Matrix(Java实现)
这是悦乐书的第264次更新,第277篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第131题(顺位题号是566).在MATLAB中,有一个非常有用的函数叫做'reshap ...
- sizeof和strlen()区别及用法
//sizeof是以字节为单位计算变量或类型所占内存大小,它是属于C语言运算符系列:而strlen()是一个函数,是计算字符串长度(也是以字节为单位,但略有区别):比如: char array[] = ...
- C#/.NET基于Topshelf创建Windows服务程序及服务的安装和卸载(极速,简洁)
本文首发于:码友网--一个专注.NET/.NET Core开发的编程爱好者社区. 文章目录 C#/.NET基于Topshelf创建Windows服务的系列文章目录: C#/.NET基于Topshelf ...
- devmem读写物理内存和devkmem读取内核虚拟内存
关键词:/dev/mem./dev/kmem.mmap.__va.__pa.remap_pfn_range等等. 在日常工作中常有直接操作寄存器或者某一物理地址的需求,busybox中提供了devme ...
- Foundation框架 - 结构体
一.基础知识 如果要想使用 Foundation 框架的数据类型,那么包含它的主头文件就可以了.即 #import <Foundation/Foundation.h> 补充: Core F ...
- Spring+SpringMVC+Hibernate小案例(实现Spring对Hibernate的事务管理)
原文地址:https://blog.csdn.net/jiegegeaa1/article/details/81975286 一.工作环境 编辑器用的是MyEclipse,用Mysql数据库,mave ...
- JS 函数节流与防抖
前言 事件的触发权很多时候属于用户,可能会出现下列问题: 向后台发送数据,用户频繁触发,对服务器造成压力: 一些浏览器事件,如window.onresize,window.mousemove等,触发的 ...
- PS快速祛除脸上小雀斑
首先我们要把图片放到PS软件中,然后在PS左侧工具栏中找到污点修复画笔工具(J), 配合着污点修复画笔中的修补工具一起使用,注意:模式要选择正常,属性栏中类型要选择内容识别. 下一步我们需要在图层上添 ...
- JVM内存区域详解
本文分为两部分:一是JVM内存区域的讲解:二是常见的内存溢出异常分析. 1.JVM内存区域 java虚拟机在执行java程序的过程中会把它管理的内存划分为若干个不同的数据区域,这些区域都有各自的用途, ...