最近刚刚做完了毕业设计,在开发时用的是spring框架,做的时候踩了好多坑,又把当初的笔记给翻了翻,做一次简单的回顾

# 1.Spring是什么?

是一个开源的、用于简化企业级应用开发的应用开发框架。

a.简化开发:
        Spring框架对很多常用的api做了简化,比如,使用Spring jdbc
        (Spring jdbc是Spring框架中的一个模块)访问数据库,不再需要
        考虑如何获取连接、关闭连接、处理异常等等。

b.提高了系统的维护性:
        Spring容器(Spring框架中的一个模块)帮我们创建对象、并且管理
        对象之间依赖关系。这样一来,对象之间的耦合性大大降低,提高
        了系统的维护性。

c.可以集成其它的框架:
        Spring框架提供了集成其它常用框架的功能,比如,要使用
        任务调度功能、就可以将Quartz和Spring进行集成。

# 2.Spring容器
## (1)什么是Spring容器?
Spring容器(Spring框架中的一个模块)帮我们创建对象、并且管理
对象之间依赖关系。

## (2)如何启动Spring容器?
step1.导包。

<dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-webmvc</artifactId>
          <version>3.2.8.RELEASE</version>
    </dependency>

step2.添加Spring配置文件。

配置文件用来告诉容器,如何创建对象、如何建立对象之间的依赖关系等等。

 参考:https://www.cnblogs.com/runwulingsheng/p/5630057.html

step3.启动容器。
    
        /*
         * 启动Spring容器。
         * ApplicationContext是一个接口,定义了Spring
         * 容器的基本功能。
         * ClassPathXmlApplicationContext是一个实现了
         * ApplicationContext接口的类,该类会依据类路径
         * 来查找Spring配置文件,然后启动容器。
         */
        ApplicationContext ac = 
            new ClassPathXmlApplicationContext(
                    "applicationContext.xml");
        System.out.println("ac:"  + ac);

## (3)创建对象
### 1)方式一 使用无参构造器。

step1.为类添加无参构造器(或者缺省构造器)。

step2.在配置文件当中,使用bean元素进行配置。
    <!-- 
        使用无参构造器创建对象。
        其中,id属性值要求唯一,class属性要写类的完整的名字。
     -->
    <bean id="stu1" class="first.Student"/>
    
    step3.启动Spring容器,调用容器提供的getBean方法来获得
        对象。

Student stu = ac.getBean("stu1",Student.class);

### 2)方式二 使用静态工厂方法。(了解)

<!--
        使用静态工厂方法来创建对象 。
        factory-method属性用来指定静态方法名,
        容器会调用该类的静态方法来创建对象。
        以下配置,容器会调用Calendar.getInstance()
        方法,该方法会返回一个对象。
     -->
    <bean id="cal1" class="java.util.Calendar" 
    factory-method="getInstance"/>

### 3)方式三 使用实例工厂方法。(了解)
    
    <!-- 
        使用实例工厂方法来创建对象。
        factory-bean属性值是一个bean的id,
        factory-method属性指定方法名。
        以下配置,容器会调用id为cal1的bean的
        getTime方法。
        注:
            bean指的是由容器所管理的对象。
     -->
    <bean id="time1" factory-bean="cal1" 
    factory-method="getTime"/>

## (4)作用域
容器默认情况下,对于某个bean元素,只会创建一个实例。

可以修改bean的作用域,将作用域设置为"prototype",容器
就会创建多个实例。

<!-- 
            scope属性用来设置bean的作用域。
            缺省值是"singleton",只会创建一个实例;
            如果值为"prototype",则会创建多个实例(每调用一次
            getBean方法,就会创建一个)。
            
            singleton:单例。
            prototype:原型。
    -->
    <bean id="sb1" class="basic.ScopeBean" 
    scope="prototype"/>

## (5)生命周期
容器在创建好相应的对象之后,会调用该对象的初始化方法,
在销毁该对象之前,会调用该对象的销毁方法。

可以使用init-method属性和destroy-method属性来指定
初始化方法和销毁方法的名称。

<!-- 
            scope属性用来设置bean的作用域。
            缺省值是"singleton",只会创建一个实例;
            如果值为"prototype",则会创建多个实例(每调用一次
            getBean方法,就会创建一个)。
            
            singleton:单例。
            prototype:原型。
         -->
        <bean id="sb1" class="basic.ScopeBean" 
        scope="prototype"/>
        
        <!--
            init-method属性用于指定初始化方法名。
            destroy-method属性用于指定销毁方法名。
            注:
                容器在删除对象之前,会先调用该对象的
                销毁方法。 
                只有作用域为singleton的bean,销毁方法
                才会执行。
         -->
        <bean id="ms1" class="basic.MessageService" 
        init-method="init" destroy-method="destroy"
        scope="singleton"/>

## (6)延迟加载
默认情况下,容器启动之后,会将所有作用域为"singleton"的
bean实例化。

可以将lazy-init属性值设置为true,容器启动之后,不再创建这些
实例了(只有调用了getBean方法才会创建)。

<!-- 
            lazy-init属性用来设置是否延迟加载,
            如果值为true,表示延迟加载。
         -->
        <bean id="lb1" class="basic.LazyBean" 
        lazy-init="true"/>

# 3.IOC和DI
## (1)什么是IOC(Inversion Of Control 控制反转)?
对象之间的依赖关系应该由容器来建立。

## (2)什么是DI(Dependency Injection 依赖注入)?
容器可以通过调用set方法或者构造器来建立对象之间的依赖关系。

注:
        IOC是目标,DI是手段。

## (3)使用set方法来建立依赖关系。

<!-- 
            配置set方法注入。
            property元素的name属性用于指定set方法名
            (首字母大写,前面添加set),ref属性用于
            指定被注入的bean的id。
         -->
        <bean id="a1" class="ioc.A">
            <property name="b" ref="b1"/>
        </bean>

## 4. 接收请求参数

### 4.5. 【推荐】使用自定义的数据类型接收请求参数

可以自定义某个数据类型,对应所有的请求参数:

public class User {

private String username;
        private String password;
        private Integer age;

// ...
    }

然后,在处理请求的方法中,直接将这个类型作为参数即可:

@RequestMapping("/handle_reg.do")
    public String handleReg(User user) {
        System.out.println(user);
        return null;
    }

**注意:使用这种做法也必须保证提交的参数名称,与自定义类型中的属性名称,必须保持一致!如果没有保持一致,则获取到的对象的那些属性将是null值!**

### 4.6 小结

在SpringMVC中,处理请求时,有3种方式可以接收请求参数,实际使用的有:直接声明同名参数、使用自定义数据类型,如果有必要的话,这2种方式可以组合使用!

当使用同名参数接收请求参数时,如果名称不一致,可以使用`@RequestParam()`注解来确定请求参数的名称。

Spring(完成毕业设计后的简单回顾)的更多相关文章

  1. spring的i o c简单回顾

    1.springIOC是一个创建对象的容器,他负责将我们需要的对象帮我们创建出来,创建时间是:当我们从上下文环境中读取此对象时就会帮我们创建,严格意义上来讲它是一种编程思想不是一种技术. 2.依赖注入 ...

  2. Android混淆、反编译以及反破解的简单回顾

    =========================================================================虽然反编译很简单,也没下面说的那么复杂,不过还是转了过 ...

  3. Spring 自定义注解,配置简单日志注解

    java在jdk1.5中引入了注解,spring框架也正好把java注解发挥得淋漓尽致. 下面会讲解Spring中自定义注解的简单流程,其中会涉及到spring框架中的AOP(面向切面编程)相关概念. ...

  4. Spring Security 整合freemaker 实现简单登录和角色控制

    Spring Security 整合freemaker 实现简单登录和角色控制     写这篇文章是因为我做了一个电商网站项目,近期刚加上权限控制.整个过程很简单,在此给大家梳理一下,也算是自己对知识 ...

  5. 中国2017 Google 开发者大会第二天简单回顾

    昨天早晨发布了第一天的开发者大会回顾文章后,就匆匆忙忙赶去会场继续享受高科技的盛宴,接下来简单回顾一下第二天的大会参与情况. 昨天早晨下着小雨,并带着微风,在外面还是挺冷的,这里不得不给工作人员点个赞 ...

  6. 中国2017 Google 开发者大会第一天简单回顾

    昨天有幸参加了中国2017 Google 开发者大会,在这第一天就收获满满,昨天太忙了,今天早晨来一起简单回顾一下,可以让没有参加的童鞋们感受一下现场的温度. 早早就来到了会议现场,外面看不出什么特别 ...

  7. Spring Boot 支持 HTTPS 如此简单,So easy!

    这里讲的是 Spring Boot 内嵌式 Server 打 jar 包运行的方式,打 WAR 包部署的就不存在要 Spring Boot 支持 HTTPS 了,需要去外部对应的 Server 配置. ...

  8. Spring Boot 支持 HTTPS 如此简单,So easy!

    这里讲的是 Spring Boot 内嵌式 Server 打 jar 包运行的方式,打 WAR 包部署的就不存在要 Spring Boot 支持 HTTPS 了,需要去外部对应的 Server 配置. ...

  9. 菜鸟学习Spring——60s使用annotation实现简单AOP

    一.概述. AOP大家都知道切面编程,在Spring中annotation可以实现简单的AOP列子.下面还未大家介绍几个概念: Aspect 对横切性关注点的模块化. Advice 对横切性关注点的具 ...

随机推荐

  1. list里面放的实体对象,页面用c:foreach应该怎么取?

    关于网友提出的" list里面放的实体对象,页面用c:foreach应该怎么取?"问题疑问,本网通过在网上对" list里面放的实体对象,页面用c:foreach应该怎么 ...

  2. Facebook人工智能实验室的前世今生

    Facebook人工智能实验室的前世今生 是时候停止把Facebook当作纯粹的社交媒体公司来看了.它用无人机提供互联网服务,为了发展虚拟现实而收购Oculus,不懈追求人工智能,Facebook已经 ...

  3. 正则tips

    在啃Sizzle源码,被几个正则表达式给难住了,写了一下正则demo,记录一下 1,按照定义[]和(?:)里的内容不计入捕获组的数目 2,捕获组的计数顺序是,从大到小,同级从左到右 例如 var re ...

  4. 一组数字,从1到n,从中减少了3个数,顺序打乱,放在n-3的数组里,找出丢失数字

    曾经看到有这样一个JS题:有一组数字,从1到n,从中减少了3个数,顺序也被打乱,放在一个n-3的数组里请找出丢失的数字,最好能有程序,最好算法比较快假设n=10000 下面我也来贴一个算法. func ...

  5. JavaScript编写风格指南 (一)

    //参考<编写可维护的Javascript>  一:缩进// 第一行的层级由4个空格组成,避免使用制表符tab进行缩进 //好的写法if (true) {    doSomething() ...

  6. CF232C Doe Graphs

    传送门 Solution:  (不理解时对着图研究一下就清楚啦!!!) sm[i]为|D(i)|  (x,y,n)为x,y在D(n)中的最短路 已知sm[i-1]+1为D(i)的割点 于是x-y的最短 ...

  7. Chrome插件笔记之content_scripts

    一.概论 说这个之前先看一个段子,讲的是甲方有一奇葩客户,这客户看一网站某些样式很别扭不得劲,非要让乙方修改,乍一听没毛病,但关键是这网站不是乙方家的,根本没有修改权限,怎么办,客户就是上帝,上帝的要 ...

  8. 面试:----Struts和springmvc的区别--区别上

    SpringMVC和Struts2的区别 1核心控制器(前端控制器,预处理控制器):对于使用过MVC框架的人来说这个词应该不会陌生.核心控制器的主要用途处理所有的请求.然后对那些特殊的请求.统一的进行 ...

  9. redhat7配置本地yum源

    1.首先是要有一个iso文件,并将这个文件挂载到某个目录 挂载: 配置: 检验: yum list 现在你就可以在没有网的情况下,安装软件了~~~

  10. .Net Core连接RabbitMQ集群

    var connectionFactory = new ConnectionFactory() { //HostName = "192.168.205.128", 集群不在此处声明 ...