`
mx122723
  • 浏览: 10957 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Spring开发指南读书笔记(一)

阅读更多

Spring给程序员提供了一个轻量级的构建技术框架。它主要的特性就是控制反转IOC和面向切面AOP编程。

它的作用是使用基本的Bean来完成EJB可以完成的工作,提高了代码的可重用性,简单、松耦合和可测试性。

一个简单的Spring例子:

public interface Action {

 public String execute(String str);
}

实现类:

public class LowerAction implements Action{

 private String message;

 public String getMessage() {
  return message;
 }

 public void setMessage(String message) {
  this.message = message;
 }

 public String execute(String str) {
  return (getMessage()+str).toLowerCase();
 }
}

spring配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
 <bean id="TheAction" class ="com.spring.LowerAction">
  <property name="message">
   <value>Hello</value>
  </property>
 </bean>
</beans>

测试:

public void testQickStart(){
  ApplicationContext ctx=new FileSystemXmlApplicationContext("bean.xml");
  Action action=(Action)ctx.getBean("TheAction");
  System.out.println(action.execute("Jeff Cheng"));
 }

在spring中的依赖注入有3种实现类型:接口注入、设值注入和构造子注入。所谓依赖注入,就是在运行期由容器将依赖关系注入到组件之中。而程序员只须负责对接口的编程而不必理会接口具体是如何实现的。

一个完整的Bean配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
 <description>Spring Bean Configuration Sample</description>
 <bean id="TheAction"
  class="com.spring.UpperAction"
  singleton="true"                                        //是否采用单例
  init-method="init"
  destroy-method="cleanup"
  depends-on="ActionManager">                //是否依赖其他Bean
  <property name="message">
   <value>HeLLo</value>
  </property>
  <property name="dataSource">
   <ref local="dataSource"/>                       //指定属性对其他Bean的引用关系
  </property>
 </bean>


 <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
  <property name="jndiName">
   <value>java:comp/env/jdbc/sample</value>
  </property>
 </bean>
</beans>

测试代码:

public void testQickStart(){
  ApplicationContext ctx=new FileSystemXmlApplicationContext("bean.xml");
  Action action=(Action)ctx.getBean("TheAction");
  System.out.println(action.execute("Jeff Cheng"));
 }

BeanFactory提供了针对Java Bean的管理功能,而ApplicationContext覆盖了BeanFactory的全部功能并提供了更为框架的实现。

1.国际化支持:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
 <!-- id必须为messageSource -->
 <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
               <!-- 或ReloadableResourceBundleMessageSource 无需重启加载-->
  <property name="basenames">
   <list>
    <value>messages</value>
   </list>
  </property>
 </bean>
</beans>

Spring会自动在classpath路径中搜索配置文件加载:

messages_zh_CN.properties,messages_zh.properties,message.properties

2.资源访问:Application.getResource("...");

3.事件传播:

可以通过设置listener实现

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
 <description>Spring Login Action</description>
 <bean id="loginaction" class ="com.spring.LoginAction"/>
 <bean id="listener" class="com.spring.ActionListener"/>
</beans>

LoginAction.java:

public class LoginAction implements ApplicationContextAware{
  private ApplicationContext applicationContext;

  public void setApplicationContext(ApplicationContext applicationContext)
   throws BeansException {
   this.applicationContext=applicationContext;
 }
  public int login(String username,String password){
  ActionEvent event=new ActionEvent(username);
  this.applicationContext.publishEvent(event);
  System.out.println("finish");
  return 0;
 }
}

ActionListenser.java:

public class ActionListener implements ApplicationListener{

 public void onApplicationEvent(ApplicationEvent event) {
  if(event instanceof ActionEvent){
   System.out.println(event.toString());
  }
 }
}

ActionEvent.java:

public class ActionEvent extends ApplicationEvent{

 public ActionEvent(Object source) {
  super(source);
 }
}

测试类:

public void testLoginAction(){
  ApplicationContext ctx=new FileSystemXmlApplicationContext("loginBean.xml");
  LoginAction action=(LoginAction)ctx.getBean("loginaction");
  action.login("Jeff Cheng", "mypass");
 }

对于web应用,我们可以在web.xml中配置ContextLoaderListener或ContextLoderServlet

<listener>

  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

</listener>

<servlet>   
  <servlet-name>context</servlet-name>   
  <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>   
  <load-on-startup>1</load-on-startup>   
 </servlet> 

Spring高级特性:与MVC框架的整合

MVC框架的运作流程:

1.将Web页面中的输入元素封装成一个请求数据对象。

2.根据请求不同,调度相应的逻辑处理单元,并将请求数据对象作为参数传入。

3.逻辑单元完成运算后,返回一个结果对象。

4.将结果数据对象中的数据与预先设计的表现层相融合并展现给用户。

Struts:成熟的设计,丰富的资源和开发群体
Webwork2:设计理念更加先进,代码与Servlet API分离,单元测试便利,BS与CS转换方便,基于对模板技术(Velocity、FreeMarker和XSLT)的支持。
SpringMVC:在依赖注入和AOP方面更加优秀,但MVC框架与底层框架的分离不如webwork,难以脱离servlet容器独立运行。

首先来看看与SpringMVC的搭配:

 web.xml容器配置文件
<servlet>
 <servlet-name>Dispatcher</servlet-name>
 <servlet-class>

    org.springframework.web.servlet.DispatcherServlet     //负责调度的核心引擎

 </servlet-class>
 <init-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>/WEB-INF/Config.xml</param-value>
 </init-param>
</servlet>
<servlet-mapping>
 <servlet-name>Dispatcher</servlet-name>
 <url-pattern>*.do</url-pattern>
</servlet-mapping>


spring核心配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!-- Definition of View Resolver -->
 <bean id="viewResolver" class ="org.springframework.web.servlet.view.InternalResourceViewResolver">
                       <!-- 可选.servlet.view.freemarker.FreeMarkerViewResolver
                         或servlet.view.velocity.VelocityViewResolver -->
  <property name="viewClass">
   <value>org.springframework.web.servlet.view.JstlView</value>
  </property>
  
  <property name="prefix">                   //设定名称前缀
   <value>WEB-INF/view/</value>
  </property>
  
  <property name="suffix">                   //设定名称后缀
   <value>.jsp</value>
  </property>
 </bean>
 
 <bean id="RegisterValidator" class="com.validator.RegisterValidator"/>
 
 <!-- Request Mapping -->
 <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
  <property name="mappings">
   <props>
    <prop key="/register.do">RegisterAction</prop>
    <prop key="/login.do">LoginAction</prop>
   </props>
  </property>
 </bean>
 
 <!-- Action Definition -->
 <bean id="RegisterAction" class="com.action.RegisterAction">
  <property name="commandClass">
   <value>com.reqbean.RegisterInfo</value>
  </property>
  
  <property name="validator">
   <ref local="RegisterValidator"/>
  </property>
  
  <property name="formView">
   <value>register</value>
  </property>
  
  <property name="successView">
   <value>RegisterSuccess</value>
  </property>
 </bean>
 
 <bean id="LoginAction" class="com.action.LoginAction">
  <property name="commandClass">
   <value>com.action.LoginInfo</value>
  </property>
  
  <property name="fail_view">
   <value>loginfail</value>
  </property>
  
  <property name="success_view">
   <value>main</value>
  </property>
 </bean>
 
 <!-- 对异常进行处理 -->
 <bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
  <property name="defaultErrorView">
   <value>failure</value>
  </property>
  
  <property name="exceptionMappings">
   <props>
    <prop key="java.sql.SQLException">showDBError</prop>
    <prop key="java.lang.RuntimeException">showError</prop>
   </props>
  </property>
 </bean>
 
 <!-- 国际化支持 -->
 <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
  <property name="basename">
   <value>messages</value>
  </property>
 </bean>
 <!-- 根据浏览器设置语言种类 -->
 <bean id="localeResolver" class="org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver">
 </bean>
 <!-- 根据session设置语言种类
 <bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocalResolver.LOCALE">
 </bean>
  -->
  <!-- 根据cookie设置语言种类
  <bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
   <property name="cookieName">
    <value>browerLocale</value>//默认为org.springframework.web.servlet.i18n.CookieLocaleResolver.LOCALE
   </property>
   <property name="cookiePath">
    <value>mypath</value>//默认为 /
   </property>
   <property name="cookieMaxAge">
    <value>999999</value>//默认为[2147483647]
   </property>
   -->
</beans>

LoginAction.java:

public class LoginAction extends SimpleFormController{
 
 private String fail_view;
 private String success_view;

 protected ModelAndView onSubmit(Object cmd,BindException ex)throws Exception{
  LoginInfo loginInfo=(LoginInfo)cmd;
  
  if(login(loginInfo)==0){
   HashMap result_map=new HashMap();
   result_map.put("logininfo", loginInfo);
   List msgList=new LinkedList();
   msgList.add("msg1");
   msgList.add("msg2");
   msgList.add("msg3");
   
   result_map.put("messages", msgList);
   return new ModelAndView(this.getSuccess_view(),result_map);
  }else{
   return new ModelAndView(this.getFail_view());
  }
 }
 
 private int login(LoginInfo loginInfo){
  if("JeffCheng".equalsIgnoreCase(loginInfo.getUsername())
    &&"123".equals(loginInfo.getPassword())){
   return 0;
  }
  return 1;
 }
 
 public String getFail_view(){
  return fail_view;
 }
 
 public String getSuccess_view(){
  return success_view;
 }
 
 public void setFail_view(String fail_view) {
  this.fail_view = fail_view;
 }

 public void setSuccess_view(String success_view) {
  this.success_view = success_view;
 }

}

RegisterAction.java:

public class RegisterAction extends SimpleFormController{

 protected ModelAndView onSubmit(Object cmd, BindException ex)
   throws Exception {
  Map rsMap=new HashMap();
  rsMap.put("logininfo", cmd);
  return new ModelAndView(this.getSuccessView(), rsMap);
 }
}
RegisterValidator.java:

public class RegisterValidator implements Validator{

 public boolean supports(Class clazz) {
  return RegisterInfo.class.isAssignableFrom(clazz);
 }

 public void validate(Object obj, Errors errors) {
  RegisterInfo regInfo=(RegisterInfo)obj;
  if(regInfo.getUsername().length()<4){
   errors.rejectValue("username","less4chars",null,"用户名长度必须大于4个字母!");
  }
  /*检查用户名是否已经存在
  if(UserDao.getUser(regInfo.getUsername())!=null){
   errors.rejectValue("username","existed",null,"用户已存在");
  }
  */ 
  if(regInfo.getPassword1().length()<6){
   errors.rejectValue("password1","less6chars",null,"密码长度必须大于6个字母!");
  }
  if(!regInfo.getPassword2().equals(regInfo.getPassword1())){
   errors.rejectValue("password2","notsame",null,"两次输入密码不一致!");
  }
 }
}

RegisterInfo.java:

public class RegisterInfo {
 private String username;
 private String password1;
 private String password2;
 
 public String getUsername() {
  return username;
 }
 public void setUsername(String username) {
  this.username = username;
 }
 public String getPassword1() {
  return password1;
 }
 public void setPassword1(String password) {
  this.password1 = password;
 }
 
 public String getPassword2() {
  return password2;
 }
 public void setPassword2(String password) {
  this.password2 = password;
 }
}

LoginInfo.java:

public class LoginInfo {
 private String username;
 private String password;
 
 public String getUsername() {
  return username;
 }
 public void setUsername(String username) {
  this.username = username;
 }
 public String getPassword() {
  return password;
 }
 public void setPassword(String password) {
  this.password = password;
 }
}

main.jsp:

<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c"%>

  <body>
    <p>Login Success!</p>
 <p>Current User:
  <c:out value="${logininfo.username}" /><br>
 </p>

 <p>Your current messages:</p>
 <c:forEach items="${messages}" var="item" begin="0" end="9" step="1" varStatus="var">
  <c:choose>
   <c:when test="${var.index%2==0}">
   *
   </c:when>
   <c:otherwise>
   !
   </c:otherwise>
  </c:choose>
  <c:out value="${item}" /><br>
 </c:forEach>
  </body>

register.jsp:

<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c"%>
<%@ taglib uri="http://www.springframework.org/tags" prefix="spring"%>

  <body style="text-align:center">
 <form action="/SpringMVC/register.do" method="post">
  <spring:bind path="command.*">
   <font color="#FF0000">
    <c:forEach items="${status.errorMessages}" var="error">
     <spring:message code="error_msg" /><c:out value="${error}" /><br>
    </c:forEach>
   </font>
  </spring:bind>
  <table border="0" width="450" height="101" cellspacing="0" cellpadding="0">
   <tr>
    <td height="27" width="408" colspan="2">
     <p align="center"><b><spring:message code="register_title" /></b></td>
   </tr>

   <tr>
    <td height="23" width="104"><spring:message code="username_label" />:</td>
    <td height="23" width="450">
     <spring:bind path="command.username">
      <input type="text"
       value="<c:out value='${status.value}'/>" 
       name="<c:out value='${status.expression}'/>">
      (<spring:message code="less4chars" />)
      <br>
      <c:if test="${status.error}">
       <font color="#FF0000">
        <spring:message code="error_msg" />
        <c:forEach items="${status.errorMessages}" var="error">
         <c:out value="${error}"/>
        </c:forEach>
       </font>
      </c:if>
     </spring:bind>
    </td>
    
   </tr>

   <tr>
    <td height="23" width="104"><spring:message code="password_label" />:</td>
    <td height="23" width="450">
    <spring:bind path="command.password1">
      <input type="password"
       value="<c:out value='${status.value}'/>" 
       name="<c:out value='${status.expression}'/>">
      (<spring:message code="less6chars" />)
      <br>
      <c:if test="${status.error}">
       <font color="#FF0000">
        <spring:message code="error_msg" />
        <c:forEach items="${status.errorMessages}" var="error">
         <c:out value="${error}"/>
        </c:forEach>
       </font>
      </c:if>
     </spring:bind>
    </td>
   </tr>

   <tr>
    <td height="23" width="104"><spring:message code="rep_pass_label" />:</td>
    <td height="23" width="450">
    <spring:bind path="command.password2">
      <input type="password"
       value="<c:out value='${status.value}'/>" 
       name="<c:out value='${status.expression}'/>">
      <br>
      <c:if test="${status.error}">
       <font color="#FF0000">
        <spring:message code="error_msg" />
        <c:forEach items="${status.errorMessages}" var="error">
         <c:out value="${error}"/>
        </c:forEach>
       </font>
      </c:if>
     </spring:bind>
    </td>
   </tr>

  </table>
 <p>
  <input type="submit" value="提交" name="B1">
  <input type="reset" value="重置" name="B2">
 </p>
 </form>   
  </body>

RegisterSuccess.jsp:

<body>
 <p align="center">
  <c:out value="${logininfo.username}"/>注册成功!
 </p>
  </body>

showError.jsp:

<body>
 <%Exception ex=(Exception)request.getAttribute("Exception"); %>
 <h2>Exception:<%ex.getMessage(); %></h2>
 <p/>
 <%ex.printStackTrace(new java.io.PrintWriter(out)); %>
  </body>

模版技术:

XSLT:基于XML的表现层模版技术,移植性强,界面开发难度大,语法复杂,调试难度大,性能比较低下,内存占用较大
Velocity:最为成熟的模版技术,得到广泛的应用。
FreeMarker:表现逻辑和业务逻辑划分严格,模板不允许对Servlet API直接操作,禁止对HttpServletRequest对象直接访问,保证了层次间的清晰。提供了对JSP Tag的良好的支持,在生产效率和学习成本上具有优势。

下面用FreeMarker来改造上面的例子:

Config.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
 <!-- Definition of View Resolver -->
 <bean id="viewResolver" class ="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
  <property name="viewClass">
   <value>org.springframework.web.servlet.view.freemarker.FreeMarkerView</value>
  </property>
  
  <property name="cache">
   <value>false</value>
  </property>
  
  <property name="suffix">
   <value>.ftl</value>
  </property>
 </bean>
 
 <bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
  <property name="templateLoaderPath">
   <value>WEB-INF/view/</value>
  </property>
 </bean>
 
 <!-- Request Mapping -->
 <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
  <property name="mappings">
   <props>
    <prop key="/login.do">LoginAction</prop>
   </props>
  </property>
 </bean>
 
 <!-- Action Definition -->
 <bean id="LoginAction" class="com.action.LoginAction">
  <property name="commandClass">
   <value>com.action.LoginInfo</value>
  </property>
  
  <property name="fail_view">
   <value>loginfail</value>
  </property>
  
  <property name="success_view">
   <value>main</value>
  </property>
 </bean>
</beans>

main.ftl:

<html>
<head>
 <title>Welcome!</title>
</head>
<body>
 <h1>Current User:${logininfo.username}</h1>
 <#list messages as msg>
  <#if msg_index%2=0>
   *
  <#else>
   !
  </#if>
  ${msg}<br>
 </#list>
</body>
</html>


分享到:
评论

相关推荐

    SpringBoot3 全栈指南教程-尚硅谷学习笔记 2023年

    SpringBoot3全栈指南教程是针对开发者们深入理解并熟练运用Spring Boot 3框架的一份综合教程,由知名教育机构尚硅谷在2023年发布。这份教程旨在帮助学习者掌握Spring Boot 3的核心概念、特性以及如何将其应用于实际...

    Spring 揭秘 全面 深入了解Spring

    总而言之,《Spring 揭秘:全面深入了解Spring》是一本全面覆盖Spring框架各个方面的教程,无论你是初学者还是经验丰富的开发者,都能从中受益匪浅,提升自己的Spring开发技能。通过阅读这本书,你将能够深入理解...

    Spring学习笔记之一“why spring”

    标题中的"Spring学习笔记之一“why spring”"表明了这篇笔记主要探讨的是Spring框架的核心价值和使用背景。在IT行业中,Spring是一个广泛使用的Java企业级应用开发框架,它以其依赖注入(Dependency Injection,DI)...

    Spring 学习笔记《Spring Boot》源码

    Spring Boot 是一个基于 Spring 框架的快速开发工具,旨在简化新 Spring 应用的初始搭建以及开发过程。它预设了许多默认配置,使得开发者能够快速构建功能丰富的应用程序,而无需进行大量的手动配置。 在《Spring ...

    Spring2开发手册

    《Spring2开发手册》是一本全面介绍Spring框架第二代版本的指南,旨在帮助开发者深入理解和高效运用这个强大的Java企业级应用开发框架。Spring框架以其模块化、轻量级和依赖注入等特点,已经成为Java世界中的核心...

    Spring.NET学习笔记 - 刘冬.NET - 博客园

    Spring.NET是中国.NET开发者社区中广泛讨论的一个开源框架,它为.NET平台带来了与Java Spring相似的...通过阅读和实践,开发者可以深入理解Spring.NET的强大功能,并将其应用于实际项目中,提升软件开发的效率和质量。

    SSM 框架整合教程:二、Spring-尚硅谷学习笔记 2022 年

    本教程将深入探讨Spring框架的核心概念及其在SSM整合中的作用,结合尚硅谷2022年的学习笔记,为开发者提供一份详尽的指南。 **一、Spring框架简介** Spring是一款开源的Java平台,它提供了全面的企业级应用开发解决...

    Spring3学习笔记题记

    《Spring3学习笔记题记》 在IT领域,Spring框架是Java开发中不可或缺的一部分,尤其在企业级应用中,Spring以其强大的功能和灵活性备受青睐。本文将深入探讨Spring3版本的相关知识点,帮助开发者更好地理解和使用这...

    jbpm中文开发指南+用户手册+demo源码+学习笔记等

    jbpm中文开发指南是针对中国开发者编写的,旨在帮助他们更好地理解和使用jbpm进行业务流程开发。这份指南可能涵盖了jbpm的基础概念,如工作流引擎、任务服务、流程定义模型(BPMN 2.0)、事件处理以及如何通过jbpm...

    [springBoot]看《Spring Boot》时的同步笔记与实例代码

    描述中的信息虽然简洁,但同样强调了这是一份与阅读Spring Boot相关书籍或教程同步产生的笔记。这意味着这份资料可能涵盖了Spring Boot的基本概念、关键特性、配置方法、以及实际开发中遇到的问题和解决方案。 接...

    spring-framework-2.5-rc2-with-dependencies\spring-framework-2.5-rc2\spring-framework-2.5-rc2docs

    这个文档集合包括了Spring的API参考、用户指南、开发者笔记等,是学习和使用Spring 2.5 RC2的宝贵资源。 首先,让我们了解一下Spring的核心特性。2.5版本引入了一些重要的增强,如依赖注入(Dependency Injection,...

    我的java开发笔记(技术,经验)

    【正文】 《我的Java开发笔记:技术与经验分享》 这份珍贵的压缩包文件,名为“我的java开发笔记(技术,经验)”,...投入时间去学习和研究,相信它会成为你Java开发旅程中的重要指南,助力你的职业生涯更上一层楼。

    spring in action

    Spring Tool Suite (STS) 是一款强大的集成开发环境,专门为Spring开发量身定制。它集成了Spring Boot启动器、Spring Roo自动化工具、以及对Spring框架的强大支持。使用STS,你可以轻松创建、配置和测试Spring项目,...

    spring-boot学习代码

    Spring Boot 是一个由 Pivotal 团队开发的框架,旨在简化 Spring 应用程序的初始搭建以及开发过程。它提供了预配置的依赖项和自动配置功能,使得开发者可以快速地启动并运行一个基于 Spring 的应用程序。这个压缩包...

    JSF+Spring+Hibernate相关技术文档

    快速建立一个基于_jsf+spring+hibernate工程.doc和jsf+spring+hibernate整合笔记.docx可能详细讲述了如何从零开始构建这样的工程,包括环境配置、依赖注入、实体定义、数据访问对象(DAO)的创建以及控制器的设置等...

    iBATIS入门讲解和程序源码+iBATIS开发指南电子书

    在"iBATIS开发指南电子书"中,会提供更详细的指导,包括事务管理、缓存机制、动态SQL以及与Spring框架的整合。iBATIS的事务管理允许你在应用程序级别控制事务的提交和回滚。缓存机制则可以提高数据访问效率,减少对...

    spring源码学习

    .doc文件可能是Word文档形式的笔记或教程,.pdf文件则可能是经过排版整理后的完整指南,适合离线阅读。 Spring框架的核心组件包括IoC容器、AOP、数据访问/集成、MVC、Web服务等。源码学习者通常会从以下几个方面...

    一个后端技术栈分享平台,主要收集后端相关的技术文档、读书笔记、专题学习等。.zip

    标题中的“一个后端技术栈分享平台”表明这是一个专注于后端开发的学习资源集合,而“主要收集后端相关的技术文档、读书笔记、专题学习等”则揭示了这个平台包含的内容类型,涵盖了技术文档、个人阅读心得以及系统化...

    javaEE-Spring-sturst2-MySql基于java新闻发布及管理系统(源码+数据库sql+lun文).rar

    5. **文档(lun文)**:文档可能包含了系统的安装指南、使用手册,或者是开发过程中的笔记。这对于理解系统的工作原理、设置环境以及解决可能出现的问题非常有帮助。 6. **视频教程**:如果包含视频教程,这将提供...

    课设毕设Springboot学生读书笔记共享-LW+源码可运行.zip

    标题中的“课设毕设Springboot学生读书笔记共享-LW+源码可运行.zip”表明这是一个针对学生课程设计或毕业设计的项目,它基于SpringBoot框架,并且包含了读书笔记共享的功能。源码是可运行的,这意味着学生们可以下载...

Global site tag (gtag.js) - Google Analytics