Spring入门(初识Spring)

提醒: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》,这是我的读后想记录的知识

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值