热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

JavaWebSpring开发入门深入学习

这篇文章主要为大家详细介绍了JavaWebSpring开发入门学习教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

1 Spring基本特征

Spring是一个非常活跃的开源框架;它是一个基于Core来构架多层JavaEE系统的框架,它的主要目地是简化企业开发.
Spring以一种非侵入式的方式来管理你的代码,Spring提倡”最少侵入”,这也就意味着你可以适当的时候安装或卸载Spring,Spring让java亮了。 (开放–闭合原理),这里是闭原则。

2 开发spring所需要的工具

(这里先将spring2.5 ,后面3.0)

2.1 Spring的jar包

http://www.springsource.org/download下载spring,然后进行解压缩,在解压目录中找到下面jar文件,拷贝到类路径下

—spring的核心类库 在spring文档的dist下 dist\spring.jar

—引入的第三方类库 都spring文档的lib下,lib\jakarta-commons\commons-logging.jar

—如果使用了切面编程(AOP),还需要下列jar文件 lib/aspectj/aspectjweaver.jar和aspectjrt.jarlib/cglib/cglib-nodep-2.1_3.jar

—如果使用了JSR-250中的注解,如@Resource/@PostConstruct/@PreDestroy,还需要下列jar文件lib\j2ee\common-annotations.jar

注:JSR(Java 规范请求)是指向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求。任何人都可以提交JSR(Java 规范请求),以向Java平台增添新的API和服务。JSR已成为Java界的一个重要标准

2.2 Spring配置文件

默认情况下是applicationContext.xml文件。可以建立很多xml文件,工程中一般都是这样配置的。(src目录下建)

3 Spring基本功能详解

3.1 SpringIOC

Spring的控制反转:把对象的创建、初始化、销毁等工作交给spring容器来做。由spring容器控制对象的生命周期。

步骤:
 •A. 启动spring容器
1、 在类路径下寻找配置文件来实例化容器

代码如下:
 ApplicationContext ctx = new ClassPathXmlApplicationContext(new String[]{"applicationContext.xml"});

可以在整个类路径中寻找xml文件
* 通过这种方式加载。需要将spring的配置文件放到当前项目的classpath路径下
* classpath路径指的是当前项目的src目录,该目录是java源文件的存放位置。

2、 在文件系统路径下寻找配置文件来实例化容器

Spring的配置文件可以指定多个,可以通过String数组传入。
注:经常用第一种方法启动容器
 •B. 从spring容器中提取对象 

spring 容器结构:

3.2 别名


 //alias这里是别名,可以通过p,得到person这个bean.
 


通过这样的配置,可以达到在一个地方命名,在多个地方使用不同的名字的效果。

3.3 Spring容器内部对象

1 创建对象的方式

1.1 无参构造函数


 1.2 静态工厂方法

factory-method="getInstance">

1.3 实例工厂方法


记住概念即可,用的最多的是第一种方法,但是和别的工具集成时,用的是实例工厂模式。

实例
配置applicationContext.xml

<&#63;xml version="1.0" encoding="UTF-8"&#63;>

 
 

 

 
 
 
 


 

 
 
 


建立实体类HelloWorld

package com.itheima10.spring.createobject;

public class HelloWorld {
 public void hello(){
 System.out.println("hello");
 }
}

建立静态工厂HelloWorldFactory

package com.itheima10.spring.createobject.method;

public class HelloWorldFactory {
 public static HelloWorld getInstance(){
 System.out.println("static method");
 return new HelloWorld();
 }
}

建立实体工厂HelloWorldFactory2

package com.itheima10.spring.createobject.method;

public class HelloWorldFactory2 {
 /**
 * 必须先创建工厂对象,才能调用该方法
 * @return
 */
 public HelloWorld getInstance(){
 return new HelloWorld();
 }
}

编写测试方法CreateObjectMethodTest

package com.itheima10.spring.createobject.method;

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


/**
 * 第二种和第三种产生方式能看明白就OK了
 * @author zd
 *
 */
public class CreateObjectMethodTest {
 /**
 * 在默认情况下,spring容器调用的是一个类的默认的构造函数创建对象
 */
 @Test
 public void testCreateObject_Default(){
 ApplicationContext cOntext= 
  new ClassPathXmlApplicationContext("applicationContext.xml");
 HelloWorld helloWorld = (HelloWorld)context.getBean("helloWorld");
 helloWorld.hello();
 }

 /**
 * 利用静态工厂创建对象
 * 
  spring容器做的事情:
  利用HelloWorldFactory类调用了getInstance方法
 */
 @Test
 public void testCreateObject_StaticFactory(){
 ApplicationContext cOntext= 
  new ClassPathXmlApplicationContext("applicationContext.xml");
 HelloWorld helloWorld = (HelloWorld)context.getBean("helloWorld2");
 helloWorld.hello();
 }

 /**
 * 实例工厂方法创建对象
 * 
 * 
 spring容器内部做的事情:
  1、创建一个helloWorldFactory对象
  2、由该对象调用getInstance产生helloWorld对象
 */
 @Test
 public void testCreateObject_InstanceFactory(){
 ApplicationContext cOntext= 
  new ClassPathXmlApplicationContext("applicationContext.xml");
 HelloWorld helloWorld = (HelloWorld)context.getBean("helloWorld3");
 helloWorld.hello();
 }
}

2 对象的scope

对象的scope有两个属性:singleton 与prototype。singleton表示单例
2.1 singleton(默认值)

在每个Spring IoC容器中一个bean定义只有一个对象实例(共享)。

2.2 prototype
允许bean可以被多次实例化(使用一次就创建一个实例) . Spring不能对一个prototype bean的整个生命周期负责.这就意味着清楚prototype作用域的对象并释放任何prototype bean所持有的昂贵资源都是客户端的责任。


建立HelloWorld类

public class HelloWorld {
 public List lists = new ArrayList();
 public HelloWorld(){
 System.out.println("new instance");
 }
 public void hello(){
 System.out.println("hello");
 }
}

建立测试类ScopeTest

package com.itheima10.spring.scope;

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

public class ScopeTest {
 /**
 * 把一个bean放入到spring容器中,默认的是单例
 * 如果一个类放入到spring容易中,而这个类是单例的,那么该类中的属性将会成为共享的
 */
 @Test
 public void testCreateObject_Scope_Default(){
 ApplicationContext cOntext= 
  new ClassPathXmlApplicationContext("applicationContext.xml");
 HelloWorld hello1 = (HelloWorld)context.getBean("helloWorld");
 hello1.lists.add("aaaa");
 hello2= (HelloWorld)context.getBean("helloWorld");
 hello2.lists.add("bbbb");
 System.out.println(helloWorld.lists.size());//2,并且只输出一次new instance
 }

 /**
 * 如果spring的配置文件如下:
 * 
 那么spring容器会为创建多个对象
 */
 @Test
 public void testCreateObject_Scope_Prototype(){
 ApplicationContext cOntext= 
  new ClassPathXmlApplicationContext("applicationContext.xml");
 HelloWorld hello1 = (HelloWorld)context.getBean("helloWorld");
 hello1.lists.add("aaaa");
 hello2= (HelloWorld)context.getBean("helloWorld");
 hello2.lists.add("bbbb");
 System.out.println(helloWorld.lists.size());//1,并且只输出两次new instance
 }
}

3 初始化bean时机

懒加载——默认情况下会在容器启动时初始化bean,但我们可以指定Bean节点的lazy-init=“true”来延迟初始化bean,这时候,只有第一次获取bean会才初始化bean。如:

如果想对所有bean都应用延迟初始化,可以在根节点beans设置default-lazy-init=“true“,如下:




建立测试类CreateObjectWhenTest

package com.itheima10.spring.createobject.when;

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

public class CreateObjectWhenTest {
 /**
 * 默认情况下的顺序
 * 1、启动spring容器
 * 2、创建HelloWorld对象
 * 3、对象调用方法
 * 
 * 
  
  因为在spring容器中声明了两个bean,所以spring容器要创建两个对象
  说明:
  如果struts2,hibernate,spring容器整合,如果spring的配置文件中出现错误
  当 tomcat容器启动的时候,就会报错,错误会特别早的显示出来

  如果一个bean存放了大量的数据,这种方式不好,有可能会把数据过早的停留在内存中

  如果一个bean不是单例,那么不管怎么样配置,都在是context.getBean时才要创建对象
 */
 @Test
 public void testCreateObject_When_Default(){
 ApplicationContext cOntext= 
   new ClassPathXmlApplicationContext("applicationContext.xml");
 context.getBean("helloWorld");
 }

 /**
 * 
 * 顺序
 * 1、启动spring容器
 * 2、context.getBean
 * 3、调用构造器函数创建对象
 * 说明:
  如果struts2,hibernate,spring容器整合,如果spring的配置文件中出现错误
  只有当用到该bean的时候才会报错。

  如果一个bean存放了大量的数据,需要的时候才要加载数据
 */
 @Test
 public void testCreateObject_When_Lazy(){
 ApplicationContext cOntext= 
   new ClassPathXmlApplicationContext("applicationContext.xml");
 context.getBean("helloWorld");
 }
}

4 init、destroy方法

Spring初始化bean或销毁bean时,有时需要作一些处理工作,因此spring可以在创建和拆卸bean的时候调用bean的两个生命周期方法。可以指定方法进行操作。

 

当foo被载入到Spring容器中时调用init-method方法。当foo从容器中删除时调用destory-method(scope = singleton有效)

编写HelloWorld

public class HelloWorld {
 public HelloWorld(){
 System.out.println("new instance");
 }

 public void init(){
 System.out.println("init");
 }

 public void destroy(){
 System.out.println("destroy");
 }

 public void hello(){
 System.out.println("hello");
 }
}

编写测试类InitDestroyTest

package com.itheima10.spring.ioc.initdestroy;

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

public class InitDestroyTest {
 /**
 * init-method="init"
 * 执行顺序:
 * 1、启动spring容器
 * 2、创建helloWorld对象
 * 3、执行init方法
 *  spring容器内部自动执行的
 * 4、对象调用方法
 * 5、只有当spring容器关闭掉的情况下才能执行destroy方法 前提条件:bean是单例的
 *  该方法也是由spring容器内部调用的
 * 说明:
 * 如果一个bean不是单例的,则spring容器不负责对象的销毁。
 * 在spring容器中,只有一个bean是单例的情况下,spring容器才要负责对象的创建、初始化、销毁工作
 * 如果一个bean不是单例,spring容器只负责创建、初始化
 */
 @Test
 public void testInitDestroy(){
 ApplicationContext cOntext=
  new ClassPathXmlApplicationContext("applicationContext.xml");
 HelloWorld helloWorld = (HelloWorld)context.getBean("helloWorld");
 helloWorld.hello();
 ClassPathXmlApplicationContext applicatiOnContext= (ClassPathXmlApplicationContext)context;
 applicationContext.close();
 }
}

执行顺序图:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • 探讨如何真正掌握Java EE,包括所需技能、工具和实践经验。资深软件教学总监李刚分享了对毕业生简历中常见问题的看法,并提供了详尽的标准。 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 本文详细介绍了如何使用Spring Boot进行高效开发,涵盖了配置、实例化容器以及核心注解的使用方法。 ... [详细]
  • 在当前众多持久层框架中,MyBatis(前身为iBatis)凭借其轻量级、易用性和对SQL的直接支持,成为许多开发者的首选。本文将详细探讨MyBatis的核心概念、设计理念及其优势。 ... [详细]
  • 将Web服务部署到Tomcat
    本文介绍了如何在JDeveloper 12c中创建一个Java项目,并将其打包为Web服务,然后部署到Tomcat服务器。内容涵盖从项目创建、编写Web服务代码、配置相关XML文件到最终的本地部署和验证。 ... [详细]
  • 本文介绍如何在 Unity 的 XML 配置文件中,将参数传递给自定义生命周期管理器的构造函数。我们将详细探讨 CustomLifetimeManager 类的实现及其配置方法。 ... [详细]
  • 自己用过的一些比较有用的css3新属性【HTML】
    web前端|html教程自己用过的一些比较用的css3新属性web前端-html教程css3刚推出不久,虽然大多数的css3属性在很多流行的浏览器中不支持,但我个人觉得还是要尽量开 ... [详细]
  • 本文探讨了在Windows Server 2008环境下配置Tomcat使用80端口时遇到的问题,包括端口被占用、多项目访问失败等,并提供详细的解决方法和配置建议。 ... [详细]
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 本文探讨了 RESTful API 和传统接口之间的关键差异,解释了为什么 RESTful API 在设计和实现上具有独特的优势。 ... [详细]
  • 作为一名新手,您可能会在初次尝试使用Eclipse进行Struts开发时遇到一些挑战。本文将为您提供详细的指导和解决方案,帮助您克服常见的配置和操作难题。 ... [详细]
  • 本文详细介绍了 Flink 和 YARN 的交互机制。YARN 是 Hadoop 生态系统中的资源管理组件,类似于 Spark on YARN 的配置方式。我们将基于官方文档,深入探讨如何在 YARN 上部署和运行 Flink 任务。 ... [详细]
  • 本文详细探讨了如何在Docker环境中实现单机部署Redis集群的方法,提供了详细的步骤和配置示例,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 2018年3月31日,CSDN、火星财经联合中关村区块链产业联盟等机构举办的2018区块链技术及应用峰会(BTA)核心分会场圆满举行。多位业内顶尖专家深入探讨了区块链的核心技术原理及其在实际业务中的应用。 ... [详细]
author-avatar
mobiledu2502907117
这个家伙很懒,什么也没留下!
Tags | 热门标签
RankList | 热门文章
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有