Spring是一个容器
Spring是一个开源的IOC和AOP框架,能够简化JavaEE开发。 Spring的核心是IOC(控制反转/依赖注入)实现松耦合,IOC的核心是容器,容器的核心是Java反射机制。 Spring的AOP技术是把核心代码和辅助性代码分开--面向切面编程,使开发者更关注于业务逻辑的开发。
一般主要是用来起IOC和AOP的功能,IOC(控制反转),只需写配置文件自动把类注入,不需要你写new了,使系统耦合度降低。AOP(面向切面编程),就是到了一个面上统一加上一些东西,功能一般用来配置事务的管理,这样你就不必每次用完PrepareStatement和ResultSet及Connection都要关闭,遇到异常都要回滚,配置即可,自动在你配置的要求执行的地方执行。
依赖注入:以前的web开发都是 web服务器给我什么我才能用什么 现在 我们可以通过依赖注入去主动的向web服务器去请求了 。
面向切面:就可以比喻成 现在我们在网游 我在游戏中的这个人物是不具备加血这个功能的 而游戏中现在提供了一个功能 就是通过一个门 你就会加血300 这个门就是一个切面 你可以想想一下 继承那快的东西 还有组合。
=====IoC,控制反转=====
容器的概念:容器是用来装其它对象的对象,除了装其它的对象,还要维护其它对象的关系。
代码片段1:
public class Container
{
public void init()
{
Speaker s = new Speaker();
Greeting g = new Greeting(s);
}
}
可以看到这里的Container类(容器)在初始化的时候会生成一个Speaker对象和一个Greeting对象,并且维持了它们的关系,当系统要用这些对象的时候,直接问容器要就可以了。这就是容器最基本的功能,维护系统中的实例(对象)。
代码片段2:
public void greet()
{
Speaker s = new Speaker();
s.sayHello();
}
代码片段3:
public void greet()
{
Spraker s = (Spraker)context.lookup("ejb/Spraker");
s.SayHello();
}
代码片段4:
public class Greeting()
{
public Spraker s;
public Greeting(Spraker s)
{
this.s = s;
}
public greet()
{
s.SayHello();
}
}
我们可以对比一下这三段代码。其中片段2是不用容器的编码,片段3是EJB编码,片段4是Spring编码。结合代码片段1,你能看出来Spring编码的优越之处吗?也许你会觉得Spring的编码是最复杂的。不过没关系,我在后面会解释Spring编码的好处。 这里我想先解释一下“依赖注入”。根据我给的例子可以看出,Greeting类依赖Speaker类。片段2和片段3都是主动的去获取Speaker,虽然获取的方式不同。但是片段4并没有去获取或者实例化Speaker类,而是在greeting函数中直接使用了s。你也许很容易就发现了,在构造函数中有一个s被注入(可能你平时用的是,传入)。在哪里注入的呢?请回头看一下代码片段1,这就是使用容器的好处,由容器来维护各个类之间的依赖关系(一般通过Setter来注入依赖,而不是构造函数,我这里是为了简化示例代码)。Greeting并不需要关心Speaker是哪里来的或是从哪里获得Speaker,只需要关注自己分内的事情,也就是让Speaker说一句问候的话。
=====AOP,面向切面编程=====
AOP的作用是解耦和,现在的系统往往强调减小模块之间的耦合度,AOP技术就是用来帮助实现这一目标的。举例来说,假如上文的Greeting系统含有日志模块,安全模块,事务管理模块,那么每一次greet的时候,都会有这三个模块参与,以日志模块为例,每次greet之后,都要记录下greet的内容。而对于Speaker或者Greeting对象来说,它们并不知道自己的行为被记录下来了,它们还是像以前一样的工作,并没有任何区别。只是容器控制了日志行为。这些模块是贯穿在整个系统中的,为系统的不同的功能提供服务,可以称每个模块是一个“切面”。其实“切面”是一种抽象,把系统不同部分的公共行为抽取出来形成一个独立的模块,并且在适当的地方(也就是切入点,后文会解释)把这些被抽取出来的功能再插入系统的不同部分。
从某种角度上来讲“切面”是一个非常形象的描述,它好像在系统的功能之上横切一刀,要想让系统的功能继续,就必须先过了这个切面。这些切面监视并拦截系统的行为,在某些(被指定的)行为执行之前或之后执行一些附加的任务(比如记录日志)。而系统的功能流程(比如Greeting)并不知道这些切面的存在,更不依赖于这些切面,这样就降低了系统模块之间的耦合度。