提醒:Java基础学好再来看~~~~
看完文章你应该知道的:
了解依赖注入,知道什么是AOP,以及Spring的优势
spring的优势
1.简化开发
简化开发是Spring的根本使命,它不仅仅局限于服务端开发,任何Java应用都能在简单性,松耦合性等方面从Spring中受益。
为了降低Java开发的复杂性,Spring采取了以下四个策略:
- 基于POJO的轻量级和最小侵入性编程;
- 通过依赖注入和面向接口实现松耦合;
- 基于切面和惯例进行声明式编程;
- 通过切面和模板减少样板式代码。
基于POJO的轻量级和最小侵入性编程
Spring的非侵入编程模型意味着这个类在 Spring应用和非Spring应用中都可以发挥同样的作用。比如:
public class HelloWorld {
public String say(){
return "Hello";
}
}
看,它就是一个简单的类——POJO,无论是在框架中或是非框架中都可以使用。
通过依赖注入和面向接口实现松耦合
依赖注入,以下我都叫做DI。听起来会很高大上很复杂,其实不然,以下我将用代码来演示。
不使用DI:
public interface Phone {
void play();
}
//分割线
public class HuaWeiPlayGame {
void huaWeiplay(){
System.out.println("玩王者荣耀");
}
}
//分割线
public class HuaWei implements Phone {
private HuaWeiPlayGame huaWeiPlayGame;
public HuaWei(){
this.huaWeiPlayGame = new HuaWeiPlayGame();
}
@Override
public void play(){
huaWeiPlayGame.huaWeiplay();
}
}
这样我们可以看出来HuaWei和HuaWeiPlayGame紧密的耦合在了一起,如果让HuaWei完成拨打电话这个动作它都不会了。
使用DI:
public class HuaWei implements Phone {
private Function function;
public HuaWei(Function function){
this.function=function;
}
@Override
public void play(){
function.huaWeiplay();
}
}
//分割线
public interface Function {
public void huaWeiplay();
//………………其他功能()
}
//分割线
public class HuaWeiPlayGame implements Function{
@Override
public void huaWeiplay(){
System.out.println("玩王者荣耀");
}
}
//分割线
//…………其他功能的继承
新建立一个Fuction接口让其他功能实现它,所以当你想用什么功能的时候,直接传入它对应的功能就行了(注意一定是实现Fuction接口的类)
这就是DI的方式之一:构造器注入。这就是DI的最大收益——松耦合。
基于切面和惯例进行声明式编程
这就要讲到Spring的另一个重点——面向切面编程(aspect-oriented programming,AOP)。比如我现在要把项目中每个方法都写一个特殊的日志(或是其他),按照传统的方法,我们要对每一个方法进行修改或是重构很多代码,麻烦的很。但是在Spring中(抑或说是使用动态代理),我们可以对代码进行横向扩展,或者说叫功能增强,这样就可以在不影响原代码的基础上去添加功能。添加日志也不是我们业务的核心功能,但是却也是不得不要的,使用aop可以使我们更关心核心业务逻辑。
AOP能够使服务模块化,并确保POJO的简单性。
通过切面和模板减少样板式代码
比如我们要写JDBC这种牵扯到大量样板式的代码。我们其实只关注我们的sql语句(也就是它要实现什么功能),我们可不想看到他是如何连接的。等我们写好核心之后再去用切面进行连接,断开等。是不是方便了很多~~~
稍微给一下Java实现动态代理的代码
public class App {
public static void main(String[] args) {
Person o = (Person)getProxy(new Person());//不管你放哪个对象的都可以
o.eat();
}
public static Object getProxy(Object object){
InvocationHandler handler = new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) {
//你可以为所欲为的在方法之前做事之前,
System.out.println("拿出碗筷");
Object invoke = method.invoke(object, args);
//你可以为所欲为的在方法之后做事之前
System.out.println("拉个臭屎");
return invoke;
}
};
Object proxy = Proxy.newProxyInstance(
object.getClass().getClassLoader(),
object.getClass().getInterfaces(),
handler);
return proxy;
}
}
//输出
拿出碗筷
吃
拉个臭屎
本来想写多点的,写博客真累,希望能坚持吧,明天再写。如果有不对的地方,请指出~~~
文章启蒙自《Spring实战4》,这是我的读后想记录的知识