Spring框架 介绍以及用法 ,优缺点

开发工具STS--IDE的选择
        STS即Spring Tool Suite,下载地址: http://spring.io/tools。简单的说STS是基于eclipse开发环境的客制化用来开发Spring应用程序,建议
    使用。
        STS是基于Eclipse构建的,Eclipse有的功能它都有,并且集成了Spring以及一些常用的插件,例如Git,GitHub,Roo, Pivotal tc Server等,
     它不仅仅是简单的将插件集成进去,而是提供了一个Spring开发中的完整解决方案,可以在很大程度上简化Spring相关应用的开发。
             推荐版本是2015年7月发布的3.7版本,主要更新:将eclipse版本更新至Eclipse Oxygen 4.7.3 GA、Spring Boot(JavaEE开发的颠覆者集大成者,
     推荐大家学习)的配置语言YAML编辑器的支持(包含自动提示,鼠标悬停,代码导航以及错误和警告)、云平台Cloud Foundry支持的提升、Pivotal tc
     Server(一款基于tomcat的servlet容器,内置在STS中)、Spring Roo支持

设计模式
    是指由专家总结出来的在某种情况下解决某类问题的最佳解决方案。是思想,是知识,抽象的
    
设计模式的六大原则:
    单一职责原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特法则、开闭原则

框架
    是用于处理某种问题的半成品软件,供开发人员通过定制进行高效开发.是工具

JavaSE的设计模式
    什么是GOF(四人帮,全拼 Gang of Four)?
        在1994年由四人合著出版了一本名为Design Patterns - Elements of Reusable Object-Oriented Software(设计模式 -
    可复用的面向对象软件元素)的书,该书首次提到了软件开发中设计模式的概念。
        GOF总结了JavaSE开发中常见的23种设计模式,可以分为3大类:创建型模式、结构型模式、行为型模式

    JavaEE模式目前缺乏统一的说法。
        JavaEE设计模式特别关注表示层,如MVC模式(MVC Pattern)另外有 数据访问对象模式DAO(Data Access Object Pattern)  
    前端控制器模式(Front Controller Pattern)       ... ...

OOP的核心是面向抽象编程,面向抽象编程的核心是面向接口

接口的实现可能有多个,如何实现在多个接口具体实现之间进行切换,方法:使用工厂模式

IA a = new AImpl()然后通过a来调用接口的方法,对于C来说是主动实例化对象,直接获取依赖.
这种实现方法的缺点:
a、更换实现需要重新编译源代码
b、很难更换实现,很难测试
c、耦合实例生产者和实例消费者

工厂模式 [用途   应用场景(优缺点) 编码实现]
    设计模式属于创建型模式,它提供了一种创建对象的最佳方式
    主要解决:主要解决接口实现的选择问题。
    
    抽象角色:
        public interface IShape {
            void draw();
        }
        
    多种实现:产品角色
        public class Circle implements IShape {
            public void draw() {
                System.out.println("圆形");
            }
        }    
    
    工厂角色:
        public class ShapeFactory {
            public IShape getShape(String type){
                if("circle".equals(type))
                    return new Circle();
                return null;
            }
        }
    
    DAO种使用的是工厂模式的退化版本:静态工厂方法模式
    
    优点:
        1、一个调用者想创建一个对象,只要知道其名称就可以了。
        2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
        3、屏蔽产品的具体实现,调用者只关心产品的接口。
    缺点:
        每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,
        在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。
    
工厂模式中产品可扩展,但是产品只能一种系列
    抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。
这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
    主要解决:提供一个创建一系列相关或相互依赖对象的接口,解决接口实现选择的问题。
    
        public abstract class AbstractFactory {
           public abstract Color getColor(String color);  生产产品方法1,用于生产Color接口的实现
           public abstract Shape getShape(String shape) ;  生产产品方法2,用于生产Shape接口的实现
        }        
        
    
    优点:
        当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
    缺点:
              产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。

产品的系列不可扩展,引入资源文件,使用反射创建字串所指代的对象
    public class MyFactory {
        private static final Properties ps = new Properties();
        private static final Logger logger = LoggerFactory.getLogger(MyFactory.class);
    
        public static Object getImpl(String type) {
            loadProperties();
            if (ps.containsKey(type)) {
                String className = ps.getProperty(type);
                try {
                    return Class.forName(className).newInstance();  使用反射创建对应的对象,这里要求类中必须有对应的无参构造器可以访问
                } catch (Exception e) {
                    logger.error(e.getMessage());
                }
            }
            return null;
        }
    
        private static void loadProperties() {
            if (ps.isEmpty())
                try {
                    InputStream is = MyFactory.class.getResourceAsStream("produce.properties");
                    ps.load(is);
                } catch (Exception e) {
                    logger.error(e.getMessage());
                }
        }
    }
    
    调用的方法:
        IProduce p=(IProduce)MyFactory.getImpl("produce");

properties文件在IDE中缺乏语法检查,所以考虑采用xml作为配置
    
什么是 XML?
    XML指可扩展标记语言(EXtensible Markup Language),HTML是一种定标记语言
    XML是一种标记语言,很类似 HTML
    
    XML的设计宗旨是传输数据(webService),而非显示数据;html是显示数据
    
    XML标签没有被预定义。您需要自行定义标签。xml的语法说明一般有dtd和schema(xsd)2种
        xml文件可分为:无效(没有遵守基本规则)、有效(没有语法说明)、良构
    XML被设计为具有自我描述性。

XML的解析:
    常见的有2种解析模型:SAX和DOM
    常见的解析工具有:DOM4j/jdom/xpull...,SUN为了规范xml文件解析提出了JAXP规范(javax.xml.parsers)
    
    <?xml version="1.0" encoding="UTF-8"?>
    <beans>
        <bean id="product" class="com.yan.test4.ProduceImpl"/>
    </beans>
    
    public class BeanFactory {
        private static final Map<String, Object> map = new HashMap<String, Object>();
    
        private BeanFactory() {
        }    
        static {
            try {
                parseXML();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        public static Object getBean(String key) {
            if (map.containsKey(key))return map.get(key);  额外获取了单例的效果
            return null;
        }
        private static void parseXML() throws Exception {
            SAXParserFactory fac = SAXParserFactory.newInstance();
            SAXParser parser = fac.newSAXParser();
            parser.parse("beans.xml", new DefaultHandler() {
                @Override
                public void startElement(String uri, String localName,String qName, Attributes attributes) throws SAXException {
                    if ("bean".equals(qName)) {
                        try {
                            String id = attributes.getValue("id");
                            String className = attributes.getValue("class");
                            Object obj = Class.forName(className).newInstance();
                            map.put(id, obj);
                        } catch (Exception e) {
                            throw new SAXException(e.getMessage());
                        }
                    }
                }
    
            });
        }
    }
    
Spring框架最重要是提供了以类似上面xml+BeanFactory的方式管理配置在xml文件中的受管Bean

Hello Spring
    Spring的IoC容器将面向接口的编程代价降到了最低
    
    1、添加jar包
        spring-core spring-context spring-context-support  spring-beans  spring-expression(SpEL)
        
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>5.0.8.RELEASE</version>
        </dependency>
    
    2、定义核心配置文件,实际上文件名称没有规定,一般位于src根目录下,名称为applicationContext.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="produce" class="com.yan.test4.ProduceImpl"/>
        </beans>
        
    3、通过Spring获取配置的bean对象
        Resource r = new ClassPathResource("applicationContext.xml");
        BeanFactory fac = new XmlBeanFactory(r);
        IProduce p=(IProduce) fac.getBean("produce");
        System.out.println(p);    
        
        
什么是Spring
Spring是一个轻量级的控制反转IoC/DI依赖注入和面向切面AOP的开源容器框架,是一个开源的Java/Java EE全功能栈full-stack的应用程序框架,以Apache许可证形式发布
它由Rod Johnson创建。它是为了解决企业应用开发的复杂性而创建的, 2002年Rod Johnson在他的Expert One-On-One Java EE Design and Development一书中首次发布了这个框架,并奠定了作者的大师地位。该框架也可以移植到.NET的环境下。
Spring框架本身并没有强制实行任何特别的编程模式。在Java社区里,Spring作为EJB模型之外的另外一个选择甚至是替代品而广为流行。从设计上看,Spring给予了Java程序员许多的自由度,但同时对业界常见的问题也提供了良好的文档和易于使用的方法。
Spring框架的核心功能在任何Java应用中都是适用的。在基于Java企业平台上的web应用中,大量的拓展和改进得以形成。为此,Spring获得了广泛的欢迎,并被许多公司认可为具有战略意义的重要框架。

Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情[声明式事务管理  SessionBean会话bean用于封装业务处理逻辑  EntityBean实体bean用于封装数据访问逻辑{BMP是bean管理的持久化,CMP容器管理的持久化} MessageDrivenBean消息驱动bean用于实现异步的逻辑处理]。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益


Spring的发展历程
    2000年Spring框架最开始的部分是由Rod Johnson于2000年为伦敦的金融界提供独立咨询业务时写出来的。在2002年编著的《Expert one on one J2EE design and development》一书中,对Java EE 系统框架臃肿、低效、脱离现实的种种现状提出了质疑,并积极寻求探索革新之道。发布了自己的代码(interface21)以阐述“如何让应用程序能以超出当时大众所惯于接受的易用性和稳定性与J2EE平台上的不同组件合作”的观点
    2003年2月,一批自愿拓展Spring框架的程序开发人员组成了团队,在Sourceforge上构建了一个项目。
    2003年6月,Spring的框架首次在Apache 2.0的使用许可中发布。
    2004年3月在Spring框架上工作了一年之后,这个团队发布了第一个版本(1.0)。
    2005年,Spring框架的开发人员成立了自己的公司,来提供对Spring的商业支持,其中最显著的就是与BEA的合作。
    2009年VMware以4.2亿美元收购SpringSource,Spring开始向云计算方向发展。通过与VMware的合作计划为数据中心、私有云及公共云创建一个独立、集成同时又融合了构建、运行及管理于一身的解决方案。
    Springboot  springdata springcloud


IoC是什么 ?
IoC -- Inversion of control, 控制反转。在Java开发中,IoC意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。IoC是一种让服务消费者不直接依赖于服务提供者的组件设计方式,是一种减少类与类之间依赖的设计原则.

IoC能干什么?
IoC不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合、更优良的程序。传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类之间高耦合,难于测试; 有了IoC容器后, 把创建对象和查找依赖对象的控制权交给了容器, 由容器进行注入组合对象, 所以对象与对象之间是松散耦合, 这样也方便测试, 利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活.
其实,IoC对编程带来的最大改变不是从代码上,而是从思想上,发生了"主从换位"的变化,应用程序原本是老大,要获取什么资源都是主动出击,但是在IoC/DI思想中,应用程序就变成被动的了,被动的等待IoC容器来创建并注入它所需要的资源了.


DI是什么?
DI -- Dependency Injection,依赖注入。即组件之间的依赖关系由容器在运行期决定,形象的来说,即由容器动态的将某种依赖关系注入到组件之中. 依赖注入的目标并非为软件系统带来更多的功能,而是为了提升组件重用的概率,并为系统搭建一个灵活、可扩展的平台。通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不用关心具体的资源来自何处、由谁实现.

控制反转和依赖注入之间是同一个概念吗?
它们不是同一个概念,但是它们是同一个概念的不同角度的描述。
控制反转(IoC)从 IoC容器的角度来说
依赖注入(DI) 从应用程序的角度来说

Ioc/DI的基本思想:
1、把程序之间的依赖关系去掉
2、把程序对象设置到IoC/DI容器的配置中,作为Bean来统一管理
3、由IoC/DI容器来管理Bean的创建、实例化
4、由IoC/DI容器来把Bean之间的关系注入到需要这些关系的对象里面
简而言之:就是把对象之间的依赖关系全部去掉,由IoC/DI容器来管理对象和对象之间的依赖关系,实现对象之间的松散耦合.

IoC容器:
    简单的理解就是,实现IoC思想,并提供对象创建、对象装配以及对象生命周期管理的软件就是IoC容器

IoC理解:
1、应用程序无需主动new对象;而是描述对象应该如何被创建即可,IoC容器帮你创建,即被动实例化;
2、应用程序不需要主动装配对象之间的依赖关系,而是描述需要哪个服务,IoC容器会帮你装配,被动接受装配;
  3、主动变被动,以前创建对象、装配对象的依赖关系都是由应用程序主动完成,现在变成被动了由IoC容器来完成;
4、应用程序不知道依赖的具体实现,只知道需要提供某类服务的对象,达到并松散耦合;
5、是一种让服务消费者不直接依赖于服务提供者的组件设计方式,是一种减少类与类之间依赖的设计原则.

使用Ioc/DI容器开发需要改变思路:
1、应用程序不主动创建对象,但是要描述创建它们的方法
2、在应用程序代码中不直接进行服务的装配,但是要描述哪一个组件需要哪一项服务,由容器负责将这些装配在一起
也就是说:所有的组件都是被动的,组件初始化和装配都由容器负责,应用程序只是获取相应的组件后,实现应用的功能即可.

定义对应的类,并进行配置,将对象纳入到容器中进行管理(受管bean)
    【(Spring2.5-)xml配置   xml+注解配置  (Spring4.0+建议)JavaConfig类配置】


BeanFactory和ApplicationContext接口
BeanFacotry是spring中比较原始的Factory,提供了IoC/DI容器使用的最基本的方法。ApplicationContext接口由BeanFactory接口派生而来,在提供BeanFactory所有的功能基础上提供了企业级应用开发的支持,例如读取资源文件、发布事件等。
BeanFactory针对单例的受管bean采用的是延迟加载,ApplicationContext采用的是立即加载【所有的prototype受管bean都是延迟】。所以BeanFactory一般用于内存敏感的受限环境开发中,ApplicationContext一般使用


Spring框架4大原则:
    使用POJO进行轻量级和最小侵入式开发
        POJO(Plain Ordinary Java Object)简单的Java对象,实际就是普通JavaBeans,是为了避免和EJB混淆所创造的简称。
    通过控制反转IoC、依赖注入DI和基于接口编程实现松耦合
    通过AOP和默认惯例进行声明式编程
    使用AOP和模板编程减少模式化代码。

Spring框架的主要功能
    基于Java Beans的配置管理,采用IOC的原理,特别是对依赖注射技术的使用。这些都用来减少各组件间对实施细则的相互依赖性。
    一个核心的,全局适用的bean工厂
    一个一般抽象化的层面来管理数据库间的数据处理
    建立在框架内的,对Java数据处理API和单独的JDBC数据源的一般性策略。因此,在数据处理支持上对Java企业版本环境的依赖性得以消除
    和一些整合持久化的框架,如Hibernate,JDO,iBATIS和db4o,的整合
    web应用中的MVC框架,基于核心的Spring功能,支持多种产生视图的技术,包括JSP,FreeMarker,Velocity,Tiles,iText,和POI
    大量的AOP框架以提供诸如数据处理管理的服务。同IOC的功能一样,目的是提高系统的模块化程度

基本框架结构[过去的面试,难度系数1]
    Spring是一种JavaEE开发中的一站式解决方案,所以其中包含的内容比较多,为了避免在应用中添加无用功能,所以Spring采用了非强制性的模块化结构,在具体应用中,可以根据应用所需要的功能进行选择添加。
Spring3.x分为6大模块,Spring的模块化是很强的,各个功能模块都是独立的,可以选择的使用

    Core模块是Spring应用的基础,提供了最基本的IoC/DI容器的支持和实现
    AOP模块建立在Core模块的基础上,提供了AOP技术的支持,以简化AOP编程的复杂度
    DAO和ORM模块建立在AOP的基础上,DAO提供了dao模式编程的简化支持,ORM提供了整合持久层框架的支持。同时在AOP的基础上给数据库访问提供了声明式事务的支持。
    JEE模块建立在Core模块的基础上,提供了针对EJB\邮件javaMail等企业级应用支持
    Web模块建立在core模块的基础上,提供了整合其它表现层框架【例如Struts\JSF等】的支持,同时提出了自己的表现层框架SpringMVC[针对Struts1提出的]

Spring4.x分为6大模块,包括20多个子项目


Spring的全方位应用程序框架
    SSH
    SSM

受管bean
    Spring中那些组成应用的主体以及由Spring IoC容器所管理的对象被称之为bean。Bean就是由Spring容器初始化、装配以及被管理的对象
    bean是Spring管理的基本单位,在Spring的应用中,所有的组件都是bean,bean包括数据源、 Hibernate的SessionFactory及事务管理器等。 Spring里的bean是非常广义的概念,任何的Java对象,Java组件都可被当成bean处理。甚至这些组件并不是标准的JavaBean
<bean>配置一个 bean
    id为在代码中引用的名称,唯一,且可以为多个,利用逗号、分号、或空格分隔
    class指向全类名,spring就是根据全类名,通过反射生成一个实例对象,id为这个实例对象的引用,所以必须在这个类中添加默认的构造方法,并且属性要有setter方法
    scope


依赖注入通常有三种方法:接口注入、设置注入和构造器注入[Spring工厂注入]

设置器注入:属性注入
属性注入即通过 setter 方法注入Bean 的属性值或依赖的对象,使用 元素, 使用 name 属性指定 Bean 类的属性名称,value 属性或 子节点指定属性值。【在这里,注入是根据setter方法来的而不是属性名称,但是一般我们都是直接生成setter方法,而不去更改这个名称,所以就是说成name为属性名称】

构造方法注入:
通过构造方法注入Bean 的属性值或依赖的对象,它保证了 Bean 实例在实例化后就可以使用。
构造器注入在 【constructor-arg】 元素里声明属性,


注解分为两类:
1、一类是使用Bean,即是把已经在xml文件中配置好的Bean拿来用,完成属性、方法的组装;比如@Autowired , @Resource,可以通过byTYPE(@Autowired)、byNAME(@Resource)的方式获取Bean;

2、一类是注册Bean,@Component , @Repository , @ Controller , @Service , @Configration这些注解都是把你要实例化的对象转化成一个Bean,放在IoC容器中,等你要用的时候,它会和上面的@Autowired , @Resource配合到一起,把对象、属性、方法完美组装。

猜你喜欢

转载自blog.csdn.net/weixin_42121296/article/details/81291129