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嵌入式事务