通过代码实例跟我学Spring框架从入门到精通——Spring框架系统的API及应用实例
- 格式:pdf
- 大小:476.83 KB
- 文档页数:25
Java开发框架Spring入门教程Spring 是一个非常强大且广泛应用的 Java 开发框架,它提供了一种简化企业级应用开发的方法。
本篇文章将以四个章节来介绍Spring 的入门知识,分别是 Spring IoC 容器、Spring AOP、Spring MVC 和 Spring Boot。
第一章:Spring IoC 容器Spring IoC(Inversion of Control,控制反转)容器是 Spring 框架的核心。
它通过配置文件或注解的方式,将实例的创建、依赖的注入和生命周期管理等任务交给 Spring 框架来完成,而不再由开发人员直接控制。
这样可以实现低耦合、高内聚的代码结构,使代码更易于维护和测试。
在 Spring IoC 容器中,Bean 是被管理的对象。
通过在配置文件中定义 Bean 的信息,Spring IoC 容器可以根据这些信息来创建和管理实例。
配置文件可以使用 XML、注解或 Java 代码进行定义。
此外,Spring 还提供了依赖注入(Dependency Injection,DI)的功能,通过 DI 可以将 Bean 之间的依赖关系自动注入,减少了手动编写对象获取和依赖关系的代码量。
第二章:Spring AOPSpring AOP(Aspect Oriented Programming,面向切面编程)是Spring 框架的一个重要组成部分。
AOP 可以在不修改源代码的情况下,通过横切关注点的方式来实现对代码的增强。
横切关注点是指在应用程序中多处重复出现的功能,比如日志记录、性能监控等。
使用AOP 可以将这些功能抽象出来,分离到单独的模块中,使代码更加清晰和可维护。
在 Spring AOP 中,通过切面、切点和通知来实现横切关注点的定义和应用。
切面定义了通知的类型和连接点,可以通过注解或 XML 配置文件进行定义。
切点用于匹配连接点,通知则是在连接点的前后执行的代码块。
1.1通过代码实例跟我学SSH三大框架相互整合的应用技术(第3部分)——使用 Spring 框架的 ActionSupport组件整合 Struts框架和Spring框架的应用实例1、ActionSupport 类(1)org.springframework.web.struts.ActionSupport 类的主要功能它为org.apache.struts.action.Action类的子类,提供如下方面的功能(参考Spring API 文档说明)Convenience class for Spring-aware Struts 1.1+ Actions;Provides a reference to the current Spring application context, e.g. for bean lookup or resource loading. Auto-detects a ContextLoaderPlugIn context, falling back to the root WebApplicationContext. For typical usage, i.e. accessing middle tier beans, use a root WebApplicationContext.For Struts DispatchActions or Lookup/MappingDispatchActions, use the analogous DispatchActionSupport or LookupDispatchActionSupport / MappingDispatchActionSupport class, respectively.(2)继承关系(3)实现的方法和要求为了方便地获得Spring WebContext环境,在org.springframework.web.struts.ActionSupport 类中提供了一个getWebApplicationContext (protected final WebApplicationContext getWebApplicationContext())方法。
1.1通过代码实例跟我学Struts2框架从入门到精通——Struts2框架和Spring3.X版相互整合的应用技术及实例1.1.1Struts2和Spring3.X版系统整合的相关技术1、保证整合之前的Struts2项目是正确——先测试Struts2项目是否正确2、为什么要将Strut2与Spring进行整合(1)主要的目的能够在Struts2中应用Spring中的IoC和AoP,达到“相互利用”。
(2)在Struts2中也已经提供了struts2-spring-plugin-2.1.8.1.jar实现与Spring整合。
1.1.2构建整合两者的附加环境1、在Struts2的项目中添加与Spring整合的插件struts2-spring-plugin-2.3.1.2.jar因此,需要将struts2-spring-plugin-2.3.1.2.jar加到项目的WEB-INF/lib目录中。
2、在Struts2的Web项目中添加与Spring有关的系统包需要添加如下的Spring3.X版的系统库(共10个系统库文件),当然如果项目中已经存在有这些系统库,可以不需要重复地添加。
1)org.springframework.asm-3.0.0.RELEASE.jar2)org.springframework.beans-3.0.0.RELEASE.jar3)org.springframework.context-3.0.0.RELEASE.jar4)org.springframework.core-3.0.0.RELEASE.jar5)org.springframework.expression-3.0.0.RELEASE.jar6)org.springframework.jdbc-3.0.0.RELEASE.jar7)org.springframework.web-3.0.0.RELEASE.jar8)org.springframework.transaction-3.0.0.RELEASE.jar //Spring DAO或者与Hibernate相互整合9)aopalliance.jar10)org.springframework.aop-3.0.0.RELEASE.jar //Spring AOPSpring 3.2版本的系统包最后的结果如下:3、添加与log4J系统相关的系统库文件(1)log4J系统库log4j-1.2.12.jar和commons-logging.jar。
Spring基础入门一、基础知识1.依赖注入、控制反转依赖注入:在运行期,由外部容器动态地将依赖对象注入到组件中控制反转:应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部窗口负责得。
这样控制权就由应用转移到了外部容器,控制权的转移就是所谓的反转。
2.spring 的主要特性。
(1)降低组件之间的耦合度,实现软件各层之间的解耦。
(2)可以使用容器提供的众多服务,如:事务管理服务、消息服务、JMS 服务、持久化服务等等。
(3)容器提供单例模式支持,开发人员不再需要自己编写实现代码。
(4)容器提供了AOP 技术,利用它很容易实现如权限拦截,运行期监控等功能。
(5)容器提供的众多辅作类,使用这些类能够加快应用的开发,如:JdbcTemplate、HibernateTemplate.(6)对主流的应用框架提供了集成支持。
3.常用技术控制反转/依赖注入---面向切入编程---与主流框架的整合、管理---二、实例拓展1.准备搭建环境dist\spring.jarlib\jakata-commons\commons-loggin.jar如果使用了切面编程,还需下列jar 文件:lib\aspectj\aspectjweaver.jar 和aspectjrt.jarlib\cglib\cglib-nodep-2.1.3.jar如果使用了jsr-250 中的注解,还需要下列jar 文件:lib\j2ee\common-annotations.jar2.搭建并测试环境建立名为spring_01_base项目,根据需求导入jar包。
建立一个Junit测试单元SpringEnvTest,测试代码如下:@Testpublic void testEnv() {ApplicationContext ctx = newClassPathXmlApplicationContext("beans.xml");}beans.xml 配置文件在此省略(见下)。
一、在Eclipse中开发我的第一个Spring应用 1.一个普通的java程序使用Spring框架,我使用的Spring版本是3.2.3,lib目录下面提供了很多jar包, 这里我只是选取了需要用到的jar包
2.输出Spring容器 3.控制台输出结果
4.新建一个JavaBean-Person类 5.修改applicationContext.xml文件,将Person类部署成Spring容器中的Bean
6.从Spring容器中获取Person类的实例,调用实例的info方法 7.控制台输出结果
总结:看起来相当神奇,Spring容器不仅可以创建Person实例,而且该Person实例的name属性有了属性值。这一切,都得益于Spring容器的作用,Spring容器根据配置文件信息,负责创建Person实例,并为Person实例设置属性值-这种由Spring容器为对象设置属性的方式被称为控制反转(Inversion of Control,IOC) 二、Spring的核心机制:依赖注入 使用依赖注入,不仅可以为Bean注入普通的属性值,还可以注入其他Bean的引用。通过这种依赖注入,Java EE应用中的各种组件不需要以硬编码方式耦合在一起,甚至无需使用工厂模式。依赖注入达到的效果,非常类似于传说中的“共产主义”,当某个java实例需要其他java实例时,系统自动提供需要的实例,无需程序显示获取。 可见,依赖注入是目前最优秀的解耦方式。依赖注入让Spring的Bean以配置文件组织在一起,而不是以硬编码的方式耦合在一起。
依赖注入(Dependency Injection):在依赖注入的模式下,创建被调用者的工作不再由调用者来完成,因此称为控制反转;创建被调用者实例的工作通常由Spring容器来完成,然后注入调用者,因此也称为依赖注入。
不管是依赖注入,还是控制反转,都说明Spring采用动态、灵活的方式来管理各种对象。对象与对象之间的具体实现互相透明。
1.1在Eclipse 中创建Spring的MVC Web应用+UserLogin+DAO组件应用实例1.1.1为“Spring MVCWeb应用开发”一文提供一个DAO类1、准备本例所需要的数据库表(1)在MS SQLServer2000中的WebStudyDB中准备一个数据库表UserInfo,其中的id 为主键并且不为自动递增类型。
(2)在该表中包含一些数据2、将Eclipse中的所配置的MS SqlServer2000的驱动程序库添加到本Project中4、添加DAO的接口和DAO的实现类(1)DAO的接口DAOInterface,包名称为com.px1987.springwebapp.dao(2)在该接口中定义出下面的方法package com.px1987.springwebapp.dao;import com.px1987.springwebapp.model.*;public interface DAOInterface{public UserInfoVO selectUserInfo(String userName, String userPassWord);public boolean insertOneUserInfo(UserInfoVO oneUserInfoVO);public boolean deleteOneUserInfo(int userID);public boolean updateOneUserInfo(UserInfoVO oneUserInfoVO);}(3)DAO的实现类,DAOImple,包名称为com.px1987.springwebapp.dao(4)在该DAO的实现类中定义出org.springframework.jdbc.core.JdbcTemplate的对象jdbcTemplate属性,并提供set方法(5)编程该DAO的实现类package com.px1987.springwebapp.dao;import erInfoVO;import org.springframework.jdbc.core.*;import java.util.*;public class DAOImple implements DAOInterface{JdbcTemplate jdbcTemplate=null;public DAOImple(){}public boolean deleteOneUserInfo(int userID){return false;}public boolean insertOneUserInfo(UserInfoVO oneUserInfoVO){return false;}public UserInfoVO selectUserInfo(String userName, String userPassWord){UserInfoVO oneUserInfoVO=null;String sqlStatement="select * from UserInfo where userName=? and userPassWord =?";Object userInfoPara[]={ userName,userPassWord};java.util.List resultRows = jdbcTemplate.queryForList(sqlStatement , userInfoPara);if ((resultRows!=null)&&(resultRows.size() != 0)) //现在已经对对数据库表的访问{Map oneUserMap = (Map) resultRows.get(0);String returnUserName=(String)oneUserMap.get("userName");String returnUserPassWord=(String)oneUserMap.get("userPassWord");oneUserInfoVO=new UserInfoVO();oneUserInfoVO.setUserName(returnUserName);oneUserInfoVO.setUserPassWord(returnUserPassWord)}else{oneUserInfoVO=null;}return oneUserInfoVO;}public boolean updateOneUserInfo(UserInfoVO oneUserInfoVO){return false;}public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {this.jdbcTemplate = jdbcTemplate;}}5、在业务组件中定义一个DAOInterface的对象daoImpleObject,并为它提供set方法(1)在业务组件中定义一个DAOInterface的对象daoImpleObject(2)并编程该业务组件类中的各个方法package com.px1987.springwebapp.model;import org.springframework.beans.BeansException;import org.springframework.context.ApplicationContext;import org.springframework.context.ApplicationListener;import org.springframework.context.ApplicationContextAware;import com.px1987.springwebapp.event.*;import com.px1987.springwebapp.dao.*;public class UserManageImple implements UserManageInterface,ApplicationContextAware {private DAOInterface daoImpleObject=null;public void setDaoImpleObject(DAOInterface daoImpleObject) {this.daoImpleObject = daoImpleObject;}private ApplicationContext applicationContext;public void setApplicationContext(ApplicationContext applicationContext) throws BeansException{this.applicationContext = applicationContext;}ApplicationListener actionEventResponse=null; //代表事件响应者public void setActionEventResponse(ApplicationListener actionEventResponse){this.actionEventResponse = actionEventResponse;}public UserManageImple() {}public boolean doUserRegister(UserInfoVO userInfo ) {//完成注册功能的实现UserLoginActionEvent userLoginActionEvent = new UserLoginActionEvent(actionEventResponse); //注意指定事件的目标对象this.applicationContext.publishEvent(userLoginActionEvent); //触发事件return true;}public boolean doUserLogin(UserInfoVO oneUserInfo){boolean okOrNot=false;String userName=oneUserInfo.getUserName();String userPassWord=oneUserInfo.getUserPassWord();UserInfoVO returnOneUserInfo=daoImpleObject.selectUserInfo(userName, userPassWord);if(returnOneUserInfo==null){okOrNot=false;}else{okOrNot=true;}return okOrNot;}}6、修改springapp-servlet.xml配置文件以增加对JdbcTemplate类的注入<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN""/dtd/spring-beans-2.0.dtd"> <beans><bean id="springappController" class="com.px1987.springwebapp.control.SpringappController"><property name="viewPage"><value>showResult</value></property><property name="timeDateBusinessBean"><ref bean="timeDateBusiness"/></property></bean><bean id="timeDateBusiness" class="com.px1987.springwebapp.model.TimeBusinessImple"></bean><bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"><property name="mappings"><props><prop key="/timeRequest.do">springappController</prop><prop key="/userlogin.do">userLoginController</prop><prop key="/userRegister.do">userLoginController</prop></props></property></bean><bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="viewClass"><value>org.springframework.web.servlet.view.InternalResourceView</value></property><property name="prefix"><value>/</value></property><property name="suffix"><value>.jsp</value></property></bean><bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <property name="defaultErrorView"><value>showOtherError</value></property><property name="exceptionMappings"><props><prop key="java.sql.SQLException">showDBError</prop><prop key="ng.RuntimeException">showRuntimeError</prop></props></property></bean><bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName"><value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value> </property><property name="url"><value>jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=WebStudyDB</val ue></property><property name="username"><value>sa</value></property><property name="password"><value>1234</value></property></bean><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource"><ref bean="dataSource"/></property></bean><bean id="daoImpleObject" class="com.px1987.springwebapp.dao.DAOImple"> <property name="jdbcTemplate"><ref bean="jdbcTemplate"/></property></bean></beans>7、修改userManager.xml的配置文件中的相关配置项目<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN""/dtd/spring-beans-2.0.dtd"><beans><bean id="actionEventResponse" class="com.px1987.springwebapp.event.ActionEventResponse"></bean><bean id="userLoginImpleBean" class="erManageImple"><property name="actionEventResponse"><ref bean="actionEventResponse"/></property><property name="daoImpleObject"><ref bean="daoImpleObject"/></property></bean><bean id="userLoginController" class="erManageController"><property name="commandClass"><value>erLoginForm</value> </property><property name="userLoginImpleBean"><ref bean="userLoginImpleBean"/></property><property name="loginSuccess"><value>loginSuccess</value></property><property name="loginFailure"><value>loginFailure</value></property><property name="registerSuccess"><value>userLogin/registerSuccess</value></property><property name="registerFailure"><value>userLogin/registerFailure</value></property></bean></beans>8、执行本Web应用的实例测试页面(1)输入用户名称为:yang和密码为:1234或者用户名称为:admin和密码为:admin (根据前面的数据库表中的数据值),都将产生登录成功的提示。
1.1通过代码实例跟我学Spring框架从入门到精通——Spring框架系统的API及应用实例1、org.springframework.beans 包(1)其中的相关的类和接口(2)Spring 的核心是org.springframework.beans 包该包中所提供的各个类和接口主要是为使用JavaBeans 技术、并且能够实现按名检索对象及管理对象间的关系而设计的。
这个包通常不是由用户直接使用,而是由服务器将其用作其他多数功能的底层中介。
关于beans 包,有三个重要的概念。
1)BeanWrapper接口首先,它提供了设置/读取Javabeans 属性功能的BeanWrapper接口。
2)BeanFactory接口第二个重要概念是Bean 工厂。
BeanFactory接口是一个泛化工厂,具有实例化对象和管理不同对象间关系的能力。
BeanFactory 可以管理几种不同类型的bean,并且支持串行化及其他生命周期方法。
BeanFactory 接口,它是工厂设计模式的实现,允许通过名称创建和检索对象。
BeanFactory 也可以管理对象之间的关系。
3)bean 的定义(命名规则)BeanFactory 是按照bean 定义(BeanDefinition)来实例化对象的。
BeanDefinition,顾名思义,是我们对bean 的定义。
通过BeanDefinition,我们不仅可以定义bean 的类结构、实例化的方式,还可以定义bean 在运行时的配合者(相关联的其它对象)。
2、Spring Framework中的核心组件的实现类----BeanWrapper接口BeanWrapper 接口的功能多少就如它的名字所暗示的:对bean 进行包装,然后对包装后的bean 加以操作,例如设置属性值、检索属性值等等。
(1)在Java中如何动态设置一个对象属性我们知道,如果动态设置一个对象属性,可以借助Java的Reflection机制完成:Class oneClassObj = Class.forName("erInfo");Method oneMethodObj =oneClassObj.getMethod("setUserName",new Class[]{String.class});Object oneObject = (Object) oneClassObj.newInstance();oneMethodObj.invoke(oneObject,new Object[]{"用户的名称"});上面我们通过动态加载了erInfo类,并通过Reflection调用了UserInfo.setUserName方法设置其userName属性为"用户的名称"。
如果这些常量都是通过配置文件读入,则就实现了一个最简单的BeanWrapper。
这个BeanWrapper的功能很简单,提供一个设置JavaBean属性的通用方法。
(2)利用BeanWrapper接口来实现动态设置一个对象属性Spring BeanWrapper基于与前面同样的原理,只是提供了一个更加完善的实现。
下面给出一个代码示例以了解在应用系统中如何通过Spring BeanWrapper类来操作一个JavaBean。
Object oneObject = Class.forName("erInfo").newInstance();BeanWrapper oneBeanWrapper = new BeanWrapperImpl(oneObject);oneBeanWrapper.setPropertyValue("userName", "用户的名称");System.out.println("UserName="+oneBeanWrapper.getPropertyValue("userName") );尽管通过这样的方式设定JavaBean的属性实在繁琐,但它却提供了一个通用的属性设定机制,而这样的机制,也正是Spring依赖注入机制所依赖的基础。
上面的代码中,仅仅是指定了需要设置的属性名"userName",BeanWrapper将根据JavaBean规范,动态调用对象的"setUserName"方法进行属性设定。
(3)主要的作用通过BeanWrapper接口,我们可以无需在编码时就指定JavaBean的实现类和属性值,通过在配置文件加以设定,就可以在运行期动态创建对象并设定其属性(依赖关系)。
3、Spring Framework中的核心组件的实现类----org.springframework.beans.factory.BeanFactory接口(1)主要的作用Bean Factory,顾名思义,是根据配置文件负责创建Bean的实例,并负责Bean的生命周期的管理---,包括Bean的生成与销毁、Bean的创建方式的识别(是否为singleton)、Bean的各个属性的设定、依赖关系的建立等。
如下面的配置:<bean id="oneHelloBean" class="com.px1987.HelloBean" singleton="false"> singleton的缺省设置为true,如果將其设计为false,每次需要时,将重新创建一个新的对象实例。
XmlBeanFactory从xml文件中读取bean定义,同时ListableBeansFactory从属性文件中读取定义。
(2)BeanFactory 支持两个对象模型1)单态:模型提供了具有特定名称的对象的共享实例,可以在查询时对其进行检索。
Singleton 是默认的也是最常用的对象模型。
对于无状态服务对象很理想。
2)原型:模型确保每次检索都会创建单独的对象。
在每个用户都需要自己的对象时,原型模型最适合。
注意:在Spring中消除了由用户自己来实现Singleton模式的应用,Spring Bean的缺省行为就是Singleton,不必再为了Singleton编码。
<bean id="oneHelloBean" class="com.px1987.HelloBean" singleton="false"> (3)BeanFactory中一个bean的生命周期其中IoC容器控制Bean的生命周期,各个Bean通过它们之间的依赖关系由IoC容器预先对它们进行初始化。
当各个Bean都准备就序时,它们就进入准备工作状态。
最后捕再需要它们时,由IoC容器撤销这些Bean。
(4)配置文件中的主要项目1)Bean属性值及依赖关系(对其他Bean的引用)2)Bean创建模式(是否Singleton模式,即是否只针对指定类维持全局唯一的实例)3)Bean初始化和销毁方法4)Bean的依赖关系Bean的定义配置标签中的主要属性的说明(5)一个较为完整的Bean配置示例<beans><description>Spring Bean 配置示例</description><bean id="oneUserInfo " ⑴class="erInfo" ⑵singleton="true" ⑶init-method="init" ⑷destroy-method="cleanUpMethod" ⑸depends-on="UserInfoManagMethod"> ⑹<property name="userName"><value>用户名称</value> ⑺</property><property name="userAge"><null/></property><property name="userPrevile"><ref local="userPrevile"/> ⑻</property></bean><bean id="userPrevile" class=" erPrevile"><property name="userType"><value>normal</value></property></bean></beans>(6)解释说明⑴ id:Java Bean在BeanFactory中的唯一标识,代码中通过BeanFactory获取JavaBean实例时需以此作为索引名称。
⑵ class:JavaBean 类名⑶ singleton:指定此JavaBean是否采用单例(Singleton)模式,如果设为"true",则在BeanFactory作用范围内,只维护此JavaBean的一个实例,代码通过BeanFactory 获得此JavaBean实例的引用。
反之,如果设为"false",则通过BeanFactory获取此Java Bean实例时,BeanFactory每次都将创建一个新的实例返回。
⑷ init-method:初始化方法,此方法将在BeanFactory创建JavaBean实例之后,在向应用层返回引用之前执行。
一般用于一些资源的初始化工作。
⑸ destroy-method:销毁方法。
此方法将在BeanFactory销毁的时候执行,一般用于资源释放。
⑹ depends-on:Bean依赖关系。
一般情况下无需设定。
Spring会根据情况组织各个依赖关系的构建工作(这里示例中的depends-on属性非必须)。
只有某些特殊情况下,如JavaBean中的某些静态变量需要进行初始化(这是一种BadSmell,应该在设计上应该避免)。
通过depends-on指定其依赖关系可保证在此Bean 加载之前,首先对depends-on所指定的资源进行加载(本例将首先创建ActionManager 组件对象)。