11.spring入门引导

  

12.spring_HelloWord程序

  实现步骤:

0.找到spring压缩包,并解压

  

  1.拷贝jar包

  

  2.添加主配置文件(官方文档约28页)

  

  3.在测试中使用

  

13.获取bean的三中方式

  getBean方法的主要三种签名:(也可以根据名称拿)
---------------------------------------------------
1,按照类型拿bean:
     world=beanFactory.getBean(HelloWorld.class);
要求在Spring中只配置一个这种类型的实例(不安全);

  
----------------------------------------------------------------
2,按照bean的id拿bean:
     world=(HelloWorld)beanFactory.getBean("hello2");
----------------------------------------------------------------
3,按照id和类型:(推荐)
   world=beanFactory.getBean("hello", HelloWorld.class);

14.spring中的各种概念介绍

  1.Spring简介

    什么是Spring:
-----------------------------------------------
1、Spring是一个轻量级的DI/IoC和AOP容器的开源框架,来源于Rod Johnson 在其著作《Expert one on one J2EE design and development》中阐述的部分理念和原型衍生而来。
2、Spring提倡以”最少侵入”的方式来管理应用中的代码,这意味着我们可以随时安装或卸载Spring。
-----------------------------------------------------------------------------
使用范围:任何Java应用
Spring根本使命:简化Java开发

简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架,致力于构建轻量级的JavaEE应用
-----------------------------------------------------------------------------

Spring中常见术语:
1、应用程序(application):是能完成我们所需要功能的成品,比如购物网站、OA系统。
2、框架:是能完成一定功能的半成品,比如我们可以使用框架进行购物网站开发;框架做一部分功能,我们自己做一部分功能,这样应用程序就创建出来了。而且框架规定了你在开发应用程序时的整体架构,提供了一些基础功能,还规定了类和对象的如何创建、如何协作等,从而简化我们开发,让我们专注于业务逻辑开发。
3、非侵入式设计:从框架角度可以这样理解,无需继承框架提供的类,这种设计就可以看作是非侵入式设计,如果继承了这些框架类,就是侵入设计,如果以后想更换框架之前写过的代码几乎无法重用,如果非侵入式设计则之前写过的代码仍然可以继续使用。
4、轻量级及重量级:轻量级是相对于重量级而言的,轻量级一般就是非入侵性的、所依赖的东西非常少、资源占用非常少、部署简单等等,其实就是比较容易使用,而重量级正好相反。
5、POJO:POJO(Plain Old Java Objects)简单的Java对象,它可以包含业务逻辑或持久化逻辑,但不担当任何特殊角色且不继承或不实现任何其它Java框架的类或接口。
6、容器:在日常生活中容器就是一种盛放东西的器具,从程序设计角度看就是装对象的的对象,因为存在放入、拿出等操作,所以容器还要管理对象的生命周期。

2.spring的优点

  Spring的优点:
1.低侵入/低耦合(降低组件之间的耦合度,实现软件各层之间的解耦。)
2.声明式事务管理
3.方便集成其他框架
4.降低JavaEE开发难度
5.Spring框架中包括JavaEE 三层(表现层,业务层,持久层)的每一层的解决方案

  

  3.IoC和DI介绍

  IoC:Inverse of Control(控制反转):

读作“反转控制”,更好理解,不是什么技术,而是一种设计思想,好比于MVC。就是将原本在程序中手动创建对象的控制权,交由Spring框架来管理。

正控:若调用者需要使用某个对象,其自身就得负责该对象的创建。

反控:调用者只管负责从Spring容器中获取需要使用的对象,不关心对象的创建过程,也就是把创建对象的控制权反转给了Spring框架。

----------------------------------------------------------------------------
DI:Dependency Injection(依赖注入)

从字面上分析:

IoC:指将对象的创建权,反转给了Spring容器;

DI :指Spring创建对象的过程中,将对象依赖属性(简单值,集合,对象)通过配置设值给该对象。

IoC和DI其实是同一个概念的不同角度描述,DI相对IoC而言,明确描述了“被注入对象依赖IoC容器配置依赖对象”。
Container:容器,在生活中容器就是一种盛放东西的器皿,从程序设计角度看作是装对象的对象,因为存在对对象的存入、取出等操作,所以容器还要管理对象的生命周期。

15.spring中的基本配置

  1.name与id的配置

  在Spring配置中,id和name属性都可以定义bean元素的名称,不同的是:

id属性,遵守XML语法ID约束。必须以字母开始,可以使用字母、数字、连字符、下划线、句话、冒号,不能以“/”开头。

name属性,就可以使用很多特殊字符,比如在Spring和Struts1或Spring MVC的整合中,就得使用name属性来的定义bean的名称。

当然也使用name属性为<bean/>元素起多个别名,多个别名之间使用逗号或空格隔开,在代码中依然使用BeanFactory对象.getBean(...)方法获取。
 <bean id="loginUser" name="hi,hi2" class="com.spring.day01.model.LoginUser">
或则
<bean id="loginUser" name="hi hi2" class="com.spring.day01.model.LoginUser">

建议:bean起名尽量规范,不要搞一些非主流的名字,尽量使用id。

   2.Spring中引入其他配置文件

  在实际开发中,随着应用规模的增加,系统中<bean>元素配置的数量也会大量增加,导致applicationContext.xml配置文件变得非常臃肿。
为了避免applicationContext.xml文件过于庞大、臃肿,为提高其可读性,我们可以将一个applicationContext.xml文件分解成多个配置文件,然后在applicationContext.xml文件中包含其他配置文件即可。
使用import元素引入其他的配置文件:
    <import resource="classpath:helloWord/helloWord.xml"/>
使用import元素注意:
1、默认情况下,从classpath的跟路径寻找。
2、可以使用前缀来定位文件的基础位置:
  ①:[classpath:]:后面的文件从classpath路径开始找(推荐);
  ②:[file:]:后面的文件使用文件系统的路径开(千万别用);

注意:一般的,当框架中实现了Resource接口才能够识别上述的前缀标识符。

16.spring中的测试

  以前的测试:
存在问题:
1,每个测试都要重新启动Spring,启动容器的开销大,测试效率低下。
2,不应该是测试代码管理Spring容器,应该是Spring容器在管理测试代码。
3,如果涉及到事务,传统的测试方式无法控制.
.......

使用Spring测试准备:
依赖jar:
Spring4.x需要依赖的单元测试得是最新的junit4.12,Eclipse自带的junit4.8不支持,同时从Spring4.x开始,还得依赖AOP包的支持。
junit-4.12.jar
hamcrest-core-1.3.jar
spring-test-4.1.2.RELEASE.jar
spring-context-4.1.2.RELEASE.jar
spring-aop-4.1.2.RELEASE.jar
spring-expression-4.1.2.RELEASE.jar

总结SpringTest的好处:
    在测试的时候,对事务支持强大:@TransactionConfiguration.
代码:

  

17.IOC容器

  IoC容器:其实指BeanFactory,ApplicationContext.
BeanFactory:是Spring中最底层的接口,只提供了最简单的IoC功能,负责配置,创建和管理bean。

在应用中,一般不使用BeanFactory,而推荐使用ApplicationContext(应用上下文),原因如下。

BeanFactory和ApplicationContext的区别:
1、ApplicationContext继承了BeanFactory,拥有了基本的IoC功能;

2、除此之外,ApplicationContext还提供了以下的功能:

①、支持国际化;
   ②、支持消息机制;
   ③、支持统一的资源加载;
   ④、支持AOP功能;
----------------------------------------------------------------------------------------
ApplicationContext常见实现类:
ClassPathXmlApplicationContext:读取classpath中的资源
FileSystemXmlApplicationContext:读取指定路径的资源
XmlWebApplicationContext:读取Web应用中的资源,需要在Web的环境下才可以运行
----------------------------------------------------------------------------------------
ApplicationContext ctx1 = new ClassPathXmlApplicationContext("applicationContext.xml");
ApplicationContext ctx2 = new ClassPathXmlApplicationContext("applicationContext.xml");

XmlWebApplicationContext ctx3 = new XmlWebApplicationContext(); // 这时并没有初始化容器

ctx3.setServletContext(servletContext); // 需要指定ServletContext对象

// 指定配置文件路径,开头的斜线表示Web应用的根目录

ctx3.setConfigLocation("/WEB-INF/applicationContext.xml");

ctx3.refresh(); // 初始化容器

区别:
bean的创建时机:
bean的创建时机:

1.ApplicationContext在加载的时候就会创建所有的bean(Web应用建议-->可以在启动Tomcat的时候)

2.BeanFactory需要等到拿bean的时候才会创建bean(桌面程序)

测试代码:

  @Test
public void test22(){
//加载 ApplicationContext 对象时就会加载所有的bean,即创建所有的bean
ApplicationContext ctx1 = new ClassPathXmlApplicationContext("spring-config.xml");
Ticket ticket = (Ticket) ctx1.getBean("ticket");
System.out.println("ticket="+ticket);
} @Test
public void test2() {
//创建
//2.从spring 里面获取对象
//2.1加载主配置文件
Resource classPathResource = new ClassPathResource("spring-config.xml");
//2.2 创建容器
BeanFactory xmlBeanFactory = new XmlBeanFactory(classPathResource);
//2.3从容器中获取对象
Ticket t = (Ticket) xmlBeanFactory.getBean("ticket");//获取对象时才创建bean
//使用
t.setStartStation("spring创建的车站");
//取出值
String startStation = t.getStartStation();
//输出
System.out.println("startStation=" + startStation);
}

车票对象中写出默认的构造方法

  

18.bean的作用域

  

  <bean id="" class="" scope="作用域"/>
singleton: 单例 ,在Spring IoC容器中仅存在一个Bean实例 (默认的scope)
prototype: 多例 ,每次从容器中调用Bean时,都返回一个新的实例,即每次调用getBean()时 ,相当于执行new XxxBean():不会在容器启动时创建对象
request: 用于web开发,将Bean放入request范围 ,request.setAttribute("xxx") , 在同一个request 获得同一个Bean
session: 用于web开发,将Bean 放入Session范围,在同一个Session 获得同一个Bean
globalSession: 一般用于Porlet应用环境 , 分布式系统存在全局session概念(单点登录),如果不是porlet环境,globalSession 等同于Session  
    在开发中主要使用 scope="singleton"、 scope="prototype"
      对于MVC中的Action/Controller使用prototype类型,其他使用singleton
在开发中,bean的作用域:
   1:一般的,使用缺省的 singleton即可, 比如,配置dao,service,工具类等.
   2:在配置MVC框架中的Action的时候,需要使用prototype(每次调用都是一个新的Action对象).
                主要解决,线程安全的问题.

19.初始化方法和销毁方法

  比如DataSource,SessionFactory最终都需要关闭资源:在Bean销毁之前,都要调用close方法.
<bean id="someBean" class="......"
           init-method="该类中初始化方法名" destroy-method="该类中销毁方法名">
</bean>
init-method:bean生命周期初始化方法,对象创建后就进行调用
destroy-method:容器被销毁的时候,如果bean被容器管理,会调用该方法。(必须使用spring的测试方式)
default-init-method
分析原理:
如果bean的scope="prototype",那么容器只负责创建和初始化,它并不会被spring容器管理。交给用户自己调用.
总结:bean的生命周期过程
  使用代码:

  

  

20.注入的各种方式

  

  

  

21.链接池原理分析

  1.原理简图:

  

  2.连接池概述:
    在Java中,我们使用javax.sql.DataSource来表示连接池对象.
DataSource:数据源,其实就是连接池,Connection Pool.
为什么必须使用数据库连接池:
普通的JDBC数据库连接使用 DriverManager 来获取,每次向数据库建立连接的时候都要将 Connection 加载到内存中,再验证用户名和密码(得花费0.01s~1s的时间)。需要数据库连接的时候,就向数据库要求一个,执行完成后再断开连接。这样的方式将会消耗大量的资源和时间。数据库的连接资源并没有得到很好的重复利用.若同时有几百人甚至几千人在线,频繁的进行数据库连接操作将占用很多的系统资源,严重的甚至会造成服务器的崩溃。
对于每一次数据库连接,使用完后都得断开。否则,如果程序出现异常而未能关闭,将会导致数据库系统中的内存泄漏,最终将导致重启数据库。
这种开发不能控制被创建的连接对象数,系统资源会被毫无顾及的分配出去,如连接过多,也可能导致内存泄漏,服务器崩溃.
连接池的技术比较多,SUN公司仅仅是提供了DataSource的接口,不提供任何实现.
由各大服务器厂商来提供DataSource实现(Tomcat,WebLogic).
常见的连接池技术:
    dbcp:  Spring    推荐的连接池技术
    c3p0:  Hibernate 推荐的连接池技术
使用连接池和不使用连接池在代码上的区别:
获取连接:
使用连接池之前:使用DriverManager来获取Connection对象.
Connection  conn = DriverManager.getConnection(url,username,password);
使用连接池之后:直接找连接池(DataSource对象),取出Connection即可.
如何创建DataSource对象,在创建DataSource的时候,就会设置连接数据库的url,user,password.
Connection conn = DataSource对象.getConnection();
接下来的代码和以前相同.
释放连接:
代码:connection对象.close();
使用连接池之前:直接和数据库服务器建立连接关系,而断开也是和数据库服务器断开连接.
使用连接池之后:直接和连接池建立连接关系,而断开也是把Connection对象还给连接池,供其他客户使用.
               没有真正的和数据库断开. 如此一来,一个Connection对象就得到了充分的利用!

  3. dbcp与c3po两种链接池具体使用方式

  

22.连接池代码实现

  

23.连接池使用简单优化

  简单优化后的工具类代码:

  

  使用方式:

  

05_ssm基础(三)之Spring基础的更多相关文章

  1. 05_ssm基础(四)之Spring基础二

    24.spring配置dbcp并完成CRUD操作 1.准备jar包 2.编辑Product模型 package com.day02.ssm.spring.model; public class Pro ...

  2. Bootstrap &lt;基础三十二&gt;模态框(Modal)插件

    模态框(Modal)是覆盖在父窗体上的子窗体.通常,目的是显示来自一个单独的源的内容,可以在不离开父窗体的情况下有一些互动.子窗体可提供信息.交互等. 如果您想要单独引用该插件的功能,那么您需要引用  ...

  3. Bootstrap &lt;基础三十一&gt;插件概览

    在前面布局组件中所讨论到的组件仅仅是个开始.Bootstrap 自带 12 种 jQuery 插件,扩展了功能,可以给站点添加更多的互动.即使不是一名高级的 JavaScript 开发人员,也可以着手 ...

  4. Bootstrap &lt;基础三十&gt;Well

    Well 是一种会引起内容凹陷显示或插图效果的容器 <div>.为了创建 Well,只需要简单地把内容放在带有 class .well 的 <div> 中即可.下面的实例演示了 ...

  5. Bootstrap&lt;基础三&gt; 排版

    Bootstrap 使用 Helvetica Neue. Helvetica. Arial 和 sans-serif 作为其默认的字体栈. 使用 Bootstrap 的排版特性,您可以创建标题.段落. ...

  6. Spring基础入门(三)

    一.Spring的jdbcTemplate操作 (1)Spring是一站式框架,对于javaee三层,每一层都有解决技术. web层:springMVC service:spring的ioc dao层 ...

  7. Spring基础

    一.Spring作用:管理项目中各种业务Bean(service类.Dao类.Action类),实例化类,属性赋值 二.Spring IOC(Inversion of Control )控制反转,也被 ...

  8. Spring基础[IOC/DI、AOP]

    一.Spring作用:管理项目中各种业务Bean(service类.Dao类.Action类),实例化类,属性赋值 二.Spring IOC(Inversion of Control )控制反转,也被 ...

  9. Spring基础知识

    Spring基础知识 利用spring完成松耦合 接口 public interface IOutputGenerator { public void generateOutput(); } 实现类 ...

随机推荐

  1. gulp 配置自动化前端开发

    有的人说,grunt已经廉颇老矣,尚能饭否.gulp已经成为了未来的趋势,或许将撼动grunt的地位. 那么就得看看gulp到底优势在哪里,在我最近的使用中发现,我的到了一个结论:“grunt廉颇老矣 ...

  2. httpclient的get带参不带参post带参不带参的简单应用

    一,基础的的应用 1.1,get的无参请求 @Test public void doGet() throws Exception { //创建一个httpclient对象 CloseableHttpC ...

  3. IOS初级:导航控制器

    1.AppDelegate.m老生常谈了,创建window,创建根视图rootViewController - (BOOL)application:(UIApplication *)applicati ...

  4. 【转】Intellij IDEA使用总结

    原文地址:http://totohust.iteye.com/blog/1035550 1. IDEA内存优化 先看看你机器本身的配置而配置. \IntelliJ IDEA 8\bin\idea.ex ...

  5. python学习之老男孩python全栈第九期_day012知识点总结

    # def wrapper(f):# def inner(*args,**kwargs):# print('在被装饰的函数执行之前做的事')# res = f(*args,**kwargs)# pri ...

  6. android笔记---LoginActivity extends FinalActivity

    package com.fuda.activity; import java.io.BufferedReader; import java.io.File; import java.io.FileNo ...

  7. 2018.07.22 bzoj3613: [Heoi2014]南园满地堆轻絮(逆序对结论题)

    传送门 做这道题有一个显然的结论,就是要使这个数列单调不减,就要使所有逆序对保证单调不减,也就是求出所有逆序对的最大差值,然后除以2然后就没了. 代码如下: #include<bits/stdc ...

  8. Extjs 基础篇—— Function基础

    这里主要是JS的基础知识,也是深入理解Ext的基础.1.参数可变长,注意跟Java还是有一点区别的.例: 1.function getUser(name,age){ 2.alert("nam ...

  9. KMP的next数组性质运用

    hdu2594 Simpsons' Hidden Talents Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 ...

  10. const与define的区别

    const与#define最大的差别,Const在堆栈分配了空间,而#define只是把具体数值 直接传递到目标变量罢了.或者说,const的常量是一个Run-Time的概念,他在程 序中确确实实的存 ...