Javaweb学习笔记(Spring的基本应用)
String概述
什么是Spring
Spring是一个分层的Java SE/EE full-stack(一站式)轻量级开源框架,它以loC和AOP为内核,使用基本JavaBean来完成以前只能有EJB完成的工作。
Spring体系结构
Spring框架采用的是分层结构,一系列功能被要素分成20个模块。
(1)Core Container(核心容器)
Spring的核心容器是其他模块建立的基础,他主要由Beans模块、Core模块、Context模块、Context-support模块和SpEL模块组成,具体介绍如下:
1.Beans模块:提供了BeanFactory,是工厂模式的经典实现,Spring将管理对象称为Bean。
2.Core核心模块:提供了Spring框架的基本组成部分,包括loC和Dl功能。
3.Context上下文模块:建立在Core和Beans模块的基础之上,它是访问和配置的任何对象的媒介。ApplicationContext接口是上下文模块的焦点。
4.Context-support模块,提供了对第三方库嵌入Spring应用的继承支持,比如缓存、邮件服务、任务调度和模板引擎。
5.spEL模块:提供了Spring Exception Language支持,是运行时查询和操作对象图的强大的表达式语言。
(2)Data Access/lantegeration(数据访问/集成)
1.JDBC模块:提供了一个JDBC的抽象层,大幅度减少了在开发过程中对数据库操作的编码
2.ORM模块:对流行的对象的关系映射API,包括JPA、JDO和Hibernate提供了集成层支持
3.OXM模块:提供了一个支持对象/XML映射的抽象层实现,如JAXB、Castor、XMLBeans、JiBx和XStream
4.JMS模块:指Java消息传递服务,包含使用的产生信息的特性。
5.Transactions事务模块组成:支持对实现特殊接口以及所有POJO类的编程和声明式的事务管理。
(3)Web
WebSocket模块:提供了WebSocket和SockJS的实现和STOMP的支持
Servlet模块:也称为Spring-webmvc模块,包含了Spring的模型——视图——控制器和REST WebService实现的Web应用上下文
Web模块:提供了基本的Web开发集成特性。
Portlet模块:提供了在Portlet环境中MVC实现,类似Servlet模块的功能。
(4)其他模块
1.AOP模块:提供了面向切面编程实现,允许定义方法拦截器和切入点允许定义方法拦截器和切入点,将代码按照功能进行分离,以降低耦合性。
2.Aspects模块:提供了与AspectJ的集成功能,AspectJ是一个功能强大且成熟的面向切面编程的框架。
3.Instrumentation:提供了类工具的支持和类加载器的实现,可以在特定服务中使用。
4.Messaging模块:提供了类工具的支持和类加载器的实现,可以在特定的应用服务中使用。
5.Test模块:提供了对单元测试进和集成测试的支持。
Spring的下载以及目录结构
Spring的4.36版本下载地址是:https://repo.spring.io/ui/api/v1/download?repoKey=libs-release-local&path=org%252Fspringframework%252Fspring%252F4.3.6.RELEASE%252Fspring-framework-4.3.6.RELEASE-dist.zip
解压文件夹:
其中docs文件夹中包含Spring的API文档和开发规范;lib文件夹中包含了开发需要的JAR包和源码;schema文件夹中包含开发所需要的schema文件。
打开lib目录可以看到60个JAR文件:
其中的JAR包分为三类哟RELEASE.jar结尾的是Spring框架class问价的JAR包;以RELEASE-javadoc.jar结尾的是Spring框架API文档的压缩包;以RELEASE-source.jar结尾的是Spring框架源文件的压缩包。其中有四个Spring基本包,他们分别对应Spring核心容器的四大模块,具体介绍如下:
spring-core-4.36.RELEASE.jar:包含Spring框架基本的核心工具类,Spring其他组件都要用到这个包里的类,是其他组建的基本核心。
spring-beans-4.36.RELEASE.jar:所有应用都要用到的JAR包,包含访问配置文件、创建和管理Bean以及进行Inversion of Control或者Dependency Injection操作相关的所有类
spring-context-4.36.RELEASE.jar:Spring提供了在基础loC功能上的扩展服务,还提供了许多企业级服务的支持。
spring-expression-4.36.RELASE.jar:定义了Spring的表达式语言
使用Spring开发时除了使用自带的JAR包外,Spring的核心容器还需要依赖commons.logging的JAR包。
地址https://commons.apache.org/proper/commons-logging/download_logging.cgi
解压完成后即可找到commons-logging-1.2.jar。
Spring核心容器
BeanFactory
BeanFactory是基础类型的loC容器,提供了完整的loC服务支持,BeanFactory就是管理Bean的工厂,主要负责初始化各种Bean,并调用他们的生命周期方法。
BeanFactory加载配置信息的语法是:
BeanFactory beanfactory=new XmlBeanFactory(new FileSystemResource("F:/applicationContext.xml"))
ApplicationContext
ApplicationContext是BeanFactory的子接口,也被称为应用上下文,是另一种常用的Spring核心容器。
ApplicationContext接口实例,通常采用两种方法:
1.通过ClassPathXmlApplicationContext创建
ClassPathXmlApplicationContext会从路径classPath中寻找指定的XML配置文件,找到并装载完成ApplicationContext的实例化工作。语法格式为:
ApplicationContext applicationContext=new ClassPathXmlApplicationContext(String configLocation)
其中configLocation参数用于指定的文件系统路径,如果其值为“applicationContext.xml”,则Spring会去类路径中查找名称为applicationContext.xml的配置文件。
2.通过FileSystemXmlApplicationContext创建
FileSystemXmlApplicationContext会从制定的文件系统经中寻找指定Xml配置文件,找到并装载完成ApplicationContext的实例化工作,语法格式:
ApplicationContext applicationContext=new FileSystemXmlApplicationContext(String configLocation);
与ClassPathXmlApplicationContext有所不同的是,在读取Spring配置文件时,FileSystemXMLApplicationContext不再从类路径中读取文件,而是通过参数指定配置文件的位置。
在使用Spring框架时,可以通过实例化其中任何一个类来创建ApplicationContext容器,通常在Java项目中,会采用通过ClasspathXmlApplicationContext类来实例化ApplicationContext容器的方式。
而在Web项目中,ApplicationContext容器的实例化通常回事用基于ContextLoaderListener实现的方式,此种方式只需要在web.xml中添加如下代码:
<!--指定Spring配置文件的位置,多个配置文件死,以逗号分隔-->
<context-param>
<param-name>contextConfigLocation</param-name>
<!-- Spring 将加载spring目录下的applicationContext.xml文件-->
<param-value>
classpath:spring/applicationContext.xml
</param-value>
</context-param>
<!-- 指定以ContextLoaderListener方式启动Spring容器-->
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
<listener-class>
</listener>
Spring获取Bean的实例通常采用一些采用以下两种方法:
Object getBean(String name):根据容器中Bean的id或name来获取指定的Bean,获取之后需要进行强制类型转换。
< T>T getBean(Class< T>requiredType):根据类的类型来获取Bean的实例。
Spring的入门程序
(1)在Eclipse中创建一个Spring的Web项目,将Spring的个基础包以及commonslogging内的JAR包复制到lib目录中。
(2)在src目录下创建一个com.itheima.ioc包,并在包中创建接口UserDao,在其中定义一个say方法。
package com.itheima.ioc;
public interface UserDao {
public void say();
}
(3)在com.itheima.ioc包下创建UserDao接口实现类,UserDaoImpl,该类需要实现接口中的say()方法
package com.itheima.ioc;
public class UserdaoImpl implements UserDao{
public void say() {
System.out.println("userDao say hello Word");
}
}
(4)在src目录下创建Spring配置文件applicationContext.xml,并在配置文件中创建一个id为userDao的Bean。
<?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="userDao" class="com.itheima.ioc.UserdaoImpl"/>
</beans>
(5)在com.itheima.ioc包下,创建测试类
package com.itheima.ioc;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestIoC {
public static void main(String [] arg){
//初始化spring容器,加载配置文件
ApplicationContext application=new ClassPathXmlApplicationContext("applicationContext.xml");
//2.通过容器获取UserDao示例
UserDao userDao=(UserDao) application.getBean("userDao");
userDao.say();
}
}
依赖注入
依赖注入与控制反转的含义相同,只不过是这两个称呼从两个叫度描述同一个概念。
当某个Java对象需要调用另一个Java对象时,在传统模式下,调用者通常会采用“new被调用这”的代码来创建对象,这样导致调用者与被调用者之间的耦合性增加,不利于后期项目升级和维护。
在使用Spring框架下,对象的实例不在由调用者来创建而是由Spring容器来创建,Spring容器会负责控制程序之间的关系,而不是有调用者的程序代码直接控制,控制权有应用代码转移到了Spring容器,控制权发生了反转,这就是Spring的控制反转。
从Spring容器的角度来看,Spring容器负责将被依赖对象赋值给吊桶这的成员变量,这相当于为调用者注入了它依赖的实例。
依赖注入的实现方式
依赖注入的作用就是在使用Spring框架创建对象时,动态地将其所依赖的对象注入Bean组件中,其实现方式通常有两种,一种是Setter方法注入,另一种是构造方法注入。
1.属性setter方法注入:指Spring容器使用setter方法注入被依赖的实例。通过调用无参构造器或无参静态工厂方法实例化Bean后,调用该Bean的setter方法,即可实现基于setter方法的依赖注入。
2.构造方法注入:值Spring容器使用的构造方法注入被依赖的实例,基于构造方法的依赖注入通过调用带参数的构造烦那个发来实现没个参数代表一个依赖。
示例:
(1)在com.itheima.ioc包中,创建UserService,在接口中编写一个say()方法
package com.itheima.ioc;
public interface UserService {
public void say();
}
(2)在com.itheima.ioc包中,创建UserService接口的实现类UserServiceImpl。
package com.itheima.ioc;
public class UserServiceImpl implements UserService {
private UserDao usuerDao;
public void setUserDao(UserDao userDao){
this.usuerDao=userDao;
}
public void say(){
this.usuerDao.say();
System.out.println("userService say hello World");
}
}
(3)在配置文件applicationContext.xml中创建一个id为UserService的Bean,该Bean用于实例化UserServiceImpl类的信息,并将userDao的实例注入到userService中。
<bean id="userService" class="com.itheima.ioc.UserServiceImpl">
<property name="userDao" ref="userDao"/>
</bean>
(4)在com.itheima.ioc包中,创建测试类TestDI,来对程序进行测试。
package com.itheima.ioc;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestDl {
public static void main(String []args){
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService=(UserService) applicationContext.getBean("userService");
userService.say();
}
}