【spring】杂记

来源:互联网 发布:python 生成器 迭代器 编辑:程序博客网 时间:2024/06/14 03:39

1.[spring aop]AOP核心概念

1、横切关注点对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点2、切面(aspect)类是对物体特征的抽象,切面就是对横切关注点的抽象3、连接点(joinpoint)被拦截到的点,因为Spring只支持方法类型的连接点,所以在Spring中连接点指的就是被拦截到的方法,实际上连接点还可以是字段或者构造器4、切入点(pointcut)对连接点进行拦截的定义5、通知(advice)所谓通知指的就是指拦截到连接点之后要执行的代码,通知分为前置、后置、异常、最终、环绕通知五类6、目标对象代理的目标对象7、织入(weave)将切面应用到目标对象并导致代理对象创建的过程8、引入(introduction)在不修改代码的前提下,引入可以在运行期为类动态地添加一些方法或字段

2.[spring mvc]Spring AOP 支持编译期织入、装载期织入、运行时织入

AOP 实现的关键就在于 AOP 框架自动创建的 AOP 代理,AOP 代理则可分为静态代理和动态代理两大类
静态代理是指使用 AOP 框架提供的命令进行编译,从而在编译阶段就可生成 AOP 代理类,因此也称为编译时增强;
动态代理则运行时借助于 JDK 动态代理、CGLIB 等在内存中“临时”生成 AOP 动态代理类,因此也被称为运行时增强。

Spring对AOP的支持
1、如果目标对象实现了接口,默认会采用JDK的动态代理机制实现AOP
2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP
3、如果目标对象没有实现接口,必须使用CGLIB生成代理,spring会自动在CGLIB和JDK动态代理之间切换


3.spring的DispatcherServlet配置能有多个

<load-on-startup>1</load-on-startup> 要设置成不同的优先级。以及    <servlet-mapping>        <servlet-name>weixin</servlet-name>        <url-pattern>/</url-pattern>    </servlet-mapping>应该不同。

4.自动装配提供五种不同的模式供Spring容器用来自动装配beans之间的依赖注入:
no:默认的方式是不进行自动装配,通过手工设置ref 属性来进行装配bean。
byName:通过参数名自动装配,Spring容器查找beans的属性,这些beans在XML配置文件中被设置为byName。之后容器试图匹配、装配和该bean的属性具有相同名字的bean。
byType:通过参数的数据类型自动自动装配,Spring容器查找beans的属性,这些beans在XML配置文件中被设置为byType。之后容器试图匹配和装配和该bean的属性类型一样的bean。如果有多个bean符合条件,则抛出错误。
constructor:这个同byType类似,不过是应用于构造函数的参数。如果在BeanFactory中不是恰好有一个bean与构造函数参数相同类型,则抛出一个严重的错误。
autodetect:如果有默认的构造方法,通过 construct的方式自动装配,否则使用 byType的方式自动装配。


5.【事务】Spring事务管理核心接口
这里写图片描述


6.Spring bean 的默认作用范围singleton


7.集合注入

<bean id="collectionBean" class="com.tarena.entity.CollectionBean">    <!-- list 注入 -->    <property name="cityList">      <list>          <value>北京</value>          <value>上海</value>          <value>北京</value>          <value>广州</value>      </list>    </property>    <!-- set注入 -->    <property name="citySet">      <set>          <value>北京</value>          <value>上海</value>          <value>北京</value>          <value>广州</value>      </set>    </property>    <!-- 数组 注入 -->    <property name="cityArray">      <list>          <value>北京</value>          <value>上海</value>          <value>广州</value>          <value>北京</value>      </list>    </property>    <!-- Map注入 -->    <property name="mms">      <map>          <entry key="1" value="如花"/>          <entry key="2" value="如来"/>          <entry key="3" value="如草"/>      </map>    </property>    <!-- Properties key=value -->    <property name="props">      <props>          <prop key="driverClassName">             com.mysql.jdbc.Driver          </prop>          <prop key="url">              jdbc:mysql://127.0.0.1:3306/mydb          </prop>          <prop key="username">root</prop>          <prop key="password">1234</prop>      </props>    </property>  </bean>

8.Spring 处理 XML 的编入编出(marshal/unmarshal)
Spring包装了很多库,包括 Jackson 和 JAXB


9.spring 缓存 @CachePut 和 @Cacheable
@CachePut:这个注释可以确保方法被执行,同时方法的返回值也被记录到缓存中。
@Cacheable:当重复使用相同参数调用方法的时候,方法本身不会被调用执行,即方法本身被略过了,取而代之的是方法的结果直接从缓存中找到并返回了。

@Cacheable的key生成方式 可以是方法参数及其成员变量的任意表达式


10.Spring 中 “@Transactional”注解是用 AOP 实现的


11.Spring框架支持如下五种不同的作用域:
singleton:在Spring IOC容器中仅存在一个Bean实例,Bean以单实例的方式存在。
request:每次HTTP请求都会创建一个新的Bean。该作用域仅适用于WebApplicationContext环境。
session:一个HTTP Session定义一个Bean。该作用域仅适用于WebApplicationContext环境.
globalSession:同一个全局HTTP Session定义一个Bean。该作用域同样仅适用于WebApplicationContext环境.
bean默认的scope属性是’singleton‘。


12.利用spring的mock类进行HTTP 请求单元测试:
spring框架提供了大量测试的mock类,包括与jndi,porlet,web应用相关的mock类。尤其是web应用相关的mock类,可以大大提高web组件测试的方便性。

打开spring的下载包的mock文件夹(路径…mock\org\springframework\mock\web),就发觉有如下几个文件:

MockHttpServletRequest:是HttpServletRequest接口的mock实现,用来模拟客户端的HTTP请求,很常用的一个类。

MockHttpServletResponse:是HttpServletResponse接口的mock实现,用于模拟服务器对客户端的响应。

MockHttpSession:是对HttpSession接口的mock实现。

DelegatingServletInputStream:是对ServletInputStream接口的mock实现。

DelegatingServletOutputStream:ServletOutputStream的mock实现。需要拦截和分析服务器的输出的流的内容,可以使用该类。

其他的,例如MockFilterConfig,MockPageContext(可以测试预编译的

JSP),MockRequestDispatcher,MockServletConfig看名称就知道大概是mock什么的。


13.@Required注解

@Required注解应用于bean属性的setter方法,它表明影响的bean属性在配置时必须放在XML配置文件中。
使用@Required但不关联bean 来注解setter方法,将会发生BeanInitializationException 的异常


14.Spring框架中bean的生命周期
Spring容器读取XML文件中bean的定义并实例化bean。
Spring根据bean的定义设置属性值。
如果该Bean实现了BeanNameAware接口,Spring将bean的id传递给setBeanName()方法。
如果该Bean实现了BeanFactoryAware接口,Spring将beanfactory传递给setBeanFactory()方法。
如果任何bean BeanPostProcessors 和该bean相关,Spring调用postProcessBeforeInitialization()方法。
如果该Bean实现了InitializingBean接口,调用Bean中的afterPropertiesSet方法。
如果bean有初始化函数声明,调用相应的初始化方法。 如果任何bean BeanPostProcessors 和该bean相关,调用postProcessAfterInitialization()方法。
如果该bean实现了DisposableBean,调用destroy()方法


15.Spring框架的基本模块如下所示:

Core module     Bean module Context module Expression Language module JDBC module ORM module OXM module Java Messaging Service(JMS) module Transaction module Web module Web-Servlet module Web-Struts module Web-Portlet module 

16.有两个重要的bean生命周期方法。
第一个是setup方法,该方法在容器加载bean的时候被调用。
第二个是teardown方法,该方法在bean从容器中移除的时候调用。
bean标签有两个重要的属性(init-method 和 destroy-method),你可以通过这两个属性定义自己的初始化方法和析构方法。
Spring也有相应的注解:@PostConstruct 和 @PreDestroy。


17.spring事务的隔离级别和传播行为

隔离级别 - DEFAULT使用数据库默认的隔离级别  - READ_UNCOMMITTED会出现脏读,不可重复读和幻影读问题  - READ_COMMITTED会出现重复读和幻影读 - REPEATABLE_READ会出现幻影读  - SERIALIZABLE最安全,但是代价最大,性能影响极其严重 传播行为: - REQUIRED存在事务就融入该事务,不存在就创建事务 - SUPPORTS存在事务就融入事务,不存在则不创建事务 - MANDATORY存在事务则融入该事务,不存在,抛异常 - REQUIRES_NEW总是创建新事务 - NOT_SUPPORTED存在事务则挂起,一直执行非事务操作 - NEVER总是执行非事务,如果当前存在事务则抛异常 - NESTED嵌入式事务