美文网首页
Spring实战随笔(一) 核心概念

Spring实战随笔(一) 核心概念

作者: 面包树_A | 来源:发表于2018-05-08 11:26 被阅读0次

    - Bean发展历史

    JAVA bean:
    • 要有默认构造函数
    • 所有属性都是private的
    • 提供getter setter
    • 实现了serializable接口可以序列化
      这个最简单的java bean开始出现是为了java gui可视化编程用的。
    EJB

    在实际企业开发中,需要实现事务,安全分布式,javabean就不好用了。sun公司就开始往上面堆功能,这里java bean就复杂为EJB。

    POJO

    EJB很强大,但是太重了,没有必要每次都用。此时出现了DI、AOP技术,通过简单的java bean也能完成EJB的工作,这是java bean简化为POJO,其实就是普通的java bean,不过融合了DI、AOP技术。

    Spring

    Spring诞生了,Spring赋予POJO魔力的方式之一就是用DI来装饰它。
    Spring做的就是简化JAVA开发

    - DI(Dependency Injection)依赖注入

    没有什么神奇的,简单的譬如说构造器注入,就是构造器传入参。
    还可以通过xml将参数注入,类似下面的方式注入request被声明为spring的bean了,这种行为也称之为装配,把request、arg、value装配到一起了。

    DI.png

    DI的好处: 像示例中,knight对象不需要关注是什么类型的request,也不用关注request来自哪里,spring通过配置,就能知道他们的依赖关系,这样就避免强耦合,对象不需要管理或者创建这个依赖关系。

    Q:这个装配的工作是怎么实现的呢?
    A:Spring通过Application Contex(应用上下文)来装载bean的定义并且组装起来。这些都是由Spring来做的工作,Spring本身也有很多Application Context的实现,用来组装bean。

    Application Context

    上述例子中是通过XML文件配置的,所以选择的是ClassPathXmlApplicationContext。所以在该Spring的main方法中要调用ClassPathXmlApplicationContext来加载xml文件,并获得knight对象。

    public static void main(String[] args){
      ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("**/**/**.xml");
      Knight knight = ctx.getBean(Knight.class);
      …………
      ctx.close();
    }
    

    Q:DI和IoC的关系?
    A:IoC是目标,DI是方法,通过DI来实现IoC。DI通常有构造器注入和setter注入。

    - AOP

    把和业务无关的事务处理(安全、日志……)等独立模块抽离出来,不和业务逻辑交织在一起,并且各个组件的非业务模块能重用。
    AOP能保持POJO的简单性。AOP的xml实现:

    AOP.png

    这里使用了AOP的配置命名空间,minstrel声明为一个切面,pointcut定义了切入点。(切入点的表达方式是AspectJ)
    所以通过这样的xml配置就可以声明spring的切面,并且在knight中不需要写代码去调用mistrel就可以实现了。

    - 模板

    Spring提供了多种多样的模板来消除重复的样式代码,非常典型的就是JdbcTemplate。
    以往的JDBC实现需要写一大堆创建数据库连接、捕获数据库异常、清理数据……的代码,每做一次数据库操作可能都要try catch一大堆代码,不光JDBC,其他的JMS、JNDI、REST一样有这样的问题。这些重复的样式代码太多了,导致核心的业务代码逻辑反而不被突出。
    所以Spring提供了模板,例如提供了jdbcTemplate.queryForObject方法,把重复的样式代码封装在了jdbcTemplate里面,所以写代码的时候不需要关心这些样式代码,直接调用jdbcTemplate就行。

    JdbcTemplate.png
    学习了Spring如何通过DI、AOP、模板来简化java中的复杂开发,这些都是基于在xml中配置bean和aspec来做的,但是xml文件是如何被加载,又是被加载到哪里去了,这些就是[容器]来解决的。

    - 容器

    Spring中所有对象都生存在容器中,容器负责创建、装配、配置并管理对象的整个生命周期(从new到finalize)。

    Spring容器的归纳为2种实现方式:

    • bean工厂
      org.springframework.beans.factory.BeanFactory最简单的容器,提供基本DI支持。一般现在太简单不用。
    • ApplicationContex
      org.springframework.context.ApplicationContext基于BeanFactory构建,提供框架级别的服务(例如发布事件给感兴趣的监听者),一般都用这个。上面的例子中就是通过ClassPathXMLApplicationContext来配置加载bean,ApplicationContext准备就绪后,就可以通过getBean来获取bean。这样就等于创建好了一个容器。

    - W3CSchool参考链接

    相关文章

      网友评论

          本文标题:Spring实战随笔(一) 核心概念

          本文链接:https://www.haomeiwen.com/subject/okbbhftx.html