[ SSH框架 ] Spring框架学习之一

一、Spring概述

1.1 什么是Spring

  Spring是一个开源框架, Spring是于2003年兴起的一个轻量级的Java开发框架,由 Rod Johnson在其著作 Expert One-On-OneJ2 EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为J2EE应用程序开发提供集成的框架。Spring使用基本的 Javabean来完成以前只可能由EJB完成的事情。然而, Spring的用途不仅限于服务器端的开发。从简单性、

可测试性和松耦合的角度而言,任何Java应用都可以从 Spring中受益。 Spring的核心是控制反转(IoC)和面向切面(AOP)。简单来说, Spring是一个分层的 Javase/ eefull-stack(一站式)轻量级开源框架

EE开发分成三层结构:

●  WEB层 Spring MVC。

●  业务层Bean管理:(IOC)。

●  持久层 Spring的JDBC模板ORM模板用于整合其他的持久层框架。

1.2 为什么学习Spring

  ●  方便解耦,简化开发

    Spring就是一个大工厂,可以将所有对象创建和依赖关系维护,交给 Spring管理。

  ●  AOP编程的支持

    Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能。

  ●  声明式事务的支持

    只需要通过配置就可以完成对事务的管理,而无需手动编程。

  ●  方便程序的测试

    Spring对 Junit4支持,可以通过注解方便的测试 Spring程序。

  ●  方便集成各种优秀框架

    Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如: Struts、 Hibernate、Mybatis、 Quartz等)的直接支持。

  ● 降低 Javaee API的使用难度

    Spring对 Javaee开发中非常难用的一些API ( JDBC、 JavaMail、远程调用等),都提供了封装,使这些API应用难度大大降低。

1.3 Spring的版本

  Spring 3.X 和Spring 4.X

二、Spring的入门案例(IOC)

2.1 IOC的底层实现原理

  ·

2.2 第一步:下载Spring开发包

链接:https://pan.baidu.com/s/12mpSPwCVJeCYNEZ2vwoShA   密码:adcx

2.3 第二步:创建web项目,引入Spring开发包

  如图所示,第一个入门案例我们只做最基本的开发,所以只需要用到基础的一些jar包即可,其它jar包会在后续用到的时候,陆续导入。在解压的Spring开发包的libs目录下找到以下基础jar包并导入:

2.4 第三步:引入相关配置文件

  在src目录下创建beans1.xml 文件,并导入约束。(注意:核心配置文件名称和位置不是固定的,建议放在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"
    xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- bean definitions here -->


</beans>

2.5 第四步:编写相关测试类 

package com.Kevin.aop;
/**
 * Spring入门案例
 * @author Kevin
 *
 */

public class Book {
    
    public void add(){
        System.out.println("Bookadd-----");
    }

}

2.6 第五步:在beans1.xml文件中完成配置

<bean id="bookDao" class="com.Kevin.XMLanno.BookDao"></bean>

2.7 第六步:编写测试程序

package com.Kevin.aop;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestUsage {
    
    //Spring入门案例测试
    @Test
    public void test(){
        ApplicationContext context=new ClassPathXmlApplicationContext("beans1.xml");
        
        Book book=(Book) context.getBean("book");
        book.add();
    }

}

2.8 IOC和DI

  IOC:控制反转,将对象的创建权交给了 Spring   DI:Deper Injection 依赖注入,需要有IOC的环境,Spring创建这个类的过程中,Spring将类的依赖的属性设置进去。

三、Spring的相关配置

3.1 id属性和name属性标签的配置

  id:给bean起个名字,在约束中采用ID的约束;唯一,必须以字母开始,可以使用字母、数字、连字符、下划线、句号、冒号。(不能出现特殊字符)

    示例:<bean id="userAction" />

  name:给bean起个名字,没有采用ID约束,如果bean没有id的话,name可以当做id使用。(name可以使用特殊符号)

3.2 scope属性:Bean的作用范围

●  singleton:默认值,单例的。

●  prototype:多例的。

●  request:Spring创建一个Bean对象,将对象放到request域中。

●  session:Spring创建一个Bean对象,将对象放到request域中。

●  globalSession:应用在Porlet环境。如果没有Porlet环境,那么相当于session。

3.3 Bean的生命周期

  通过配置<bean>标签上的 init-method 作为Bean的初始化的时候执行的方法,配置 destroy-method作为Bean的销毁的时候的执行方法。

  销毁方法想要执行,需要是单例创建的Bean而且在工厂关闭的时候,Bean才会被销毁。

四、Spring的Bean的管理XML的方式

4.1 Spring生成Bean的三种方式(了解)

【无参数的构造方法的方式】

<!-- 方式一:无参函数的构造方式创建-->
<bean id = "userDao" class="com.Kevin.dao.UserDao"></bean>

【静态工厂实例化的方式】

//提供一个工厂类
public class UserFactory{

    public static User.getUser(){
        return new User();
    }
}

<!-- 方式二:静态工厂实例化-->
<bean id = "bookDao" class = "com.Kevin.factory.UserFactory"></bean>

【实例工厂实例化的方式】

//提供User的实例工厂

public class UserFactory{

    public void User getUser(){
        return new User();
                
    }
}

<!-- 方式三:实例工厂实例化-->
<bean id = "userFactory" class = "com.Kevin.factory.UserFactory" ></bean>
<bean id = "userDao" factory-bean = "userFactory" factory-method="getUser" ></bean>

4.2 Spring的Bean属性的注入

【构造方法的方式注入属性】

    <bean id="userAction" class="com.Kevin.action.UserAction">
        <constructor-arg name="name" value="Kevin"></constructor-arg>
    </bean>

【set方法的方式注入属性】

<!-- 配置action对象 -->
    <bean id="userAction" class="com.Kevin.action.UserAction" scope="prototype">
        <property name="name" value="Kevin"></property>
    </bean>

4.3 Spring的属性注入:对象类型的注入

    <bean id="userAction" class="com.Kevin.action.UserAction" scope="prototype">
        <property name="name" value="Kevin"></property>
         <property name="person" ref="Ryan"></property>
    </bean>

4.4 名称空间p的输入性注入方式(Spring 2.X 版本后提供的方式)

第一步:引入p名称空间

<beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:p="http://www.springframework.org/schema/p"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">

第二步:使用p名称空间

<bean id="book" class="com.Kevin.action.Book" p:name="Algorithms" p:price="666"></bean>

4.5 注入复杂类型

    <bean id="user" class="com.Kevin.entity.User">
        <!-- 数组类型数据 -->
        <property name="arrs">
            <list>
                <value>Kevin</value>
                <value>James</value>
                <value>Ryan</value>
            </list>
        </property>
        
        <!-- 注入list集合数据 -->
        <property name="list">
            <list>
                <value>Alice</value>
                <value>Brank</value>
                <value>Cindy</value>
            </list>
        </property>
        
        <!-- 注入map集合 -->
        <property name="map">
            <map>
                <entry key="user1" value="Mark"></entry>
                <entry key="user2" value="John"></entry>
                <entry key="user3" value="Martin"></entry>
            </map>
        </property>
        
        <!-- properties的注入 -->
        <property name="properties">
            <props>
                <prop key="username">root</prop>
                <prop key="password">admin</prop>
            </props>
        </property>
    </bean>

4.6 Spring的分配置文件的开发

  实际开发中往往会有多个人共同来完成一个项目,因此就会有多个人共同使用spring配置文件,此时如果多个人都修改同一个配置文件,会产生很多不便和不必要的麻。此时就需要编写多个分配置文件,最后导入在同一个配置文件中,使用标签如下:

<!-- 引入其他spring配置文件 -->
    <import resource="classpath:user.xml"/>

五、spring整合web项目管理小结   1.加载spring核心配置文件:new对象,功能可以实现,效率很低。   2.实现思想:把加载配置文件和创建对象过程在服务器启动时完成。   3.实现原理: ●  产生ServletContet对象 ●  配置监听器     监听器具体使用:在服务器启动的时候,为每个项目创建一个ServletContext对象,在ServletContext对象创建的时候,使用监听器可以具体到ServletContext对象在什么时候创建             使用监听监听到在创建ServletContext对象时,加载spring配置文件,把配置文件配置对象创建             将创建对象放到ServletContext域对象中(serAttribute方法)             获取对象时,到ServletContext域得到(getAttribute方法)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏一个会写诗的程序员的博客

Spring FrameWork 5.0 新功能 概览Spring FrameWork 5.0 新功能 概览

整个框架的代码基于java8 通过使用泛型等特性提高可读性 对java8提高直接的代码支撑

791
来自专栏玩转JavaEE

使用Spring Boot开发Web项目

按:最近公众号文章主要是整理一些老文章,以个人CSDN上的博客为主,也会穿插一些新的技术点。 ---- 前面两篇博客中我们简单介绍了Spring Boot项目的...

2945
来自专栏我的博客

Zend_Config使用笔记

1.zend_Config被设计在应用程序中简化访问和使用配置数据。它为在应用程序代码中访问这样的配置数据提供了一个基于用户接口的嵌入式对象属性。配置数据可能来...

2675
来自专栏学海无涯

Java Web之Spring Boot

我一直在尝试一个人写demo(Android和iOS)时,如何模拟服务器端返回的 JSON 数据,总的来说,我试过以下几种: 纯Servlet开发,这种方式配合...

2734
来自专栏Java后端技术栈

Jenkins指定具体分支持续集成-使用Generic Webhook Trigger插件和码云

使用Generic Webhook Trigger插件实现Jenkins+WebHooks(码云)持续集成

2882
来自专栏java工会

Spring工作原理

内部最核心的就是IOC了,动态注入,让一个对象的创建不用new了,可以自动的生产,这其实就是利用java里的反射,反射其实就是在运行时动态的去创建、...

831
来自专栏Java学习之路

06 Spring框架 依赖注入(三)多配置文件

在Spring前几节的学习中我们都使用了一个配置文件,就像struts2中可以包含其他的配置文件,我们能不能使用多个配置文件呢(在工程比庞大,配置比较多的时候)...

30610
来自专栏JAVA同学会

Spring Data(一)概念和仓库的定义

Spring Data的主要任务是为数据访问提供一个相似的、一致的、基于Spring的编程模型,同时又保留着下面各个数据存储的特征。它使得使用数据访问技术非常的...

1041
来自专栏Web项目聚集地

从零学习Spring MVC框架「RESTful风格实践」

学习本文章之前,我们需要知道什么是RESTful API,还对此不了解的朋友可以移步历史文章 RESTful 接口实现简明指南 ,简单来说就是就是用URL定位资...

1521
来自专栏everhad

笔记:Binder通信机制

TODO: 待修正 Binder简介 Binder是android系统中实现的一种高效的IPC机制,平常接触到的各种XxxManager,以及绑定Service...

2458

扫码关注云+社区