Spring 的学习

1.Spring的简介
为了降低Java开发的复杂性,Spring采取了以下4中策略:
(1)基于POJO的轻量级和最小侵入性编程
(2)通过依赖注入和面向接口实现松耦合
(3)基于切面和惯例进行声明式编程
(4)通过切面和模板减少样板式代码

2. 基于POJO的轻量级和最小侵入性编程
Spring竭力的避免因自身API而弄乱项目的代码,他不会强迫你实现Spring规范的接口或者继承Spring的类,我们自己编写的java类在Spring之外也可以完好的运行,所以Spring提供的一种非引入性或者最小引入性的编程。

3. 依赖注入
(1)定义一个工具类
package cn.wz.hello;
public class RadioTool
{
public void Say(String Message)
{
System.out.print(Message);
}
}

(2)定义一个HelloWord类
package cn.wz.hello;

public class HelloWord
{
/*
* 定义说话的工具
* /
private RadioTool radiotool;
public RadioTool GetSayTool()
{
return radiotool;
}
public void SetSayTool(RadioTool rad)
{
this.radiotool = rad;
}
/

* 向世界问好
* */
public void SayHellWord()
{
//使用工具说"Hello Word!"
radiotool.Say(“Hello Word!”);
}
}

(3)实现
package cn.wz.hello;
public class Main {
public static void main(String[] args)
{
//定义HellWord对象
HelloWord hw = new HelloWord();
//定义RadioTool对象
RadioTool radio = new RadioTool();
//把工具对象赋给HelloWorld对象hw
hw.SetSayTool(radio);
hw.SayHellWord();
}
}
依赖注入的解释:
(1)我们构造一个RadioTool的实例并通过setSayTool()方法赋给HelloWorld实例,这个过程就是一种依赖注入
(2)谁依赖谁:HelloWord依赖RadioTool
为什么依赖?:主要是由于HelloWord需要RadioTool提供对象radio需要的外部资源(SetSayTool))
(3)谁注入谁:RadioTool注入radio对象(radio对象是HelloWord所依赖的)
注入了什么?:注入了radio对象所需的外部资源(SetSayTool)
(4)缺点:
如果有一天我们需要更换新的工具,我们就必须重新编写代码。代码维护性就比较差。为了更好的解除HelloWorld和RadioTool之间的耦合性,我们需要引入面向接口的编程

(a)首先我们定义通用的工具类接口:
package cn.wz.hello;
public interface SayTool
{
public void say(String Message);
}

(b)然后我们修改之前的RadioTool类,让它继承SayTool接口
package cn.wz.hello;

public class RadioTool implements SayTool
{
//实现say方法
public void say(String Message)
{
System.out.print(Message);
}

}

(c)修改HelloWorld类
package cn.wz.hello;

public class HelloWord
{
//定义说话工具
private SayTool saytool;
public HelloWord(SayTool saytool)
{
this.saytool = saytool;
}
/*
* 向世界问好
* */
public void sayHello()
{
saytool.say(“Hello Word!”);
}
}
(d)Main方法
package cn.wz.hello;

public class MainSpring {
public static void main(String[] args)
{
/*
* (1)谁依赖谁:HelloWord依赖SayTool接口,消除了HelloWord 与 RadioTool的耦合度,此时
* 可以任意更换SayTool接口的具体实现的方法,而不用在重新编写代码。
* (2)通常情况下我们定义接口变量,并通过实例化具体的实现类来给接口对象赋予具体的实现。
* 这种创建应用组件之前的协作的行为通常称为装配
* */
//定义RadioTool对象
RadioTool radio = new RadioTool();
//定义HellWord对象
HelloWord hw = new HelloWord(radio);
//把工具对象赋给HelloWorld对象hw
hw.sayHello();
}
}
这里我们之前依赖的RadioTool更换成了SayTool接口对象,HelloWorld类与SayTool接口之间耦合,而不是与具体的SayTool接口实现类来耦合,我们可以很方便的替换实现方式。

我们定义了RadioTool 的SayTool接口的具体实现类,HelloWorld类中依赖的是SayTool接口,所以可以很方便的更换具体的实现,而不用再重新编写代码。

通常情况下我们定义接口变量,并通过实例化具体的实现类来给接口对象赋予具体的实现,这种创建应用组件之前的协作的行为通常称为装配,针对给接口提供哪一个具体的实现,也就是装配哪一种具体的实现bean,在Spring中提供了多种方式,主要包括3种:

(1)在XML中进行显式的配置
(2)在Java类中进行显式的配置
(3)隐式的bean发现机制和自动装配

参考:https://www.cnblogs.com/junhu0707/p/5909778.html

猜你喜欢

转载自blog.csdn.net/weixin_42631192/article/details/85763780