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