zoukankan      html  css  js  c++  java
  • 初识Spring

    什么是Spring:

    Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。

    Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson创建。

    简单来说,Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架。

    特点:

    1.方便解耦,简化开发

    通过Spring提供的IoC容器,我们可以将对象之间的依赖关系交由Spring进行控制,避免硬编码所造成的过度程序耦合。有了Spring,用户不必再为单实例模式类、属性文件解析等这些很底层的需求编写代码,可以更专注于上层的应用。

    2.AOP编程的支持

    通过Spring提供的AOP功能,方便进行面向切面的编程,许多不容易用传统OOP实现的功能可以通过AOP轻松应付。

    3.声明式事务的支持

    在Spring中,我们可以从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活地进行事务的管理,提高开发效率和质量。

    4.方便程序的测试

    可以用非容器依赖的编程方式进行几乎所有的测试工作,在Spring里,测试不再是昂贵的操作,而是随手可做的事情。例如:Spring对Junit4支持,可以通过注解方便的测试Spring程序。

    5.方便集成各种优秀框架

    Spring不排斥各种优秀的开源框架,相反,Spring可以降低各种框架的使用难度,Spring提供了对各种优秀框架(如Struts,Hibernate、Hessian、Quartz)等的直接支持。

    6.降低Java EE API的使用难度

    Spring对很多难用的Java EE API(如JDBC,JavaMail,远程调用等)提供了一个薄薄的封装层,通过Spring的简易封装,这些Java EE API的使用难度大为降低。

    7.Java 源码是经典学习范例

    Spring的源码设计精妙、结构清晰、匠心独运,处处体现着大师对Java设计模式灵活运用以及对Java技术的高深造诣。Spring框架源码无疑是Java技术的最佳实践范例。如果想在短时间内迅速提高自己的Java技术水平和应用开发水平,学习和研究Spring源码将会使你收到意想不到的效果。

     Spring的两大核心技术:

    • 控制反转(IOC:Inversion of Control)/依赖注入(DI:Dependency Injection)
    • 面向切面编程(AOP:Aspect Oriented Programming)

    控制反转:

         什么是IOC:这么讲吧,一个系统的运作肯定不是简单的几个类就可以实现的,它 往往需要多个类的合作来实现业务逻辑。这就使得每个对象都需要与其合作的对象具有 相互的关系(依赖关系)。在早前编程中所需要的依赖对象是通过自身去创建得到的, 而现在是通过一个容器来统一管理这些依赖关系。在这整个过程中,对象获得其他对象 引用的方式其实就是IOC。

          IOC的本质:控制权的转移。IoC原理是基于面向对象中的设计原则的Don't call us,we'll call you(别找我,我会来找你的)。可以这样讲,所有组件的初始化和调用都是由容器负责。在传统实现中类之间的关系是由类自己控制的(需要使用其他类时就自己创建),但是在IoC中,组件处在容器中,由容器统一管理和调度。这就是"控制反转"的概念所在:控制权由应用代码转移到了容器中,即控制权的转移。

     依赖注入:

         依赖注入的本质:上面说到控制反转IOC,是一个思想概念,但是也要具体实现的,上面的配置文件也是一种实现方式。依赖注入提出了具体的思想。

    依赖注入DI是Dependency Injection缩写,它提出了“哪些东东的控制权被反转了,被转移了”,它也给出了答案:“依赖对象的创建获得被反转”。所谓依赖注入,就是IoC容器在运行期间,动态地将某种依赖关系注入到对象之中

     面向切面编程:

    面向切面编程的本质:面向切面编程,指扩展功能不修改源代码,将功能代码从业务逻辑代码中分离出来。

           1主要功能:日志记录,性能统计,安全控制,事务处理,异常处理等等。

           2主要意图:将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码。

    Spring的优点:

    1.低侵入式设计,代码污染极低

    2.独立于各种应用服务器,基于Spring框架的应用,可以真正实现Write Once,Run Anywhere的承诺

    3.Spring的DI机制降低了业务对象替换的复杂性,提高了组件之间的解耦

    4.Spring的AOP支持允许将一些通用任务如安全、事务、日志等进行集中式管理,从而提供了更好的复用

    5.Spring的ORM和DAO提供了与第三方持久层框架的良好整合,并简化了底层的数据库访问

    6.Spring并不强制应用完全依赖于Spring,开发者可自由选用Spring框架的部分或全部

    Spring容器:

    Spring 设计的核心是 org.springframework.beans 包,它的设计目标是与 JavaBean 组件一起使用。这个包通常不是由用户直接使用,而是由服务器将其用作其他多数功能的底层中介。下一个最高级抽象是BeanFactory接口,它是工厂设计模式的实现,允许通过名称创建和检索对象。BeanFactory 也可以管理对象之间的关系。

    BeanFactory 支持两个对象模型。

    1、单态模型提供了具有特定名称的对象的共享实例,可以在查询时对其进行检索。Singleton是默认的也是最常用的对象模型。对于无状态服务对象很理想。

    2、原型模型确保每次检索都会创建单独的对象。在每个用户都需要自己的对象时,原型模型最适合。

    bean 工厂的概念是 Spring 作为 IOC 容器的基础。IOC 将处理事情的责任从应用程序代码转移到框架。

    墨盒练习:

    创建一个墨盒接口

    package cn.spring.ink;
    
    public interface ink {
        public  String getInk();
    }
    

    实现墨盒接口(彩色和黑白):

    实现彩色墨盒
    package cn.spring.ink;
    
    public class color implements  ink{
    
        @Override
        public String getInk() {
            return "彩色";
        }
    }
    
    实现黑白墨盒
    package cn.spring.ink;
    
    public class bw implements  ink{
        @Override
        public String getInk() {
            return "黑白";
        }
    }
    

    创建纸张接口:

    package cn.spring.paper;
    
    public interface paper {
    
        public  String getPaper();
    }
    

    实现纸张接口(A4,B5):

    实现A4接口
    package cn.spring.paper;
    
    public class A4  implements  paper{
        @Override
        public String getPaper() {
            return "A4";
        }
    }
    
    实现B5接口
    package cn.spring.paper;
    
    public class B5 implements paper {
        @Override
        public String getPaper() {
            return "B5";
        }
    }
    

    创建一个打印机类:

    package cn.spring.print;
    
    import cn.spring.ink.ink;
    import cn.spring.paper.paper;
    
    public class print {
    
        private ink ink;
        private paper paper;
    
        public cn.spring.ink.ink getInk() {
            return ink;
        }
    
        public void setInk(cn.spring.ink.ink ink) {
            this.ink = ink;
        }
    
        public cn.spring.paper.paper getPaper() {
            return paper;
        }
    
        public void setPaper(cn.spring.paper.paper paper) {
            this.paper = paper;
        }
    
        public  void  show(){
            System.out.println("您使用的是"+ink.getInk()+"墨盒,
    使用的是"+paper.getPaper()+"纸张。");
        }
    }
    

    在applicationcontextbean.xml配置

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd">
        <!--注入bean
            id相当于当前bean唯一标识
            class是bean 的全路径
            property注入bean中的属性         必须封装
        -->
        <bean id="colorInk" class="cn.spring.ink.color"></bean>
        <bean id="grayInk" class="cn.spring.ink.bw"></bean>
    
        <bean id="a4" class="cn.spring.paper.A4"></bean>
        <bean id="b5" class="cn.spring.paper.B5"></bean>
    
        <bean id="printer" class="cn.spring.print.print">
            <property name="ink" ref="colorInk"></property>
            <property name="paper" ref="a4"></property>
        </bean>
    
    </beans>
    

    测试:

    package cn.spring.test;
    
    import cn.spring.print.print;
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class printtest {
    
        @Test
        public void  test(){
            ApplicationContext context = new ClassPathXmlApplicationContext("applicationcontextbean.xml");
            print bean = (print)context.getBean("printer");
            bean.show();
        }
    }
  • 相关阅读:
    [转载] $CF652B$ 题解
    [转载] $Luogu$ $P4951$ 题解
    luoguP3723 HNOI2017 礼物
    动态dp学习笔记
    noip级别模板小复习
    noip2017简要题解。
    noip考前抱佛脚 数论小总结
    HDU 6071 Lazy Running
    POI2012 ODL-Distance
    [NOI2002]荒岛野人
  • 原文地址:https://www.cnblogs.com/wishsaber/p/11731524.html
Copyright © 2011-2022 走看看