zoukankan      html  css  js  c++  java
  • Spring基础知识自我扫盲

    目前在看Spring相关的漏洞,然额我只知道Spring是Java的一个框架,听说过IOC和AOP,其他一概不知>_<,咱怀着敬畏的心情,浅显的了解了一下Spring。

    Java的框架太多了,顺便把常用的都查了下到底都是干啥的>_<

    Java比较著名的框架

    MVC框架

    • struts1:最早的MVC框架,封装的是servlet,有很多bug和漏洞,完全被淘汰
    • struts2:其实跟struts1是完全不同的东东,基本被淘汰
    • springMVC:目前的主流

    持久层框架

    • hibernate:全自动的持久层框架。只需要建立配置文件,并配置好表之间的关系,就自动创建表了crud只需要调用相关方法即可,不需要写sql语句
    • mybatis:半自动持久层框架,需要自己写sql语句
    • JDBC:纯手动持久层框

     

    Spring基础知识

    Spring既不是MVC框架,也不是持久层框架,而是一个开源的整合型和设计型框架,它的两大核心是IOC和AOP。

    IOC(Inversion of Control):控制反转。是一种设计思想。Java在实现IOC的时候采用的设计模式是工厂模式

    DI(Dependency Injection):依赖注入。是Spring对IOC思想的实现方式

    AOP(AOP-Aspect Oriented Programming):面向切面的编程。Java在实现AOP的时候采用的设计模式是动态代理模式

    1. Spring的特性

    • 非侵入性:对Spring API的依赖性不强,意思就是使用Spring框架的时候,使用Spring的API和不使用Spring的API都可以跑起来
    • 依赖注入:控制反转(IOC)最经典的实现
    • 面向切面编程
    • 容器:Spring是一个容器,管理对象的生命周期
    • 组件化:Spring的组件就是Spring管理的对象
    • 一站式:整合各种开源框架和第三方类库(Spring自身的表述层是SpringMVC,持久层是Spring JDBC)

    2. IOC和DI

    关于Spring的IOC和DI的实现,个人的浅显理解是这样的:

    Spring有自己的配置文件(必须要有),默认命名为applicationContext.xml,长下面这个样子:

    具体的调用实现:

    3. AOP

    要了解AOP,首先要了解动态代理,因为Java是通过动态代理模式实现的AOP。

    网上参考的动态代理的例子:

    public interface Calculator {
    
        int add(int i,int j);
        int sub(int i ,int j);
        int mul(int i ,int j);
        int div(int i ,int j);
    }
    View Code
    public class CauculatorImpl implements Calculator {
        public int add(int i, int j) {
            return i+j;
        }
    
        public int sub(int i, int j) {
            return i-j;
        }
    
        public int mul(int i, int j) {
            return i*j;
        }
    
        public int div(int i, int j) {
            return i/j;
        }
    }
    View Code
    public class MyLogger {
    
        public static void before(String methodName, Object args) {
    
            System.out.println("method:" + methodName + ", arguments:" + args);
        }
    
        public static void after(String methodName, Object args) {
            System.out.println("method:" + methodName + ", arguments:" + args);
        }
    }
    View Code
    public class ProxyUtil {
    
        private Object calImpl;
    
        public ProxyUtil(Object calImpl){
            super();
            this.calImpl=calImpl;
        }
    
        public Object getProxy(){
    
            //使用当前类的类加载器
            ClassLoader loader=this.getClass().getClassLoader();
            //获取目标对象所实现的所有接口
            Class[] interfaces = calImpl.getClass().getInterfaces();
    
            //用JDK的Proxy类创建动态代理 - 前提是目标对象必须实现了接口
            //new InvocationHandler - 匿名内部类, InvocationHandler用来设置(通过invoke方法来设置)代理对象如何实现目标对象的方法
            return Proxy.newProxyInstance(loader, interfaces, new InvocationHandler() {
    
                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    
                    MyLogger.before(method.getName(), Arrays.toString(args));
                    Object result= method.invoke(calImpl,args); //这里代理对象通过调用目标对象的方法,才能保证代理产生的结果和目标对象要求的结果一致
                    MyLogger.after(method.getName(),result);
                    return result;
                }
            });
        }
    
    }
    View Code

    AOP的相关概念:

    • 横切关注点:咱理解为需要被多处使用的公共功能(比如上面例子中的日志功能)
    • 切面:把横切关注点抽取出来,用来封装横切关注点的类
    • 通知:个人理解为横切关注点被添加到切面之后,就叫通知(比如上面例子中Mylogger类中的before和after方法都是通知)
    • 代理对象:向目标对象应用通知之后创建的代理对象(比如上面例子中的ProxyUtil)
    • 目标对象:被通知的对象(比如上面例子中的Calculator)
    • 连接点:功能执行中的各个位置(如,前,后,异常抛出等)
    • 切入点:定义通知被应用的位置(在哪些连接点)。如果连接点是数据库中的记录,切入点就是查询条件

    嗯,反正我是被这些概念整晕了,说明AOP我理解的很不咋地。。。 

    AOP有专门的开源框架可以用,咱觉得目前理解到这里已经够用了,以后有时间再学习AOP框架吧>_<

     

     

  • 相关阅读:
    递推数列
    大数阶乘
    成绩排序
    DevC++ return 1 exit status
    POJ 1061 青蛙的约会
    ZOJ 2750 Idiomatic Phrases Game
    nyoj 545 Metric Matrice
    nyoj 308 Substring
    nyoj 515完全覆盖 II
    nyoj 1248 海岛争霸
  • 原文地址:https://www.cnblogs.com/sallyzhang/p/12378186.html
Copyright © 2011-2022 走看看