您的位置:首页 > 编程语言 > Java开发

spring 学习笔记

2017-07-13 20:43 197 查看
一. 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

<context-param>  

<param-name>contextConfigLocation</param-name>  

<param-value>contextConfigLocationValue></param-value>  

</context-param>  

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

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

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

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

得到这个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.beans
org.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

<servlet>  

<servlet-name>mvc-dispatcher</servlet-name>  

<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  

<load-on-startup>1</load-on-startup>  

</servlet>  

  

<servlet-mapping>  

<servlet-name>mvc-dispatcher</servlet-name>  

<url-pattern>/</url-pattern>  

</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">[/code] 添加上最后两行后,无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-SpringMyBatisSpring
1.0.0 and 1.0.13.0.1 to 3.0.53.0.0 or higher
1.0.23.0.63.0.0 or higher
1.1.0 or higher3.1.0 or higher3.0.0 or higher
1.3.0 or higher3.4.0 or higher3.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>


...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: