Spring2.5Dev
- 格式:pdf
- 大小:2.02 MB
- 文档页数:91
Spring简介什么是Spring?spring是分层的avaSE以及javaEE应⽤于全栈的轻量级开源框架,以IOC(Inverse Of Control)控制反转,AOP(Aspect Oriented Programing)⾯向切⾯编程为核⼼,提供表现层SpringMVC以及持久层Spring,并且可整合多种其他开源框架。
spring的本质是管理对象,包括创建对象及维护对象之间的关系。
spring的优点1)⽅便解耦,简化开发通过spring的IOC可将对象的创建,以及对象之间的依赖都交由spring容器来进⾏管理,这样可以降低程序之间的耦合。
并且开发时也只需关注上层的应⽤,不⽤再多关注底层的应⽤。
2)AOP编程的⽀持spring⽀持AOP⾯向切⾯编程,许多OOP⾯向对象编程不能或很难实现的功能,都可通过AOP轻松实现。
3)声明式事务的⽀持可以将我们从单调烦闷的事务管理中解放出来,通过声明式事务的⽅式,可以灵活的进⾏事务管理,进⽽提⾼开发的质量和效率。
4)⽅便程序的测试可以⽤⾮容器依赖的编程⽅式进⾏⼏乎所有的测试⼯作,测试不再是昂贵的操作,⽽是随⼿可做的事情。
5)⽅便集成各种优秀的框架Spring可以降低各种框架的使⽤难度,提供了对各种优秀框架(Struts、Hibernate、Hessian、Quartz等)的直接⽀持。
6)降低javaEE的API的使⽤难度Spring对 JavaEE API(如 JDBC、JavaMail、远程调⽤等)进⾏了薄薄的封装层,使这些API 的使⽤难度⼤为降低。
7)spring框架的源码是经典学习的案例Spring的源代码设计精妙、结构清晰、匠⼼独⽤,处处体现着⼤师对Java设计模式灵活运⽤以及对 Java技术的⾼深造诣。
它的源代码⽆疑是Java技术的最佳实践的范例。
通过Spring进⾏解耦什么叫程序的耦合?在程序中,对象之间相互依赖,相互传递数据,这种相互关联的程度越⾼,程序的耦合度就越⾼。
SpringBoot2.2.5整...展开全文前言:该博客主要是记录自己学习的过程,方便以后查看,当然也希望能够帮到大家。
由于工作上的需要,初步了解Quartz后进行使用。
完整代码地址在结尾!!第一步,在pom.xml文件中加入依赖,如下<!-- Quartz --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-quartz</artifactId></dependency>第二步,自定义JobFactory类注意:我注入了一个自定义的JobFactory ,然后把它设置为SchedulerFactoryBean的JobFactory。
让其在具体job类实例化时使用spring的api来进行依赖注入,目的是因为我在具体的job中需要注入一些spring的bean。
import org.quartz.spi.TriggerFiredBundle;importorg.springframework.beans.factory.config.AutowireCapableBean Factory;importorg.springframework.scheduling.quartz.AdaptableJobFactory;import ponent;/*** @version 1.0* @author jinhaoxun* @date 2018-05-09* @description Quartz创建JobFactory实例*/@Componentpublic class JobFactory extends AdaptableJobFactory {/*** AutowireCapableBeanFactory接口是BeanFactory的子类* 可以连接和填充那些生命周期不被Spring管理的已存在的bean 实例*/private AutowireCapableBeanFactory factory;/*** @author jinhaoxun* @description 构造器* @param factory*/public JobFactory(AutowireCapableBeanFactory factory) {this.factory = factory;}/*** @author jinhaoxun* @description 创建Job实例* @param bundle* @return Object*/@Overrideprotected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {Object job = super.createJobInstance(bundle);// 实例化对象factory.autowireBean(job);// 进行注入(Spring管理该Bean)return job;//返回对象}}第三步,自定义QuartzConfig配置文件import lombok.extern.slf4j.Slf4j;import org.quartz.Scheduler;import org.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.scheduling.quartz.SchedulerFactoryBean;/*** @version 1.0* @author jinhaoxun* @date 2018-05-09* @description Quartz配置*/@Slf4j@Configurationpublic class QuartzConfig {private JobFactory jobFactory;/*** @author jinhaoxun* @description 构造器* @param jobFactory*/public QuartzConfig(JobFactory jobFactory){this.jobFactory = jobFactory;}/*** @author jinhaoxun* @description 配置SchedulerFactoryBean,将一个方法产生为Bean并交给Spring容器管理* @return SchedulerFactoryBean*/@Beanpublic SchedulerFactoryBean schedulerFactoryBean() {("开始注入定时任务调度器工厂...");SchedulerFactoryBean factory = new SchedulerFactoryBean();// Spring提供SchedulerFactoryBean为Scheduler提供配置信息,并被Spring容器管理其生命周期factory.setJobFactory(jobFactory);// 设置自定义Job Factory,用于Spring管理Job bean("注入定时任务调度器工厂成功!");return factory;}@Bean(name = "scheduler")public Scheduler scheduler() {return schedulerFactoryBean().getScheduler();}}第四步,新增任务请求实体类AddSimpleJobReq,AddCronJobReq,DeleteJobReq,如下AddSimpleJobReqimport lombok.Data;import java.util.Date;import java.util.HashMap;import java.util.Map;/*** @Description: 新增Simple定时任务请求实体类* @Author: jinhaoxun* @Date: 2020/1/15 11:20* @Version: 1.0.0*/@Datapublic class AddSimpleJobReq {private String jobClass;private Date date;private Map<String, String> params = new HashMap<>();}AddCronJobReqimport lombok.Data;import java.util.HashMap;import java.util.Map;/*** @Description: 新增Cron定时任务请求实体类* @Author: jinhaoxun* @Date: 2020/1/15 11:20* @Version: 1.0.0*/@Datapublic class AddCronJobReq {private String jobName;private String jobGroupName;private String triggerName;private String triggerGroupName;private String jobClass;private String date;private Map<String, String> params = new HashMap<>();}DeleteJobReqimport lombok.Data;/*** @Description: 删除定时任务请求实体类* @Author: jinhaoxun* @Date: 2020/1/15 11:20* @Version: 1.0.0*/@Datapublic class DeleteJobReq {private String jobName;private String jobGroupName;private String triggerName;private String triggerGroupName;}第五步,自定义QuartzManager类,用于操作定时任务import com.jinhaoxun.quartz.entity.request.AddCronJobReq;importcom.jinhaoxun.quartz.entity.request.AddSimpleJobReq;import com.jinhaoxun.quartz.entity.request.DeleteJobReq;import lombok.extern.slf4j.Slf4j;import org.quartz.*;import org.springframework.stereotype.Service;import static org.quartz.DateBuilder.futureDate;/*** @Description: Quartz管理操作类* @Author: jinhaoxun* @Date: 2020/1/15 11:20* @Version: 1.0.0*/@Slf4j@Servicepublic class QuartzManager {private Scheduler scheduler;/*** @author jinhaoxun* @description 构造器* @param scheduler 调度器*/public QuartzManager(Scheduler scheduler){this.scheduler = scheduler;}/*** quartz任务类包路径*/private static String jobUri = "com.jinhaoxun.quartz.job.";/*** @author jinhaoxun* @description 添加一个Simple定时任务,只执行一次的定时任务* @param addSimpleJobReq 参数对象* @param taskId 任务ID,不能同名* @throws RuntimeException*/@SuppressWarnings({ "unchecked", "rawtypes" })public void addSimpleJob(AddSimpleJobReq addSimpleJobReq, String taskId) throws Exception {String jobUrl = jobUri + addSimpleJobReq.getJobClass();try {Class<? extends Job> aClass = (Class<? extends Job>) Class.forName(jobUrl).newInstance().getClass();// 任务名,任务组,任务执行类JobDetail job = JobBuilder.newJob(aClass).withIdentity(taskId,"JobGroup").build();//增加任务ID参数addSimpleJobReq.getParams().put("taskId",taskId);// 添加任务参数job.getJobDataMap().putAll(addSimpleJobReq.getParams());// 转换为时间差,秒单位int time = (int) (addSimpleJobReq.getDate().getTime() - System.currentTimeMillis()) / 1000;SimpleTrigger trigger = (SimpleTrigger) TriggerBuilder.newTrigger().withIdentity(taskId, taskId + "TiggerGroup").startAt(futureDate(time, DateBuilder.IntervalUnit.SECOND)) .build();// 调度容器设置JobDetail和Triggerscheduler.scheduleJob(job, trigger);if (!scheduler.isShutdown()) {// 启动scheduler.start();}} catch (Exception e) {("Quartz新增任务失败");}}/*** @author jinhaoxun* @description 添加一个Cron定时任务,循环不断执行的定时任务* @param addCronJobReq 参数对象* @throws Exception*/@SuppressWarnings({ "unchecked", "rawtypes" })public void addCronJob(AddCronJobReq addCronJobReq) throws Exception {String jobUrl = jobUri + addCronJobReq.getJobClass();try {Class<? extends Job> aClass = (Class<? extends Job>) Class.forName(jobUrl).newInstance().getClass();// 任务名,任务组,任务执行类JobDetail job = JobBuilder.newJob(aClass).withIdentity(addCronJobReq.getJobN ame(),addCronJobReq.getJobGroupName()).build();// 添加任务参数job.getJobDataMap().putAll(addCronJobReq.getParams());// 创建触发器CronTrigger trigger = (CronTrigger) TriggerBuilder.newTrigger()// 触发器名,触发器组.withIdentity(addCronJobReq.getTriggerName(),addCronJobReq.getTriggerGroupName())// 触发器时间设定.withSchedule(CronScheduleBuilder.cronSchedule(addCronJ obReq.getDate())).build();// 调度容器设置JobDetail和Triggerscheduler.scheduleJob(job, trigger);if (!scheduler.isShutdown()) {// 启动scheduler.start();}} catch (Exception e) {("Quartz新增任务失败");}}/*** @author jinhaoxun* @description 修改一个任务的触发时间* @param triggerName 触发器名* @param triggerGroupName 触发器组名* @param cron 时间设置,参考quartz说明文档* @throws Exception*/public void modifyJobTime(String triggerName, String triggerGroupName, String cron) throws Exception {try {TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName);CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);if (trigger == null) {return;}String oldTime = trigger.getCronExpression();if (!oldTime.equalsIgnoreCase(cron)) {// 触发器TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();// 触发器名,触发器组triggerBuilder.withIdentity(triggerName, triggerGroupName);triggerBuilder.startNow();// 触发器时间设定triggerBuilder.withSchedule(CronScheduleBuilder.cronSched ule(cron));// 创建Trigger对象trigger = (CronTrigger) triggerBuilder.build();// 方式一:修改一个任务的触发时间scheduler.rescheduleJob(triggerKey, trigger);}} catch (Exception e) {("Quartz修改任务失败");}}/*** @author jinhaoxun* @description 移除一个任务* @param deleteJobReq 参数对象* @throws Exception*/public void removeJob(DeleteJobReq deleteJobReq) throws Exception {try {TriggerKey triggerKey = TriggerKey.triggerKey(deleteJobReq.getTriggerName(), deleteJobReq.getTriggerGroupName());// 停止触发器scheduler.pauseTrigger(triggerKey);// 移除触发器scheduler.unscheduleJob(triggerKey);// 删除任务scheduler.deleteJob(JobKey.jobKey(deleteJobReq.getJobNa me(), deleteJobReq.getJobGroupName()));} catch (Exception e) {("Quartz删除改任务失败");}}/*** @author jinhaoxun* @description 获取任务是否存在* @param triggerName 触发器名* @param triggerGroupName 触发器组名* @return Boolean 返回操作结果* 获取任务是否存在* STATE_BLOCKED 4 阻塞* STATE_COMPLETE 2 完成* STATE_ERROR 3 错误* STATE_NONE -1 不存在* STATE_NORMAL 0 正常* STATE_PAUSED 1 暂停* @throws Exception*/public Boolean notExists(String triggerName, String triggerGroupName) throws Exception {try {if(scheduler.getTriggerState(TriggerKey.triggerKey(triggerName, triggerGroupName)) == Trigger.TriggerState.NORMAL){ return true;}} catch (Exception e) {("Quartz获取任务是否存在失败");}return false;}/*** @author jinhaoxun* @description 关闭调度器* @throws RuntimeException*/public void shutdown() throws Exception {try {if(scheduler.isStarted()){scheduler.shutdown(true);}} catch (Exception e) {("Quartz关闭调度器失败");}}}第六步,新增自定义任务类型,将要做的操作放到该类的execute方法中,主要该类的路径,要放到上面配置的com.jinhaoxun.quartz.job包里面import lombok.extern.slf4j.Slf4j;import org.quartz.Job;import org.quartz.JobDataMap;import org.quartz.JobExecutionContext;/*** @Description: Job测试类* @Author: jinhaoxun* @Date: 2020/1/15 11:20* @Version: 1.0.0*/@Slf4jpublic class JobT est implements Job {/*** @author jinhaoxun* @description 重写任务内容* @param jobExecutionContext 设置的key* @throws*/@Overridepublic void execute(JobExecutionContextjobExecutionContext) {//获取参数JobDataMap dataMap = jobExecutionContext.getMergedJobDataMap();String id = dataMap.getString("id");String name = dataMap.getString("name");try {("执行任务{},{}",id,name);} catch (Exception e) {("Quartz执行失败");}}}第七步,编写单元测试类,QuartzApplicationTests,并进行测试,使用方法基本都有注释import com.luoyu.quartz.entity.request.AddCronJobReq;import com.luoyu.quartz.entity.request.AddSimpleJobReq;import com.luoyu.quartz.entity.request.DeleteJobReq;import com.luoyu.quartz.manager.QuartzManager;import lombok.extern.slf4j.Slf4j;import org.junit.jupiter.api.AfterEach;import org.junit.jupiter.api.BeforeEach;import org.junit.jupiter.api.Test;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.boot.test.context.SpringBootT est;import java.util.Calendar;import java.util.Date;import java.util.HashMap;import java.util.Map;@Slf4j// 获取启动类,加载配置,确定装载 Spring 程序的装载方法,它回去寻找主配置启动类(被 @SpringBootApplication 注解的)@SpringBootT estclass QuartzApplicationTests {@Autowiredprivate QuartzManager quartzManager;@Testvoid addSimpleJobTest() throws Exception {Map<String, String> params = new HashMap<>();params.put("id","测试id");params.put("name","测试name");Calendar beforeTime = Calendar.getInstance();// 5 秒之后的时间beforeTime.add(Calendar.SECOND, 5);Date beforeDate = beforeTime.getTime();AddSimpleJobReq addSimpleJobReq = new AddSimpleJobReq();addSimpleJobReq.setDate(beforeDate);addSimpleJobReq.setJobClass("JobTest");addSimpleJobReq.setParams(params);quartzManager.addSimpleJob(addSimpleJobReq, "123");// 让主线程睡眠60秒Thread.currentThread().sleep(60000);}@Testvoid addCronJobT est() throws Exception {Map<String, String> params = new HashMap<>();params.put("id","测试id");params.put("name","测试name");AddCronJobReq addCronJobReq = new AddCronJobReq();//每 5 秒执行一次addCronJobReq.setDate("0/5 * * * * ?");addCronJobReq.setJobClass("JobTest");addCronJobReq.setJobGroupName("JobGroupName");addCronJobReq.setJobName("JobName");addCronJobReq.setParams(params);addCronJobReq.setTriggerGroupName("triggerGroupName ");addCronJobReq.setTriggerName("triggerName");quartzManager.addCronJob(addCronJobReq);// 让主线程睡眠60秒Thread.currentThread().sleep(60000);}@Testvoid removeJobTest() throws Exception {Map<String, String> params = new HashMap<>();params.put("id","测试id");params.put("name","测试name");Calendar beforeTime = Calendar.getInstance();// 5 秒之后的时间beforeTime.add(Calendar.SECOND, 5);Date beforeDate = beforeTime.getTime();AddSimpleJobReq addSimpleJobReq = new AddSimpleJobReq();addSimpleJobReq.setDate(beforeDate);addSimpleJobReq.setJobClass("JobTest");addSimpleJobReq.setParams(params);quartzManager.addSimpleJob(addSimpleJobReq, "123");DeleteJobReq deleteJobReq = new DeleteJobReq();deleteJobReq.setJobName("123");deleteJobReq.setJobGroupName("123JobGroup");deleteJobReq.setTriggerName("123");deleteJobReq.setTriggerGroupName("123TiggerGroup");quartzManager.removeJob(deleteJobReq);// 让主线程睡眠60秒Thread.currentThread().sleep(60000);}@Testvoid shutdownTest() throws Exception {quartzManager.shutdown();}@BeforeEachvoid testBefore(){("测试开始");}@AfterEachvoid testAfter(){("测试结束");}}完整代码地址:https:///Jinhx128/springboot-demo注:此工程包含多个module,本文所用代码均在quartz-demo 模块下后记:本次分享到此结束,本人水平有限,难免有错误或遗漏之处,望大家指正和谅解,欢迎评论留言。
Spring 3.x权威开发指南:实施Java EE 6的利器2011年8月31日目录序 (VIII)前言 (X)1借助Spring 3.1实施Java EE 6 (1)1.1Java EE 6编程模型讨论 (1)1.1.1Java EE 6够敏捷,No! (1)1.1.2盘旋于具体与抽象之间 (2)1.2挖掘Spring 3.1的架构价值 (3)1.2.1精耕细作于Java EE 6平台 (3)1.2.2面向Spring的SpringSource Tool Suite集成开发工具 (3)1.2.3全面拥抱OSGi 4.2 (4)1.2.4开发者决定一切 (4)1.3下载及构建Spring 3.1 (5)1.3.1下载Spring 3.1正式发布版 (5)1.3.2基于SVN库持续构建Spring源码 (6)1.4小结 (7)2控制反转容器 (8)2.1DI及Spring DI概述 (8)2.1.1面向Java ME/Java SE的BeanFactory (8)2.1.2面向Java EE的ApplicationContext (9)2.2多种依赖注入方式 (9)2.2.1设值注入 (9)2.2.2构建器注入 (11)2.2.3属性注入 (12)2.2.4方法注入 (12)2.3借助Autowiring策略智能注入协作者 (13)2.3.1<bean/>元素的autowire属性 (13)2.3.2基于@Required注解加强协作者管理 (14)2.3.3基于@Autowired或@Inject注解的另一Autowiring策略 (16)2.3.4借助primary属性或@Qualifier注解细粒度控制Autowiring策略 (16)2.4资源操控 (19)2.5将DI容器宿主到Web容器中 (19)2.6外在化配置应用参数 (19)2.7Spring受管Bean的作用范围 (19)2.8Bean Validation集成支持 (19)2.9回调接口集合及触发顺序 (19)2.10<util/>命名空间 (20)2.11值得重视的若干DI特性 (20)2.11.1depends-on属性 (20)2.11.2别名(Alias) (20)2.11.3工厂Bean和工厂方法 (20)2.11.4<p/>命名空间 (21)2.11.5抽象和子Bean (21)2.12基于注解(Annotation)方式配置DI容器 (21)2.13Spring表达式语言(SpEL)支持 (22)2.13.1核心接口及类 (22)2.13.2基于API方式使用 (22)2.13.3基于XML方式使用 (22)2.13.4基于Annotation注解使用 (22)2.13.5SpEL语法速查 (22)2.14回调接口集合及其触发顺序 (22)2.14.1BeanNameAware回调接口 (22)2.14.2BeanClassLoaderAware回调接口 (23)2.14.3BeanFactoryAware回调接口 (23)2.14.4ResourceLoaderAware回调接口 (23)2.14.5ApplicationEventPublisherAware回调接口 (23)2.14.6MessageSourceAware回调接口 (23)2.14.7ApplicationContextAware回调接口 (23)2.14.8@PostConstruct注解 (23)2.14.9InitializingBean回调接口 (23)2.14.10<bean/>元素的init-method属性 (24)2.14.11@PreDestroy注解 (24)2.14.12DisposableBean回调接口 (24)2.14.13<bean/>元素的destroy-method属性 (24)2.15小结 (24)3面向切面编程 (25)3.1AOP及Spring AOP基础 (25)3.1.1细说AOP (25)3.1.2Spring AOP基础概念 (25)3.2AspectJ 6初探 (25)3.3老式Spring AOP (25)3.4基于@AspectJ的Spring AOP (26)3.5基于<aop:config/>元素的AOP (26)3.5.1巧用<aop:include/>元素 (26)3.6在AspectJ 6应用中启用@Configurable注解 (26)3.6.1显式使用AnnotationBeanConfigurerAspect切面 (26)3.6.2阐述@Configurable注解 (28)3.6.3通过META-INF/aop.xml(或aop-ajc.xml)控制启用的切面集合 (30)3.6.4<context:spring-configured/>元素 (31)3.6.5初探<context:load-time-weaver/>元素 (31)3.7小结 (31)4DAO层集成支持 (33)4.1RDBMS持久化操作抽象支持 (33)4.2.1JDBC最佳实践 (33)4.3事务集成支持 (33)4.4集成测试支持 (33)4.5在AspectJ 6应用中启用@Transactional注解 (33)4.6小结 (33)5Hibernate、JPA集成 (34)5.1Hibernate集成支持 (34)5.2JPA集成支持 (34)5.3智能处理Java EE容器中的装载期织入(LTW) (34)5.4小结 (35)6O/X Mapping集成支持 (36)6.1O/X Mapping集成支持 (36)6.1.1Marshaller及Unmarshaller接口 (37)6.2实践XMLBeans集成支持 (37)6.2.1借助Ant生成XMLBeans JAR (38)6.2.2XmlBeansMarshaller实现类 (39)6.2.3<oxm:xmlbeans-marshaller/>元素 (40)6.3小结 (40)7集成Java EE其他容器服务 (41)7.1简化JNDI操作 (41)7.2集成EJB 3.1 (41)7.3线程池及任务调度集成支持 (41)7.4集成JMS (41)7.5集成JavaMail (41)7.6集成分布式操作 (41)7.7集成JMX (42)7.8集成Java EE连接器架构 (42)8Web层集成支持 (43)8.1Spring Web MVC框架 (43)8.2Spring Portlet MVC框架 (43)8.3REST架构风格 (43)8.4小结 (43)9高级Spring 3.0特性 (44)9.1优雅销毁DI容器 (44)9.2小结 (44)10附录A:安装及使用SpringSource Tool Suite (45)10.1获得SpringSource Tool Suite (45)10.2安装SpringSource Tool Suite (45)10.3使用SpringSource Tool Suite (47)10.3.1针对Spring 3.1的支持 (47)10.3.2针对Spring Web Flow的支持 (49)10.3.3针对Spring Batch的支持 (50)10.3.4针对Spring Roo的支持 (50)11附录B:Spring 3.1内置的命名空间 (51)11.1<beans/>命名空间 (51)11.2<context/>命名空间 (51)11.3<util/>命名空间 (51)12附录C:Spring Web Services (52)12.1文档驱动的Web服务 (52)12.2面向OXM的Web服务实现策略 (52)12.3Web服务安全 (52)13附录D:Spring Web Flow (53)13.2探索Spring Web Flow (53)14附录E:Spring BlazeDS Integration (54)14.1Flex-RIA王者 (54)14.2简化BlazeDS的使用 (54)14.3深入到Spring BlazeDS Integration中 (54)15附录F:Spring Roo (55)15.1快速研发之道 (55)15.1.1Spring Roo概述 (55)15.2Spring Roo架构哲学 (55)15.3深入到Spring Roo中 (55)16附录G:相关资料 (56)16.1图书 (56)16.2网站 (56)序从2003年开始,开源Spring一直在同Java EE携手走来。
在eclipse中新建Dynamicwebproject时选择2.5和3.0的区别(⾥⾯涉。
1、Dynamic web project时选择2.5和3.0是指servlet的版本,是2.5的还是3.0的servlet3.0以后⽀持异步2、dynamic web module和对应的TOMCAT 版本dynamic web module 2.4 对应Tomcat 5.5dynamic web module 2.5 对应Tomcat 6.0dynamic web module 3.0 对应Tomcat 7.0具体可以参考如下博⽂:/s/blog_529aacbd01014cc8.html3、不同版本(2.3,2.4,2.5,3.0)的Servlet web.xml 头信息参考:/z69183787/article/details/360080974、Servlet和Tomcat的基础知识参考:/pirateleo/article/details/85749735、Servlet 3特性:异步Servlet参考:/8864.html6、tomcat⾥边的servlet.jar对应哪个版本的java API?追问:这张表我看到了,但是看不太明⽩,⾥边的那个servlet/jsp 的版本是怎么回事呀?servlet-api.jar ⾥边的.class⽂件不是javaee 的servlet包⾥边的类的实现吗?追答:servlet/jsp当然有⾃⼰的版本。
每次重⼤的升级,都会意味着版本的升级。
可能你现在多半在纠结servlet-api和javaee的关系。
下⾯举个例⼦: MyEclipse 8新建webProject后,MyEclipse⾃动在项⽬中引⽤了Java EE 5 Libraries,⾥⾯包括了 javaee.jar,jsf-impl.jar,jsf-api.jar,jstl-1.2.jar这四个包,其中javaee.jar包中包括了编写servlet的类,在项⽬中新建⼀个servlet。
Spring2.5、Struts2、Ibatis开发框架搭建(一)ssi, ibatis网站:http://114.80.201.3/tag.php?name=ssiCsdn网站:/一、框架下载1.1 Struts2框架Struts2框架发展于WebWork,现在捐献给了Apache开源组织,最新版本的Struts2框架可以从位于Apache官方网站的Struts2项目中获取,Struts2框架的项目主页地址为:/,下载页面地址为: /download.cgi,打开下载地址以后自己选择最新发布的版本即可,新手的话下载Full Distribution的版本,例如/download.cgi#struts2014中的struts-2.0.14-full.zip。
为了让struts2能够支持json格式的返回数据,还需要下载json插件,下载地址为/p/jsonplugin/,下载文件为jsonplugin-0.31.jar 文件。
1.2 Spring2.5 框架Spring框架的官方网站地址:/,下载页面为:/download,打开下载页面以后选择Get the latest Spring releases here中的发行包去下载使用,注意Spring官方网站中包含的框架有很多,包括流程处理、安全、Web服务等很多种框架,我们需要下载的框架是Spring FrameWork 的某个版本,不是其它的那些框架。
1.3 Ibatis框架iBATIS框架的主页是/,在打开的网站界面中选择选择左边的Get software中的for java连接,在打开的界面中选择下载连接。
1.4 其它(数据库缓冲池框架等)如果需要使用Ms Sql Server数据库的话,还需要在项目中加入jtds 的JDBC驱动程序,下载地址/,找到download连接,按提示信息下载即可。
下载DBCP数据库缓冲池框架,下载地址为/dbcp/,下载最新版本即可,因为DBCP框架是apache开源软件组织的众多框架中的一部分,要让DBCP工作的话,还需要common-pool框架,自行到apache官方网站下载二、向项目中加入Spring Struts iBATIS框架2.1 准备工作将下载的三个框架分别解压缩。
SpringWebflux详细讲解1.背景2.Spring5 框架新功能(Webflux)2.1.SpringWebflux 介绍(1)webFlux是 Spring5 添加的新模块,⽤于 web 的开发,功能和 SpringMVC 类似的,Webflux 使⽤当前⼀种⽐较流程响应式编程出现的框架。
在spring5的jar包中和架构图中我们都可以看见(2)使⽤传统 web 框架,⽐如 SpringMVC,这些基于 Servlet 容器,Webflux 是⼀种异步⾮阻塞的框架, 异步⾮阻塞的框架在 Servlet3.X以后才⽀持,核⼼是基于 Reactor 的API 实现的。
(3)异步与同步,阻塞与⾮阻塞的理解 这⾥做⼀个简单的通俗的解释: 1.异步和同步针对调⽤者,调⽤者发送请求,如果等着对⽅回应之后才去做其他事情就是同步,如果发送请求之后不等着对⽅回应就去做其他事情就是异步 2.阻塞和⾮阻塞针对被调⽤者,被调⽤者接受到请求之后,做完请求任务之后才给出反馈就是阻塞,接受到请求之后马上给出反馈然后再去做事情就是⾮阻塞 如果想深⼊理解并实践应⽤异步同步阻塞⾮阻塞等技术,可能会涉及到⽹络编程、socket、BIO、NIO、AIO、Netty等技术,⼤家可以学习之前讲的《⽹络编程系列课程》(4)Webflux 特点:特性⼀、异步⾮阻塞SpringMVC是同步阻塞的IO模型,资源浪费相对来说⽐较严重,当我们在处理⼀个⽐较耗时的任务时,例如:上传⼀个⽐较⼤的⽂件,⾸先,服务器的线程⼀直在等待接收⽂件,在这期间它就像个傻⼦⼀样等在那⼉(放学别⾛),什么都⼲不了,好不容易等到⽂件来了并且接收完毕,我们⼜要将⽂件写⼊磁盘,在这写⼊的过程中,这根线程⼜要等到⽂件写完才能去⼲其它的事情。
这⼀前⼀后的等待,浪费了⼤量的资源。
⽽Spring WebFlux就是来解决这个问题的,Spring WebFlux可以做到异步⾮阻塞。
SpringBoot项目远程Debug模式(Eclipse)Spring Boot 是一个用于简化 Spring 应用开发的框架,它可以帮助我们快速搭建和部署应用。
在开发过程中,我们经常需要进行 Debug 来定位问题。
本文将介绍如何使用 Eclipse 远程 Debug Spring Boot 项目。
```javapublic class MyApplicationpublic static void main(String[] args)System.setProperty("spring.devtools.restart.enabled", "false");System.setProperty("java.awt.headless", "true");}```接下来,我们需要配置 Eclipse 来进行远程 Debug。
首先,打开Eclipse,找到要调试的项目,右键单击,选择 `Debug As -> Debug Configurations`。
在弹出的窗口中,选择 `Remote Java Application`,然后点击`New` 创建一个新的 Debug 配置。
在 `Connection Type` 中选择 `Standard (Socket Attach)`。
在`Connection Properties` 中,设置 `Host` 为 `localhost`,设置`Port` 为 `8000`(默认的远程 Debug 端口)。
然后,点击 `Apply` 保存配置。
现在,我们可以启动 Spring Boot 项目。
在项目启动完成后,点击Eclipse 的 Debug 按钮,选择刚刚创建的 Debug 配置。
然后,点击`Debug` 按钮来启动远程 Debug。
如果一切顺利,Eclipse 将连接到运行中的 Spring Boot 项目,并在远程服务器上进行 Debug。
Spring5核心原理与30个类手写实战pdf下载基于编程开发实践,不仅深度解析Spring 5的原理与新特性,更从环境准备、顶层结构设计、数据访问等方面一步步地推导出Spring的设计原理。
在每个知识点上,均以大量的经典代码案例辅助讲解,使理论紧密联系实际。
最后手写30个类,以体会Spring的创作过程,让每一位读者学以致用。
Spring5核心原理与30个类手写实战资料目录第1篇 Spring内功心法第1章软件架构设计原则 21.1 开闭原则 21.2 依赖倒置原则 41.3 单一职责原则 71.4 接口隔离原则 101.5 迪米特原则 121.6 里氏替换原则 141.7 合成复用原则 191.8 设计原则总结 20第2章 Spring中常用的设计模式 212.1 为什么要从设计模式开始 212.1.1 写出优雅的代码 222.1.2 更好地重构项目 242.1.3 经典框架都在用设计模式解决问题 36 2.2 工厂模式详解 362.2.1 工厂模式的由来 362.2.2 简单工厂模式 372.2.3 工厂方法模式 412.2.4 抽象工厂模式 432.2.5 利用工厂模式重构的实践案例 472.3 单例模式详解 532.3.1 单例模式的应用场景 532.3.2 饿汉式单例模式 532.3.3 懒汉式单例模式 542.3.4 反射破坏单例 602.3.5 序列化破坏单例 612.3.6 注册式单例模式 682.3.7 线程单例实现ThreadLocal 742.3.8 单例模式小结 752.4 原型模式详解 752.4.1 原型模式的应用场景 752.4.2 浅克隆 772.4.3 深克隆 792.4.4 克隆破坏单例模式 812.4.5 clone()方法的源码 822.5 代理模式详解 822.5.1 代理模式的应用场景 822.5.2 静态代理 832.5.3 动态代理 882.5.4 代理模式与Spring 1072.5.5 静态代理和动态代理的本质区别 1082.5.6 代理模式的优缺点 1092.6 委派模式详解 1092.6.1 委派模式的定义及应用场景 1092.6.2 委派模式在源码中的体现 1112.7 策略模式详解 .1142.7.1 策略模式的应用场景 1142.7.2 用策略模式实现选择支付方式的业务场景 .114 2.7.3 策略模式在JDK源码中的体现 1222.7.4 策略模式的优缺点 1252.7.5 委派模式与策略模式综合应用 1252.8 模板模式详解 1292.8.1 模板模式的应用场景 1292.8.2 利用模板模式重构JDBC操作业务场景 132 2.8.3 模板模式在源码中的体现 1362.8.4 模板模式的优缺点 1382.9 适配器模式详解1392.9.1 适配器模式的应用场景 1392.9.2 重构第三方登录自由适配的业务场景141 2.9.3 适配器模式在源码中的体现 1492.9.4 适配器模式的优缺点 1532.10 装饰者模式详解 1532.10.1 装饰者模式的应用场景 1532.10.2 装饰者模式和适配器模式对比 1632.10.3 装饰者模式在源码中的应用 1632.10.4 装饰者模式的优缺点 1652.11 观察者模式详解 1652.11.1 观察者模式的应用场景 1652.11.2 观察者模式在源码中的应用 1752.11.3 基于Guava API轻松落地观察者模式 176 2.11.4 观察者模式的优缺点 1772.12 各设计模式的总结与对比 177 2.12.1 GoF 23种设计模式简介 177 2.12.2 设计模式之间的关联关系 178 2.12.3 Spring中常用的设计模式 182 2.13 Spring中的编程思想总结 183 第2篇 Spring环境预热第3章 Spring的前世今生 1863.1 一切从Bean开始 1873.2 Spring的设计初衷 1883.3 BOP编程伊始 1883.4 理解BeanFactory 1893.5 AOP编程理念 189第4章 Spring 5系统架构 1914.1 核心容器 1924.2 AOP和设备支持1924.3 数据访问与集成1934.4 Web组件 1944.5 通信报文 1944.6 集成测试 1944.7 集成兼容 1944.8 各模块之间的依赖关系 194第5章 Spring版本命名规则 1965.1 常见软件的版本命名 1965.2 语义化版本命名通行规则 1975.3 商业软件中常见的修饰词 1975.4 软件版本号使用限定 1985.5 Spring版本命名规则 199第6章 Spring源码下载及构建技巧 2006.1 Spring 5源码下载 2006.2 基于Gradle的源码构建技巧 2016.3 Gradle构建过程中的坑 207第3篇 Spring核心原理第7章用300行代码手写提炼Spring核心原理 210 7.1 自定义配置 2107.1.1 配置application.properties文件 2107.1.2 配置web.xml文件 2107.1.3 自定义注解 2117.1.4 配置注解 2127.2 容器初始化 2137.2.1 实现1.0版本 2137.2.2 实现2.0版本 2167.2.3 实现3.0版本 2237.3 运行效果演示 227第8章一步一步手绘Spring IoC运行时序图 228 8.1 Spring核心之IoC容器初体验 2288.1.1 再谈IoC与DI 2288.1.2 Spring核心容器类图 2298.1.3 Web IoC容器初体验 2328.2 基于XML的IoC容器的初始化 2378.2.1 寻找入口 2388.2.2 获得配置路径 2388.2.3 开始启动 2408.2.4 创建容器 2428.2.5 载入配置路径 2438.2.6 分配路径处理策略 2448.2.7 解析配置文件路径 2478.2.8 开始读取配置内容 2498.2.9 准备文档对象 2508.2.10 分配解析策略 2518.2.11 将配置载入内存 2528.2.12 载入<bean>元素 2578.2.13 载入<property>元素 2618.2.14 载入<property>子元素 2648.2.15 载入<list>子元素 2668.2.16 分配注册策略 2678.2.17 向容器注册 2678.3 基于注解的IoC初始化 2708.3.1 注解的前世今生 2708.3.2 定位Bean扫描路径 2718.3.3 读取注解的元数据 2738.3.4 扫描指定包并解析为BeanDefinition 277 8.3.5 注册注解BeanDefinition 2838.4 IoC容器初始化小结 285第9章一步一步手绘Spring DI运行时序图 287 9.1 Spring自动装配之依赖注入 2879.1.1 依赖注入发生的时间 2879.1.2 寻找获取Bean的入口 2889.1.3 开始实例化 2939.1.4 选择Bean实例化策略 2979.1.5 执行Bean实例化 2999.1.6 准备依赖注入 3019.1.7 解析属性依赖注入规则 3069.1.8 注入赋值 3109.2 Spring IoC容器中那些鲜为人知的细节 314 9.2.1 关于延时加载 3149.2.2 关于FactoryBean和BeanFactory 3179.2.3 再述autowiring 322第10章一步一步手绘Spring AOP运行时序图 326 10.1 Spring AOP初体验 32610.1.1 再述Spring AOP应用场景 32610.1.2 AOP中必须明白的几个概念 32710.1.3 使用Spring AOP的两种方式 32910.1.4 切入点表达式的配置规则 33310.2 Spring AOP源码分析 33410.2.1 寻找入口 33410.2.2 选择代理策略 33810.2.3 调用代理方法 34110.2.4 触发通知 347第11章一步一步手绘Spring MVC运行时序图 352 11.1 初探Spring MVC请求处理流程 35211.2 Spring MVC九大组件 35311.2.1 HandlerMapping 35311.2.2 HandlerAdapter 35311.2.3 HandlerExceptionResolver 354 11.2.4 ViewResolver 35411.2.5 RequestToViewNameTranslator 354 11.2.6 LocaleResolver 35411.2.7 ThemeResolver 35511.2.8 MultipartResolver 35511.2.9 FlashMapManager 35511.3 Spring MVC源码分析 35511.3.1 初始化阶段 35611.3.2 运行调用阶段 35911.4 Spring MVC优化建议 367第4篇 Spring手写实战第12章环境准备 37012.1 IDEA集成Lombok插件 37012.1.1 安装插件 37012.1.2 配置注解处理器 37312.1.3 使用插件 37412.2 从Servlet到ApplicationContext 375 12.3 准备基础配置37612.3.1 application.properties配置.377 12.3.2 pom.xml配置 37712.3.3 web.xml配置 37812.3.4 GPDispatcherServlet 378第13章 IoC顶层结构设计 38013.1 Annotation(自定义配置)模块 380 13.1.1 @GPService 38013.1.2 @GPAutowired 38113.1.3 @GPController 38113.1.4 @GPRequestMapping 38213.1.5 @GPRequestParam 38213.2 core(顶层接口)模块 38213.2.1 GPFactoryBean 38213.2.2 GPBeanFactory 38313.3 beans(配置封装)模块 38313.3.1 GPBeanDefinition 38313.3.2 GPBeanWrapper 38413.4 context(IoC容器)模块 38513.4.1 GPAbstractApplicationContext 385 13.4.2 GPDefaultListableBeanFactory 385 13.4.3 GPApplicationContext38513.4.4 GPBeanDefinitionReader 38813.4.5 GPApplicationContextAware 391第14章完成DI模块的功能 39214.1 从getBean()方法开始 39314.2 GPBeanPostProcessor 395第15章完成MVC模块的功能 39615.1 MVC顶层设计 39615.1.1 GPDispatcherServlet 39615.1.2 GPHandlerMapping 40215.1.3 GPHandlerAdapter 40315.1.4 GPModelAndView 40615.1.5 GPViewResolver 40615.1.6 GPView 40715.2 业务代码实现40915.2.1 IQueryService 40915.2.2 QueryService 41015.2.3 IModifyService 41015.2.4 ModifyService 41115.2.5 MyAction 41215.2.6 PageAction 41315.3 定制模板页面41415.3.1 first.html 41415.3.2 404.html 41415.3.3 500.html 41515.4 运行效果演示415第16章完成AOP代码织入 417 16.1 基础配置 .41716.2 完成AOP顶层设计 41816.2.1 GPJoinPoint 41816.2.2 GPMethodInterceptor .419 16.2.3 GPAopConfig 41916.2.4 GPAdvisedSupport 420 16.2.5 GPAopProxy 42216.2.6 GPCglibAopProxy 42316.2.7 GPJdkDynamicAopProxy 423 16.2.8 GPMethodInvocation425 16.3 设计AOP基础实现 42716.3.1 GPAdvice 42716.3.2 GPAbstractAspectJAdvice 427 16.3.3 GPMethodBeforeAdvice 428 16.3.4 GPAfterReturningAdvice 429 16.3.5 GPAfterThrowingAdvice 430 16.3.6 接入getBean()方法 43016.4 织入业务代码43216.4.1 LogAspect 43216.4.2 IModifyService 43316.4.3 ModifyService 43416.5 运行效果演示435第5篇 Spring数据访问第17章数据库事务原理详解 438 17.1 从Spring事务配置说起 438 17.2 事务的基本概念 43917.3 事务的基本原理 43917.4 Spring事务的传播属性 440 17.5 数据库事务隔离级别 44117.6 Spring中的事务隔离级别 441 17.7 事务的嵌套 44217.8 Spring事务API架构图 44417.9 浅谈分布式事务 444第18章 Spring JDBC源码初探 44618.1 异常处理 44718.2 config模块 44818.3 core模块45018.4 DataSource 45618.5 object模块 45718.6 JdbcTemplate 45818.7 NamedParameterJdbcTemplate 458第19章基于Spring JDBC手写ORM框架 459 19.1 实现思路概述45919.1.1 从ResultSet说起 45919.1.2 为什么需要ORM框架 46419.2 搭建基础架构46719.2.1 Page 46719.2.2 ResultMsg 47019.2.3 BaseDao 47119.2.4 QueryRule 47319.2.5 Order.47919.3 基于Spring JDBC实现关键功能 480 19.3.1 ClassMappings 48019.3.2 EntityOperation 48319.3.3 QueryRuleSqlBuilder 48819.3.4 BaseDaoSupport 49819.4 动态数据源切换的底层原理 50719.4.1 DynamicDataSource 50819.4.2 DynamicDataSourceEntry 50919.5 运行效果演示51019.5.1 创建Member实体类 51019.5.2 创建Order实体类 51119.5.3 创建MemberDao 51219.5.4 创建OrderDao 51219.5.5 修改db.properties文件 51419.5.6 修改application-db.xml文件 515 19.5.7 编写测试用例 516第6篇 Spring经验分享第20章 Spring 5新特性总结 52020.1 升级到Java SE 8和Java EE 7 520 20.2 反应式编程模型 52120.3 使用注解进行编程 52120.4 函数式编程 52220.5 使用 REST 端点执行反应式编程 52320.6 支持HTTP/2 52320.7 Kotlin和Spring WebFlux 52320.8 使用Lambda表达式注册Bean 52420.9 Spring Web MVC 支持最新的 API 52420.10 使用JUnit 5执行条件和并发测试 52520.11 包清理和弃用 52620.12 Spring核心和容器的一般更新 52620.13 我如何看Spring 5 527第21章关于Spring的经典高频面试题 52821.1 什么是Spring框架,Spring框架有哪些主要模块52821.2 使用Spring框架能带来哪些好处 52821.3 什么是控制反转(IoC),什么是依赖注入 52921.4 在Java中依赖注入有哪些方式 52921.5 BeanFactory和ApplicationContext有什么区别 530 21.6 Spring提供几种配置方式来设置元数据 53021.7 如何使用XML配置方式配置Spring .53121.8 Spring提供哪些配置形式 53221.9 怎样用注解的方式配置Spring 53321.10 请解释Spring Bean的生命周期 53421.11 Spring Bean作用域的区别是什么 53521.12 什么是Spring Inner Bean 53521.13 Spring中的单例Bean是线程安全的吗 53621.14 请举例说明如何在Spring中注入一个Java集合 53621.15 如何向Spring Bean中注入java.util.Properties 53721.16 请解释Spring Bean的自动装配 53821.17 自动装配有哪些局限性 53821.18 请解释各种自动装配模式的区别 53921.19 请举例解释@Required注解 53921.20 请举例说明@Qualifier注解 54021.21 构造方法注入和设值注入有什么区别 54021.22 Spring中有哪些不同类型的事件 54121.23 和ClassPathResource有什么区别 54221.24 Spring中用到了哪些设计模式 54221.25 在Spring中如何更有效地使用JDBC 54321.26 请解释Spring中的IoC容器 54321.27 在Spring中可以注入null或空字符串吗 543Spring5核心原理与30个类手写实战介绍1996年,Java还只是一个新兴的、初出茅庐的编程语言。
SpringBoot整合升级SpringSecurity报错【Therequestwasr。
前⾔最近LZ给项⽬框架升级,从Spring1.x升级到Spring2.x, 在这⾥就不多赘述两个版本之间的区别以及升级的原因。
关于升级过程中踩的坑,在其他博⽂中会做⽐较详细的记录,以便给读者参考,不要掉进同样的坑⾥。
这⾥我们讨论⼀个关于URL中包含双斜杠被拦截的问题。
发现问题升级框架之后,测试⼀个功能时,发现报错Http 500,第⼀时间怀疑是后台功能报错。
打印后台错误⽇志,发现报错信息:The request was rejected because the URL was not normalized。
之后与升级前相同环境对⽐发现,相同的功能,升级之后,URL中包含双斜杠。
分析问题经过对⽐不同和错误信息,初步定位问题出在URL上。
查询资料得知,Spring Security 在⾼版本中增加了StrictHttpFirewall类,对URL校验更加严格。
于是查看源码:private static boolean isNormalized(String path) {if (path == null) {return true;} else if (path.indexOf("//") > -1) {return false;} else {int i;for(int j = path.length(); j > 0; j = i) {i = stIndexOf(47, j - 1);int gap = j - i;if (gap == 2 && path.charAt(i + 1) == '.') {return false;}if (gap == 3 && path.charAt(i + 1) == '.' && path.charAt(i + 2) == '.') {return false;}}return true;}}解决问题⽅法⼀:修改项⽬中出现“//”双斜杠的URL路径,哈哈⽅法⼆:⾃定义FireWall⽅式允许URL出现双斜杠“//”参考:Spring 5.0.3 RequestRejectedException: The request was rejected because the URL was not normalized1. 创建允许在URL中使⽤斜线的⾃定义防⽕墙。
spring5实验报告心得体会
spring5实验完成后我了解到了以下几点:
Spring 能帮我们低侵入/低耦合地根据配置文件创建及组装对象之间的依赖关系。
Spring 能帮助我们无耦合的实现日志记录,性能统计,安全控制等。
Spring 能非常简单的且强大的声明式事务管理(通过配置完成事务,不用修改代码)。
Spring 提供了与第三方数据访问框架(如Hibernate、JPA),且自己也提供了一套来方便数据库访问。
Spring 提供与第三方 Web(如Struts1/2、JSF)框架无缝集成,且自己也提供了一套Spring MVC 框架,来方便Web 层搭建。
Spring 能方便的与如Java Mail、任务调度、缓存框架等技术整合,降低开发难度
Spring是轻量级的开源的JavaEE框架
Spring可以解决企业应用开发的复杂性
Spring的两个核心:IOC和AOP
IOC:控制反转,把创建对象过程交给Spring进行管理AOP:面向切面,不修改源代码进行功能增强
Spring特点:
方便解耦,简化开发
AOP编程支持
方便程序的测试
方便集成各种优秀框架
降低Java EE API使用难度
方便进行事务操作
控制反转,把对象创建和对象之间的调用过程交给Spring进行管理使用IOC目的:降低耦合度。
2008四川农业大学信息与工程技术学院张勇8/2/2008Spring2.5开发简明教程中文版E-mail:zhangyong232@本书所有版权归作者所有,仅供个人学习、研究使用,不得用于商业目的。
在保证免费、且无任何附加条件的情况下,可以在网络自由传播,但必须保证本书的完整性。
未经作者书面许可,不得对本书以任何形式进行出版、修改和编辑。
作者保留所有权利。
任何商业机构都不得使用本书作为培训教材,作者保留诉诸法律的权利。
如果发现有任何错误、疏漏之处或者任何建议,敬请email到zhangyong232@。
前言 (2)版权声明 (3)版本历史 (4)第一章什么是SPRING (7)1.1S PRING简介 (8)1.2S PRING七大模块 (8)1.2.1Spring Core (9)1.2.2Spring AOP (9)1.2.3Spring DAO (9)1.2.4Spring Context (9)1.2.5Spring ORM (9)1.2.6Spring Web (9)1.2.7Spring MVC (9)1.3小结 (10)参考文献: (10)第二章SPRING开发环境搭建 (10)2.1系统需求 (11)2.2JDK/JRE下载与安装(可选) (11)2.2.1下载 (11)2.2.2安装 (12)2.2.3配置环境变量(可选) (12)2.3E CLIPSE下载与安装 (14)2.3.1下载 (14)2.3.2安装 (16)2.3.3运行与配置 (16)2.3.4开发一个HelloWord程序 (19)2.4E CLIPSE插件安装 (21)2.4.1直接复制文件Eclipse安装插件 (21)2.4.2使用Link文件安装Eclipse插件 (21)2.5M Y E CLIPSE下载与安装 (21)2.5.1下载 (22)2.5.2安装 (22)2.6数据库下载与安装 (23)2.6.1安装MySQL (24)2.6.2安装SQL-Server2000 (25)2.7T OMCAT的下载与安装 (29)2.7.1Tomcat下载与安装 (29)2.7.2在MyEclipse中安装Tomcat (31)2.8打造JA V A开发绿色环境 (32)2.9S PRING之H ELLO W ORD (32)小结 (37)第三章IOC IN SPRING (38)3.1什么是I O C (39)3.2如何配置受管B EAN (41)3.2.1使用<bean/>标签 (42)3.2.2为受管Bean注入值 (43)1、设值注入 (43)2、构造子注入 (44)3、Autowire自动装配 (46)3.2.3使用赋值标签 (50)1、<ref/>标签 (50)2、<list/>标签 (50)3、<set/>标签 (50)4、<map/>标签 (50)5、<props/>标签 (51)6、<null/>标签 (51)3.3受管B EAN作用范围 (55)3.4受管B EAN的生命周期 (59)3.4.1受管Bean在容器中的生命周期 (59)3.4.2受管Bean的预处理和后处理 (61)1、使用BeanPostProcessor接口 (61)2、使用初始化回调接口InitializingBean (63)3、使用析构回调接口DisposableBean (64)4、使用<bean>标签的init-method和destroy-method属性 (66)3.5S PRING中的I OC容器 (67)3.5.1BeanFactoy容器 (67)3.5.2ApplicationContext容器 (68)1、ApplicationContext容器的实现类 (68)2、Spring事件 (69)3.5.3使用BeanFactoryPostProcessor工厂后置处理器 (75)3.5.4定义配置元数据 (77)3.6受管B EAN了解自己 (79)3.6.1获取Bean自身在容器中的Id (79)3.6.2获取IoC容器的引用 (80)3.7基于注解(A NNOTATION-BASED)的配置(S PRING2.5新增) (81)3.7.1@Autowired注解 (81)3.7.2@Qualifier注解 (86)3.7.3@Resource注释 (87)3.7.4@PostContsuct和@PreDestory注释 (88)3.7.5@Component注释 (89)3.7.6@scope注释 (91)3.8小结 (91)什么是SpringSpring简介What is Spring?Spring是一个开源框架,2003年由Rod Johnson创建并启动,它最初形成于Rod Johnson在2002年出版的一本很有影响力的书《Expert One-on-One J2EE Design and Development》中的源代码[1]。
传统的java企业级应用开发很复杂,由此带来了开发难度加大、代码维护成本高、代码质量不稳定、开发进度难以控制、测试复杂等一大堆的问题。
Spring正是为了降低这种复杂度而设计。
它使用依赖注入(IoC)和面向切面编程(AOP)这两种先进的技术为基础,大大的降低企业开发的难度,而且工作量也不会因此而变大。
Spring做了很多来降低JEE开发的复杂度,当你使用它的时候却变的十分简单。
它是一个轻量级的非侵入式框架。
轻量级:Spring在体积和开销上都是轻量级的。
首先,Spring的完整发布包最小可以集成在一个2.5MB多一点的jar文件中。
其次,Sprin使用的微内核体系,使它的处理开销也非常的小。
最后,Spring是非侵入式的,典型的,Spring应用中的对象不依赖于Spring特定的类。
1.2Spring七大模块Spring使用了分层架构模式,主要由七大功能模块组成。
在实际应用中,你可以需选择使用它为你提供一个或者多个功能模块,灵活方便的部署到你的应用。
图1.1Spring七大模块示意图[2]1.2.1Spring CoreCore是Spring的核心容器,实现了Spring框架的基本功能IoC(Inversion of Control,控制反转)。
Spring其它所有的功能模块都必须依靠它作为支撑。
正如上所说,IoC 作为Spring框架的基础,应此Spring Core模块是其它所有模块的基石。
1.2.2Spring AOP通过该模块,Spring实现了对AOP的支持。
此模块为Spring实现对应用程序中事务管理的支持提供了一个基础。
有了该模块,即使不使用EJB组件,Spring也可以提供声明式事务管理[2]。
1.2.3Spring DAO提供了JDBC抽象层,使JDBC编程更加简化。
它简化了数据库的异常信息,提供了声明式事务管理和编程式事务管理两种事务管理方式[3]。
1.2.4Spring Context它扩展了BeanFactory的功能,提供了JNDI访问、EJB支持、远程调用(RMI)、java Mail、任务调度等企业级功能的支持。
1.2.5Spring ORM提供了“对象—关系模式映射”(Object-Relation Map)的支持。
因此,它使得常见的工具如Hibernate、iBats、JDO等可以很好的集成到Spring应用中。
1.2.6Spring Web它为Web应用提供了上下文支持。
还简化了Web应用中见参数绑定到对象的操作。
1.2.7Spring MVCSpring提供的MVC框架。
在Spring2.5版本中,它包括Spring Web MVC和Spring Portlet MVC的支持。
此外,它还提供了对集成其他MVC框架(如Struts、JSF等)的支持、提供了对pdf文档的支持等。
1.3小结这一章简单介绍了Spring框架和它的七大功能模块,如果觉得一开始就看到这些生涩难懂的术语,无法理解的话。
可以先跳过此节,直接阅读第二章。
参考文献:[1]靳俊山.Spring的历史和发展趋势.CSDN博客:/junnef[2]Naveen Balani.Spring系列:Spring框架简介.IBM中国[3]明日科技,李钟尉,冯东庆.Spring应用开发完全手册.北京:人民邮电出版社,2007.9Spring开发环境搭建“工欲善其事,必先利其器”。
这一章介绍如何搭配一个java开发环境。
如果你对此不感兴趣,或者已经对此很熟悉,可以直接跳过。
如果你并不想了解太复杂的配置方式,可以跳至“MyEclipse下载与安装”。
2.1系统需求对于JDK来说,256MB的内存就完全足够。
可是现实是,我们要安装的是整个java 开发环境Eclipse和它的插件MyEclipse,所以这点内存是远远不够滴!要知道,在MyEclipse 运行的时候,它会吞噬掉系统230多MB的内存,如果你还安装使用其他的Eclipse插件,那么内存使用还会疯狂的增长。
如果你要做Web开发,还要运行tomcat服务器,这也会吞噬掉系统70-100MB的内存。
所以,要使MyEclipse能够流畅运行,至少要求512MB的物理内存,推荐1G以上。
另外,MyEclipse运行时对CPU的计算能力要求也较高。
我的电脑是赛扬2.0G的CPU,在使用的过程中,电脑跑起来像乌龟一样,特别是在Eclipse中编辑jsp文件、切换工作区、编译、运行工程、启动tomcat的时候更是慢的要让人急出心脏病。
所以,为了你的健康,强烈建议使用速度更快的CPU 。
2.2JDK/JRE下载与安装(可选)2.2.1下载JDK是Java(TM)SE Development Kit的简写,翻译为中文就是“Java标准版开发工具包”。
这是java程序开发和运行的一个基本的平台。
在这个包中也包含了JRE(Java Runtime Environment,Java运行时环境,仅对java程序的运行提供支持,不包含JDK类的源代码和java编译器等其他工具)。
因此,下载了JDK后就不必再安装JRE了。
但是,如果你觉得JDK 安装包太大,也可以只下载JRE,因为我们使用的Eclipse不需要JDK也可以编译java代码。
但是由于它是由java语言开发的,所以要让它运行起来,就必须先在系统中安装JRE。
到sun的官方网站下载页面/javase/downloads/下载最新的JDK稳定版本即可,现在最稳定的版本是JDK6。
下载页面如下:图2.1JDK下载页面注意:在下载时要看清操作系统版本。