spring 学习笔记

一. AOP

      OOP引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力。也就是说,OOP允许你定义从上到下的关系,但并不适合定义从左到右的关系。例如日志功能。日志代码往往水平地散布在所有对象层次中,而与它所散布到的对象的核心功能毫无关系。对于其他类型的代码,如安全性、异常处理和透明的持续性也是如此。这种散布在各处的无关的代码被称为横切(cross-cutting)代码,在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。AOP技术则恰恰相反,它利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块。

      使用“横切”技术,AOP把软件系统分为两个部分:核心关注点和横切关注点。业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处都基本相似。比如权限认证、日志、事务处理。Aop 的作用在于将核心关注点和横切关注点分离开来。


二。IOC/DI

DI(依赖注入)是IOC(控制反转)的另一种说法。所谓IOC,就是当A对象需要使用B对象时,不是自己创建,而是由spring容器提供。这个过程就相当于spring容器创建了B对象,将其注入到A对象中,供A对象使用。

    所以控制反转IoC(Inversion of Control)是说创建对象的控制权进行转移,以前创建对象的主动权和创建时机是由自己把控的,而现在这种权力转移到第三方,比如转移交给了IoC容器,它就是一个专门用来创建对象的工厂,你要什么对象,它就给你什么对象,有了 IoC容器,依赖关系就变了,原先的依赖关系就没了,它们都依赖IoC容器了,通过IoC容器来建立它们之间的关系。

    IoC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DI(Dependency Injection,依赖注入)来实现的

意义:实现两者的解耦。

  

3.springmvc

 


4.配置文件

web.xml

<servlet>  
    <servlet-name>chapter2</servlet-name>  
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
    <load-on-startup>1</load-on-startup>  
</servlet>  
<servlet-mapping>  
    <servlet-name>chapter2</servlet-name>  
    <url-pattern>/</url-pattern>  
</servlet-mapping>  

load-on-startup: 表示启动容器时初始化该Servlet;

url-pattern:表示哪些请求交给Spring Web MVC处理, “/” 是用来定义默认servlet映射的。也可以如“*.html”表示拦截所有以html为扩展名的请求。


  •  格式定义:
[html]  view plain  copy
  1. <context-param>  
  2. <param-name>contextConfigLocation</param-name>  
  3. <param-value>contextConfigLocationValue></param-value>  
  4. </context-param>  

作用:该元素用来声明应用范围(整个WEB项目)内的上下文初始化参数。

param-name 设定上下文的参数名称。必须是唯一名称

param-value 设定的参数名称的值

  • 初始化过程:
    1. 在启动Web项目时,容器(比如Tomcat)会读web.xml配置文件中的两个节点<listener>和<contex-param>。
    2. 接着容器会创建一个ServletContext(上下文),应用范围内即整个WEB项目都能使用这个上下文。
    3. 接着容器会将读取到<context-param>转化为键值对,并交给ServletContext。
    4. 容器创建<listener></listener>中的类实例,即创建监听(备注:listener定义的类可以是自定义的类但必须需要继承ServletContextListener)。
    5. 在监听的类中会有一个contextInitialized(ServletContextEvent event)初始化方法,在这个方法中可以通过event.getServletContext().getInitParameter("contextConfigLocation") 来得到context-param 设定的值。在这个类中还必须有一个contextDestroyed(ServletContextEvent event) 销毁方法.用于关闭应用前释放资源,比如说数据库连接的关闭。
    6. 得到这个context-param的值之后,你就可以做一些操作了.注意,这个时候你的WEB项目还没有完全启动完成.这个动作会比所有的Servlet都要早。

由上面的初始化过程可知容器对于web.xml的加载过程是context-param >> listener  >> fileter  >> servlet


5.注解

 @Autowired 注释
      它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。 通过 @Autowired的使用来消除 set ,get方法。

http://blog.csdn.net/heyutao007/article/details/5981555


6.spring IOC容器

org.springframework.beansorg.springframework.context包是Spring框架IoC容器的基础。 BeanFactory接口提供了一个先进的配置机制能够管理任何类型的对象。 ApplicationContext(应用上下文) 是BeanFactory的一个子接口。它增加了更方便的集成Spring的AOP功能、消息资源处理(使用国际化)、事件发布和特定的应用层,如在web应用层中使用的WebApplicationContext

    在Spring中,bean是一个由Spring IoC容器进行实例化、装配和管理的对象。此外,bean只是你应用中许多对象中的一个。Beans以及他们之间的 依赖关系 是通过容器使用 配置元数据 反应出来。

org.springframework.context.ApplicationContext接口代表了Spring IoC容器,并且负责上面提到的Beans的实例化、配置和装配。容器通过读取配置元数据获取对象如何实例化、配置和装配的指示。配置元数据可以用XML、Java注解或Java代码来描述。它允许你表示组成你应用的对象,以及对象间丰富的依赖关系。

使用容器:

ApplicationContext是智能的工厂接口,它能够维护注册不同beans和它们的依赖。通过使用 T getBean(String name, Class<T> requiredType) 方法,你可以取得这些beans的实例。

// 创建并配置beans
ApplicationContext context =
    new ClassPathXmlApplicationContext(new String[] {"services.xml", "daos.xml"});
// 取得配置的实例
PetStoreService service = context.getBean("petStore", PetStoreService.class);
// 使用实例
List<String> userList = service.getUsernameList();

     结合4和6,web应用启动时,容器会首先去读取<listener>和<contex-param>这两个节点。其中ContextLoaderListener监听器会读取<context-param>标签下的配置文件,完成spring IOC容器(webApplicationContext)的实例化和初始化。接着去读<fileter>和<servlet>,servlet也会有自己的webApplicationContext,并以先前的为父容器。

     DispatcherServlet初始化的过程中会默认使用这些特殊bean进行配置。如果你想指定使用哪个特定的bean,你可以在web应用上下文WebApplicationContext中简单地配置它们。

http://www.techweb.com.cn/network/system/2017-07-19/2559714.shtml

http://www.cnblogs.com/brolanda/p/4265597.html


7. 事务

(1.用事务去控制的service,不能加try catch去捕获异常,否则不能被spring拦截到,事务就失效了。

(2.在Service实现类中增加@Transactional注解即可控制事务。

(3 .事务的配置只有在 applicationContext.xml中才会起作用,即
  <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
       <property name="dataSource" ref="dataSource" />
     </bean>
     必须配置在 applicationContext.xml 中

(4. 在Spring的服务的Bean中注解@ Transactional。这个注解表明每个方法都是Spring来管理的。如果方法成功处理,那么Spring就会提交事务;如果就去处理过程出现了错误,那么事务就会被回滚。这样,在数据库操作时,就不需要自己commit和roolback了。



8. <mvc:annotation-driven>

    <mvc:annotation-driven/>相当于注册了DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter两个bean,配置一些messageconverter。即解决了@Controller注解的使用前提配置。

我们今天研究的是<mvc:annotation-driven/>标签,所以我们找到对应的实现类是org.springframework.web.servlet.config.AnnotationDrivenBeanDefinitionParser

这个类主要是想容器注册若干bean实例,包括处理请求映射的,如处理@RequestMapping注解。将controller类的名字映射为请求URL。还有用来处理请求的。具体点说就是确定调用哪个Controller的哪个方法来处理当前请求。

我们主要说明里面的两个,RequestMappingHandlerMappingRequestMappingHandlerAdapter

    第一个是HandlerMapping的实现类,它会处理@RequestMapping 注解,并将其注册到请求映射表中。

    第二个是HandlerAdapter的实现类,它是处理请求的适配器,说白了,就是确定调用哪个类的哪个方法,并且构造方法参数,返回值。



9. springMvc里的mvc:resources与静态资源的访问

在进行spring MVC的配置时,通常我们会配置一个dispatcher servlet用于处理对应的URL。配置如下:

[html]  view plain  copy
  1. <servlet>  
  2. <servlet-name>mvc-dispatcher</servlet-name>  
  3. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
  4. <load-on-startup>1</load-on-startup>  
  5. </servlet>  
  6.   
  7. <servlet-mapping>  
  8. <servlet-name>mvc-dispatcher</servlet-name>  
  9. <url-pattern>/</url-pattern>  
  10. </servlet-mapping>  

这表示名字为mvc-dispatcher的servlet会处理一切的url对应的请求,那么我们怎么让servlet来处理项目中的静态资源呢?这里有两种方法。

1. 在dispatcher-servlet.xml中加入:

<!-- 静态资源访问 -->  
<mvc:default-servlet-handler/>
2.  资源映射

  <!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
    <resources mapping="/resources/**" location="/resources/" />
    <resources mapping="/images/**" location="/images/" />
    <resources mapping="/js/**" location="/js/" />

mapping:映射,通常是页面中写的src的url值

location:本地资源路径,注意必须是webapp根目录下的路径。

两个*,它表示映射resources/下所有的URL,包括子路径(即接多个/)

这样我们就可以直接访问该文件夹下的静态内容了。

相关: http://www.cnblogs.com/yank/p/4477204.html


10.springmvc 数据类型转换器

springmvc 通过反射机制对目标方法进行签名,并请求消息绑定到处理方法入参中。

springmvc将servletrequest对象和处理方法入参实例传给databinder, databinder调用装配在springmvc上下文的conversionService进行数据类型转换、数据格式化工作,将servletrequest对象中的消息填充到处理方法入参中。

数据类型转换:

  conversionService是springmvc类型转换的核心接口,位于org.springframework.core.convert包中,可以利用org.springframework.context.support.ConversionServiceFactoryBean在spring上下文中定义一个ConversionSerivce。spring 自动识别出上下文中的ConversionService,并在Bean属性配置及springmvc处理方法入参绑定等场合使用它进行数据的转换。

http://blog.csdn.net/ljhabc1982/article/details/18703459

http://jinnianshilongnian.iteye.com/blog/1723270


11. spirng中@value的使用

在contextApplication.xml中加入以下配置:

<context:component-scan base-package=" com.spring.common"/>
<bean id="propertyPlaceholderConfigurer"
          class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>classpath:properties/jdbc.properties</value>
            </list>
        </property>
</bean>

在com.spring.common包下建立类:

@Component
public class test {

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    @Value("${jdbc.url}")
    private   String url;
}

相关: http://bbs.csdn.net/topics/390936459


12. StringHttpMessageConverter 

当使用@ResponseBody返回的字符串带有中文时,返回类型为String会被StringHttpMessageConverter处理,当时查看源码发现默认的Charset DEFAULT_CHARSET使用的是ISO-8859-1

<bean id="objectToStringHttpMessageConverter"
          class="org.springframework.http.converter.ObjectToStringHttpMessageConverter">
   
        <constructor-arg index="0">
            <value>UTF-8</value>
        </constructor-arg>
        <property name="supportedMediaTypes">
            <list>
                <value>text/plain;charset=UTF-8</value>
                <value>text/xml;charset=UTF-8</value>
            </list>
        </property>
        <property name="writeAcceptCharset" value="false"/>
    </bean>

配置 起效

方式一:

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
    <property name="messageConverters">
        <list>
            <ref bean="objectToStringHttpMessageConverter"/>
            <ref bean="jackson2HttpMessageConverter"/>
        </list>
    </property>
</bean>

<mvc:annotation-driven />
注:配置必须在 <mvc:annotation-driven /> 之前,否则将不会启效; <mvc:annotation-driven />  会自动注册DefaultAnnotationHandlerMapping 与AnnotationMethodHandlerAdapter。

方式二:

<mvc:annotation-driven>
    <mvc:message-converters>
        <ref bean="objectToStringHttpMessageConverter"/>
        <ref bean="jackson2HttpMessageConverter"/>
    </mvc:message-converters>
</mvc:annotation-driven>

13. intellij 出现“Usage of API documented as @since 1.6+”的解决办法

File ->Project Structure->Project Settings -> Modules -> 你的Module名字 -> Sources -> Language Level->选个默认的就行。 


14.message-converter

(1.如果<mvc:annotation-driven>节点有子节点message-converters,那么它的转换器属性messageConverters也由这些子节点组成。

message-converters的子节点配置如下:

(2.message-converters子节点不存在或它的属性register-defaults为true的话,加入其他的转换器:ByteArrayHttpMessageConverter、StringHttpMessageConverter、ResourceHttpMessageConverter等。

request对象和处理方法参数实例 ->DataBinder, DataBinder调用ConversionService组件进行数据类型转换,数据格式化的工作,将request对象中的信息填充到入参对象中,并调用Validator组件对已绑定了请求消息数据的入参对象进行数据合法性检验,并最终生成数据绑定结果BindingResult对象,BindingResult包含了已完成数据绑定的入参对象,还包含相应的校验错误对象。

15: repositories

Maven 仓库的两个概念:本地仓库和远程仓库
      本地仓库是远程仓库的一个缓冲和子集,当你构建Maven项目的时候,首先会从本地仓库查找资源,如果没有,那么Maven会从远程仓库下载到你本地仓库。这样在你下次使用的时候就不需要从远程下载了。如果你所需要的jar包版本在本地仓库没有,而且也不存在于远程仓库,Maven在构建的时候会报错,这种情况可能发生在有些jar包的新版本没有在Maven仓库中及时更新。

配置远程仓库:

   可以在项目中的pom.xml中配置,也可以在~/.m2/setting.xml中配置。

参考:http://www.blogjava.net/baoyaer/articles/355040.html


错误记录:

1:spring中,关于“通配符的匹配很全面, 但无法找到元素 'context:component-scan' 的声明”的错误

解决:

在dispatcher-servlet.xml中的reference里添加上完整声明:

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd">

添加上最后两行后,无bug。


2. 在spring MVC开发中, 开发人员可能会设置某个值到 model 中, 并通过EL表达式在JSP显示, 例如: ${msg}, 但并没有解析为对应的 “value”, 输出结果还是老样子: ${msg}。

解决:

在 Spring MVC 的入门项目中, 这是最常见的问题。实际上这是因为使用了 JSP 1.2 规范引起的。

1. 使用JSP 1.2 定义格式

如果您使用了 老旧的JSP 1.2描述方式, 即使用了 DTD 定义:

web.xml

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
//...
</web-app>

这种情况下, EL表达式默认是禁用或者忽略的, 必须手动启用,才会输出 model 中的值。示例如下:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<%@ page isELIgnored="false" %>
</head>
<body>
       ${msg}
</body>
</html>

可以看到,其中使用了 <%@ page isELIgnored="false" %> 来开启 EL 表达式;

3. java.lang.AbstractMethodError: org.mybatis.spring.transaction.SpringManagedTransaction.getTimeout()Ljava/lang/Integer; 报错解决

在mybatis+spring整合中,由于版本的问题会报错:

 关于这种问题的根源可以查看mybatis的官网对于mybatis—spring jar包版本的应用

MyBatis-Spring MyBatis Spring
1.0.0 and 1.0.1 3.0.1 to 3.0.5 3.0.0 or higher
1.0.2 3.0.6 3.0.0 or higher
1.1.0 or higher 3.1.0 or higher 3.0.0 or higher
1.3.0 or higher 3.4.0 or higher 3.0.0 or higher

通过这个对应关系来选择你需要的mybatis-spring jar 包的版本

我之前使用的是spring 4.1+mybatis 3.4 + mybatis-spring 1.2.3,导致项目报错,mybatis 3.4改成3.3 版本后一切正常!!

4. could not autowire field

添加 监听器: 

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


...


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值