初识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();
    }
}
原文地址:https://www.cnblogs.com/wishsaber/p/11731524.html