- 浏览: 53757 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (27)
- struts2 (0)
- hibernate3 (2)
- spring2.0 (1)
- spring2.5 (0)
- spring mvc (0)
- spring security2.0 (0)
- ajax (0)
- javascript (0)
- ext (0)
- jQuery (0)
- tapestry5 (0)
- mysql (1)
- webservice (1)
- log4j (1)
- memcached (0)
- cache (0)
- merkeley db (0)
- tiles (0)
- cglib (0)
- dwr (0)
- prototy (0)
- quartz (0)
- restlet (0)
- lforum (0)
- java基础 (6)
- java模式 (0)
- debug收集 (6)
- 包引用 (3)
- 数据缓存 (2)
- css (1)
- 音乐 (0)
- readme (2)
- 分页,富文本编辑框 (1)
最新评论
1.applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans http://www.springframework.org/schema/beans">http://www.springframework.org/schema/beans"
xmlns:http://www.w3.org/2001/XMLSchema-instance">http://www.w3.org/2001/XMLSchema-instance"
xmlns:http://www.springframework.org/schema/p">http://www.springframework.org/schema/p"
xmlns:http://www.springframework.org/schema/aop">http://www.springframework.org/schema/aop"
xmlns:http://www.springframework.org/schema/tx">http://www.springframework.org/schema/tx"
xsi:schemaLhttp://www.springframework.org/schema/beans">http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<!--第一种配置数据源
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/beian"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>
-->
<!-- 第二种方式配置数据源 -->
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
p:location="/WEB-INF/jdbc.properties" />
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource"
p:driverClassName="${jdbc.driverClassName}"
p:url="${jdbc.url}"
p:username="${jdbc.username}"
p:password="${jdbc.password}" />
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<!-- 将数据库源导入到会话工厂的class类中去 -->
<property name="dataSource">
<ref bean="dataSource"/>
</property>
<property name="hibernateProperties">
<props>
<!-- 配置hibernate方言(mysql/orcle/sqlserver)-->
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</prop>
</props>
</property>
<property name="mappingResources">
<list>
<!-- 导入hibernate 中实体JavaBean 对应的配置文件 -->
<value>com/edong/beian/model/Log.hbm.xml</value>
</list>
</property>
</bean>
<!-- 创建事务管理器 -->
<!-- jdbc,ibtas 方式
<bean id="jdbcTransaction"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
-->
<!-- hibernate 方式 -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!--配置了事务拦截器-->
<bean id="interceptorTrans" class="org.springframework.transaction.interceptor.TransactionInterceptor">
<!--根据需要进行事务切换-->
<property name="transactionManager" ref="transactionManager" />
<property name="transactionAttributes">
<props>
<!--PROPAGATION_REQUIRED:
表示在当前运行的方法中:
如果没有事务环境,则添加:conn.setCommitAuto(false),且事务类型为:wr;
如果有事务环境,则把该事务类型改为:wr
-->
<!-- ServiceException 前面的符号的含义:
+ 表示在当前运行的方法中,如果抛出该类型的异常,则强制提交事务,commmit();
_ 表示在当前运行的方法中,如果抛出该类型的异常,则回退事务,以前提交的数据rollback();
-->
<!-- 为以h开头的方法进行添加事务处理为以h开头的方法进行添加事务处理 -->
<prop key="p*">
PROPAGATION_REQUIRED,-RuntimeException
</prop>
</props>
</property>
</bean>
<!-- 配置DAO-->
<bean id="logDAO" class="com.edong.beian.dao.LogDAO"/>
<!-- 配置需要被代理的目标类 -->
<bean id="logService" abstract="false"
lazy-init="default" autowire="default" dependency-check="default"
class="com.edong.beian.service.LogService">
<!--在LogService 中注入LogDAO-->
<property name="logDAO" ref="logDAO"/>
</bean>
<!--配置事务代理类-->
<bean id="transactionProxy" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames">
<list>
<!--要对目标类DeptDAO进行自动事务处理,当调用该目标类中的方法??会给自动维护它的事务的统一性质-->
<value>logService</value>
</list>
</property>
<property name="interceptorNames">
<list>
<value>interceptorTrans</value>
</list>
</property>
<property name="optimize" value="true"/>
</bean>
<!-- 前置增强 -->
<bean id="before" class="com.edong.beian.cglib.LogMethodBeforeAdvice"/>
<!-- 后置增强 -->
<bean id="after" class="com.edong.beian.cglib.LogAfterReturningAdvice"/>
<!-- 前后增强 -->
<bean id="around" class="com.edong.beian.cglib.LogMethodInterceptor"/>
<!-- 异常增强-->
<bean id="throw" class="com.edong.beian.cglib.ThrowExceptionAdvice"/>
<!-- 返回代理对象 -->
<bean id="proxy1" class="org.springframework.aop.framework.ProxyFactoryBean">
<!--指定目标类-->
<property name="target" ref="logService"/>
<property name="proxyTargetClass" value="true"/>
<!-- 前提: 不管用hibernate的HibernateTransactionManager事务管理类
还是用 jdbc,ibatis的DataSourceTransactionManager事务管理类来进行事务管理
1. 如果目标类实现了一个接口
1) 当 optimize=true 为cglib产生的事务代理对象
2) 当 optimize=false 或 默认时 则以为jdk产生动态代理对象
2.如果目标类不实现任何接口
1) 当 optimize=true 为cglib产生的事务代理对象
2) 当 optimize=false 或默认时 则以为jdk产生动态代理对象,但是会报异常
(原因是:由jdk产生的代理时目标类必须实现一个接口,而cglib既能代理接口也能代理类)
注意:
传入 Session 注入SessionFactory 要分清
1.如果以spring内置代理(包括事务代理)时, getHibernateTemplate()
方式获取的SessionFactory 永远为空.(原因她由spring内部通过new 创
建一全新的HibernateTemplate 实列, 并不是通过获取配置文件中注入的
SessionFactory)
2.如果在配置文件中配置自动管理目标类的事务机制时,该机制只能管理通过
getHibernateTemplate()获取对象中的事务和它的统一性. 不能管理
传入的Session 的事务和它的统一性.传入的Session的事务必须手动
开启和提交.
-->
<!--添加增强类-->
<property name="interceptorNames">
<list>
<value>before</value>
<value>after</value>
<value>around</value>
<value>throw</value>
</list>
</property>
</bean>
</beans>
2. cglib:实现前增强,后增强,前后增强,异常增强 (四个单独的类)
前增强
import com.edong.ws.security.Login;
import java.lang.reflect.Method;
import java.util.Date;
import org.springframework.aop.MethodBeforeAdvice;
public class LogMethodBeforeAdvice implements MethodBeforeAdvice {
public void before(Method method, Object[] aobj, Object obj)
throws Throwable {
String date = (new Date()).toString();
Login login=null;
if(aobj.length>0){
if(aobj[0] instanceof Login){
login =(Login)aobj[0];
System.out.println("信息:[" + date + "]用户 " +login.getUsername() + " 正在尝试登录陆系统...");
}
}
}
后增强...
import com.edong.ws.security.Login;
import java.lang.reflect.Method;
import java.util.Date;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.springframework.aop.AfterReturningAdvice;
public class LogAfterReturningAdvice implements AfterReturningAdvice {
public void afterReturning(Object obj, Method method, Object[] aobj,
Object obj1) throws Throwable {
String date = (new Date()).toString();
/ /防止其他方法进入:logService.getCount();方法中就没参数...所以不存在访问数组元素...就会报错..
if(aobj.length>0){
if(aobj[0] instanceof Login){
Login login=(Login)aobj[0];
System.out.println("信息:["+date+"]用户 "+login.getUsername()+" 成功登录系统.");
}
}
}
前后增强
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
public class LogMethodInterceptor implements MethodInterceptor {
public Object invoke(MethodInvocation methodInvocation) throws Throwable {
Object result = null;
Object[] args = methodInvocation.getArguments();//获取传入目标方法的参数列表
int length =args.length;
for (int i = 0; i <length; i++) {
if (args instanceof Session){//判断参数类型是否是 Session
Transaction trans=((Session)(args)).beginTransaction();
try {
trans.begin();
result = methodInvocation.proceed();//调用代理目标类的具体方法
trans.commit();
} catch (Exception e) {
trans.rollback();
e.printStackTrace();
}
}
}
return result;
}
}
异常增强 :导包
import java.lang.reflect.Method;
import org.springframework.aop.ThrowsAdvice;
public class ThrowExceptionAdvice implements ThrowsAdvice {
public void afterThrowing(Method method, Object[] args, Object target,Exception ex)throws Throwable {
System.out.println("用户登录过程中发生异常: "+target.getClass().getSimpleName());
}
}
测试类:导包
import com.edong.beian.service.LogService;
import com.edong.ws.security.Login;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test{
public static void main(String[] args){
ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");//xml文件 放在src目录下
LogService logService = (LogService) ac.getBean("proxy1");
Login login=new Login();
login.setUsername("thh");
login.setPassword("aaa");
logService.clientLogin(login);
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans http://www.springframework.org/schema/beans">http://www.springframework.org/schema/beans"
xmlns:http://www.w3.org/2001/XMLSchema-instance">http://www.w3.org/2001/XMLSchema-instance"
xmlns:http://www.springframework.org/schema/p">http://www.springframework.org/schema/p"
xmlns:http://www.springframework.org/schema/aop">http://www.springframework.org/schema/aop"
xmlns:http://www.springframework.org/schema/tx">http://www.springframework.org/schema/tx"
xsi:schemaLhttp://www.springframework.org/schema/beans">http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<!--第一种配置数据源
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/beian"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>
-->
<!-- 第二种方式配置数据源 -->
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
p:location="/WEB-INF/jdbc.properties" />
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource"
p:driverClassName="${jdbc.driverClassName}"
p:url="${jdbc.url}"
p:username="${jdbc.username}"
p:password="${jdbc.password}" />
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<!-- 将数据库源导入到会话工厂的class类中去 -->
<property name="dataSource">
<ref bean="dataSource"/>
</property>
<property name="hibernateProperties">
<props>
<!-- 配置hibernate方言(mysql/orcle/sqlserver)-->
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</prop>
</props>
</property>
<property name="mappingResources">
<list>
<!-- 导入hibernate 中实体JavaBean 对应的配置文件 -->
<value>com/edong/beian/model/Log.hbm.xml</value>
</list>
</property>
</bean>
<!-- 创建事务管理器 -->
<!-- jdbc,ibtas 方式
<bean id="jdbcTransaction"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
-->
<!-- hibernate 方式 -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!--配置了事务拦截器-->
<bean id="interceptorTrans" class="org.springframework.transaction.interceptor.TransactionInterceptor">
<!--根据需要进行事务切换-->
<property name="transactionManager" ref="transactionManager" />
<property name="transactionAttributes">
<props>
<!--PROPAGATION_REQUIRED:
表示在当前运行的方法中:
如果没有事务环境,则添加:conn.setCommitAuto(false),且事务类型为:wr;
如果有事务环境,则把该事务类型改为:wr
-->
<!-- ServiceException 前面的符号的含义:
+ 表示在当前运行的方法中,如果抛出该类型的异常,则强制提交事务,commmit();
_ 表示在当前运行的方法中,如果抛出该类型的异常,则回退事务,以前提交的数据rollback();
-->
<!-- 为以h开头的方法进行添加事务处理为以h开头的方法进行添加事务处理 -->
<prop key="p*">
PROPAGATION_REQUIRED,-RuntimeException
</prop>
</props>
</property>
</bean>
<!-- 配置DAO-->
<bean id="logDAO" class="com.edong.beian.dao.LogDAO"/>
<!-- 配置需要被代理的目标类 -->
<bean id="logService" abstract="false"
lazy-init="default" autowire="default" dependency-check="default"
class="com.edong.beian.service.LogService">
<!--在LogService 中注入LogDAO-->
<property name="logDAO" ref="logDAO"/>
</bean>
<!--配置事务代理类-->
<bean id="transactionProxy" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames">
<list>
<!--要对目标类DeptDAO进行自动事务处理,当调用该目标类中的方法??会给自动维护它的事务的统一性质-->
<value>logService</value>
</list>
</property>
<property name="interceptorNames">
<list>
<value>interceptorTrans</value>
</list>
</property>
<property name="optimize" value="true"/>
</bean>
<!-- 前置增强 -->
<bean id="before" class="com.edong.beian.cglib.LogMethodBeforeAdvice"/>
<!-- 后置增强 -->
<bean id="after" class="com.edong.beian.cglib.LogAfterReturningAdvice"/>
<!-- 前后增强 -->
<bean id="around" class="com.edong.beian.cglib.LogMethodInterceptor"/>
<!-- 异常增强-->
<bean id="throw" class="com.edong.beian.cglib.ThrowExceptionAdvice"/>
<!-- 返回代理对象 -->
<bean id="proxy1" class="org.springframework.aop.framework.ProxyFactoryBean">
<!--指定目标类-->
<property name="target" ref="logService"/>
<property name="proxyTargetClass" value="true"/>
<!-- 前提: 不管用hibernate的HibernateTransactionManager事务管理类
还是用 jdbc,ibatis的DataSourceTransactionManager事务管理类来进行事务管理
1. 如果目标类实现了一个接口
1) 当 optimize=true 为cglib产生的事务代理对象
2) 当 optimize=false 或 默认时 则以为jdk产生动态代理对象
2.如果目标类不实现任何接口
1) 当 optimize=true 为cglib产生的事务代理对象
2) 当 optimize=false 或默认时 则以为jdk产生动态代理对象,但是会报异常
(原因是:由jdk产生的代理时目标类必须实现一个接口,而cglib既能代理接口也能代理类)
注意:
传入 Session 注入SessionFactory 要分清
1.如果以spring内置代理(包括事务代理)时, getHibernateTemplate()
方式获取的SessionFactory 永远为空.(原因她由spring内部通过new 创
建一全新的HibernateTemplate 实列, 并不是通过获取配置文件中注入的
SessionFactory)
2.如果在配置文件中配置自动管理目标类的事务机制时,该机制只能管理通过
getHibernateTemplate()获取对象中的事务和它的统一性. 不能管理
传入的Session 的事务和它的统一性.传入的Session的事务必须手动
开启和提交.
-->
<!--添加增强类-->
<property name="interceptorNames">
<list>
<value>before</value>
<value>after</value>
<value>around</value>
<value>throw</value>
</list>
</property>
</bean>
</beans>
2. cglib:实现前增强,后增强,前后增强,异常增强 (四个单独的类)
前增强
import com.edong.ws.security.Login;
import java.lang.reflect.Method;
import java.util.Date;
import org.springframework.aop.MethodBeforeAdvice;
public class LogMethodBeforeAdvice implements MethodBeforeAdvice {
public void before(Method method, Object[] aobj, Object obj)
throws Throwable {
String date = (new Date()).toString();
Login login=null;
if(aobj.length>0){
if(aobj[0] instanceof Login){
login =(Login)aobj[0];
System.out.println("信息:[" + date + "]用户 " +login.getUsername() + " 正在尝试登录陆系统...");
}
}
}
后增强...
import com.edong.ws.security.Login;
import java.lang.reflect.Method;
import java.util.Date;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.springframework.aop.AfterReturningAdvice;
public class LogAfterReturningAdvice implements AfterReturningAdvice {
public void afterReturning(Object obj, Method method, Object[] aobj,
Object obj1) throws Throwable {
String date = (new Date()).toString();
/ /防止其他方法进入:logService.getCount();方法中就没参数...所以不存在访问数组元素...就会报错..
if(aobj.length>0){
if(aobj[0] instanceof Login){
Login login=(Login)aobj[0];
System.out.println("信息:["+date+"]用户 "+login.getUsername()+" 成功登录系统.");
}
}
}
前后增强
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
public class LogMethodInterceptor implements MethodInterceptor {
public Object invoke(MethodInvocation methodInvocation) throws Throwable {
Object result = null;
Object[] args = methodInvocation.getArguments();//获取传入目标方法的参数列表
int length =args.length;
for (int i = 0; i <length; i++) {
if (args instanceof Session){//判断参数类型是否是 Session
Transaction trans=((Session)(args)).beginTransaction();
try {
trans.begin();
result = methodInvocation.proceed();//调用代理目标类的具体方法
trans.commit();
} catch (Exception e) {
trans.rollback();
e.printStackTrace();
}
}
}
return result;
}
}
异常增强 :导包
import java.lang.reflect.Method;
import org.springframework.aop.ThrowsAdvice;
public class ThrowExceptionAdvice implements ThrowsAdvice {
public void afterThrowing(Method method, Object[] args, Object target,Exception ex)throws Throwable {
System.out.println("用户登录过程中发生异常: "+target.getClass().getSimpleName());
}
}
测试类:导包
import com.edong.beian.service.LogService;
import com.edong.ws.security.Login;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test{
public static void main(String[] args){
ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");//xml文件 放在src目录下
LogService logService = (LogService) ac.getBean("proxy1");
Login login=new Login();
login.setUsername("thh");
login.setPassword("aaa");
logService.clientLogin(login);
}
}
相关推荐
这将设置Spring Web相关类的日志级别为DEBUG,以便我们能看到拦截器的执行过程。 启动类通常会包含`@SpringBootApplication`注解,该注解包含了`@EnableAutoConfiguration`,`@ComponentScan`和`@...
例如,可能会有一个自定义的MyBatis拦截器用于分页查询,一个Spring AOP切面用于记录操作日志,Spring事务管理确保数据的一致性,而反射工具类可能用于动态加载配置或处理某些通用的反射任务。通过这些组件的组合,...
本例提供了一个简单的AOP拦截器实现,我们可以从这个基础出发,深入理解和探讨AOP的核心概念、工作原理以及其在实际开发中的应用。 首先,AOP的主要目标是解决程序中的横切关注点,如日志记录、事务管理、性能监控...
Spring AOP 拦截器 Advisor 是 Spring 框架中的一个重要概念,它与切面编程密切相关,用于实现细粒度的控制和增强应用程序的行为。在 Spring AOP 中,Advisor 是一个组合了通知(Advice)和切入点(Pointcut)的对象...
在本项目中,我们将探讨如何通过配置文件实现Spring AOP,包括前置通知、后置通知以及拦截器的运用。 首先,我们需要理解Spring AOP的核心概念。切面(Aspect)是关注点的模块化,这些关注点定义了跨越多个对象的...
具体到Spring AOP拦截器的代码实现,本文通过创建TestInterceptor类来演示。这个类继承自HandlerInterceptorAdapter,然后重写其中的afterCompletion、postHandle等方法。在这个类中,可以在相应方法中添加自定义的...
Spring AOP,全称Aspect-Oriented Programming(面向切面编程),是Spring框架的一个重要模块,它通过提供声明式的方式来实现面向切面编程,从而简化了应用程序的开发和维护。在Spring AOP中,我们无需深入到每个...
标题中的“在自定义Spring AOP中使用EL获取拦截方法的变量值”指的是在Spring的面向切面编程(AOP)中,通过Expression Language(EL,表达式语言)来访问被拦截方法的局部变量值。这通常涉及到Spring的代理机制、...
### Spring AOP 四种创建通知(拦截器)类型详解 Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架中的一个重要模块,它提供了在应用代码中添加横切关注点的能力,如日志记录、事务管理、权限...
本项目示例涵盖了这些框架的整合使用,以及jQuery AJAX登录、Struts拦截器和Spring AOP(面向切面编程)的应用。 1. **Struts2**:Struts2是一个基于MVC(Model-View-Controller)设计模式的Web应用框架,它简化了...
Spring AOP和其他AOP框架(如AspectJ)都实现了这些接口,以实现方法拦截和通知机制。 2. aspectjweaver-1.7.0.jar:这是AspectJ的织入器,负责在运行时动态地将切面(aspect)织入到目标类中。AspectJ提供了一种...
它定义了一些通用的AOP接口,比如`org.aopalliance.intercept.MethodInterceptor`和`org.aopalliance.intercept.MethodInvocation`,使得不同的AOP框架(如Spring和AspectJ)可以共享相同的拦截器(interceptors)。...
在IT行业中,Spring AOP(面向切面编程)是一种强大的工具,它允许我们在不修改代码的情况下,对应用程序的特定部分进行拦截和增强。这在性能监控、日志记录、事务管理等方面尤为有用。本篇文章将深入探讨如何使用...
在Spring中,我们可以使用`@Aspect`注解来定义一个切面,这个切面包含了多个通知(advice),即拦截器。例如: ```java @Aspect @Component public class LoggingAspect { @Before("execution(* ...
除此之外,Spring AOP的使用可能还需要其他相关库,比如`aspectjrt.jar`和`aspectjweaver.jar`,这两个是AspectJ运行时库和编织器,用于在运行时或编译时将切面织入到目标类中。如果涉及到XML配置,`spring-...
- **Interceptor(拦截器)**:一个实现了特定接口的类,用来包装目标方法并执行额外的动作。 - **Proxy(代理)**:在目标对象和执行动作之间创建的一个对象,用于实现AOP功能。 2. AOP的不同类型的通知 - **...
比如,`org.aopalliance.intercept.MethodInterceptor`接口定义了拦截器的接口,Spring AOP的`MethodBeforeAdvice`、`AfterReturningAdvice`等通知类型都实现了这个接口。 了解这些jar包的作用后,我们可以看到...
CGLIB是Spring AOP默认的代理库,用于生成目标类的子类,从而实现方法拦截。当目标类没有实现接口时,Spring会使用CGLIB。 8. Spring事务管理: Spring提供了声明式事务管理,通过@Transactional注解在方法级别声明...
许多 AOP 框架都以拦截器的形式来表现增强--所谓拦截器是这样的一个对象:当连接点被调用时,它会收到一个回调消息。基本的增强有前增强、后增强、环绕增强等。引介是为一个现有的 Java 类或接口添加方法或字段。...
7. **组合模式(Composite)**:在Spring AOP中,虽然没有直接的组合模式实现示例,但组合模式的思想体现在能够将多个拦截器(Interceptor)组合成一个链,每个拦截器都可以看作是树结构中的一个节点,共同完成一个...