基于Schema定义的切面和前现两种方式定义的切面,内容上都差不多,只是表现形式不一样而已。
3.7.1一般增强的使用
a、目标类
public class Target {
public void say(){
System.out.println("say...");
}
public String getName(int id,String name){
System.out.println("getName...");
return "MR"+name+id;
}
public void around(){
System.out.println("around...");
}
public void targetThrow(){
System.out.println("targetThrow");
throw new RuntimeException("我是一个运行期异常...");
}
}
b、
POJO(增强所在的类
)
public class Pojo {
public void before() {
System.out.println("前置增强");
}
public void afterReturning(String retName, int id, String name) {
System.out.println("后置增强,返回值为:"+retName+" 入参为:"+id+"-"+name);
}
public Object around(ProceedingJoinPoint point) throws Throwable{
System.out.println("方法执行之前");
Object object = point.proceed();
System.out.println("方法执行之后");
return object;
}
public void throwEx(Exception ex){
System.out.println("抛出异常增强,异常信息:"+ex.getMessage());
}
public void finalEx(){
System.out.println("Final增强");
}
}
c、aop命名空间与Schema方式配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
<!-- 目标类 -->
<bean id="target" class="cn.framelife.spring.schema.Target"></bean>
<!-- 增强所在的类 -->
<bean id="advisor" class="cn.framelife.spring.schema.Pojo"></bean>
<!-- 配置基于schema的切面 -->
<aop:config proxy-target-class="true">
<!-- 确定增强所在类,并引入 -->
<aop:aspect ref="advisor">
<!—
前置增强
method是配置增强所在类中的方法
-->
<aop:before method="before" pointcut="target(cn.framelife.spring.schema.Target)"/>
<!—
后置增强
Returning 是返回值,必须和method中的参数名是一样的
在Schema配置中,多个切点函数的与操作是and,或操作是or
-->
<aop:after-returning method="afterReturning" pointcut="execution(* cn.framelife.spring.schema..getName(..)) and args(id,name)" returning="retName" arg-names="retName,id,name"/>
<!-- 环绕增强 -->
<aop:around method="around" pointcut="execution(* cn.framelife.spring.schema..around(..))"/>
<!—
抛出异常增强
throwing是异常对象,必须和method中的参数是一样的
-->
<aop:after-throwing method="throwEx" pointcut="execution(* cn.framelife.spring.schema..targetThrow(..))" throwing="ex"/>
<!-- Final增强 -->
<aop:after method="finalEx" pointcut="execution(* cn.framelife.spring.schema..targetThrow(..))"/>
</aop:config>
</beans>
d、测试
ApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"applicationContext.xml"});
Target target = (Target) context.getBean("target");
target.say();
target.getName(10, "Zhang");
target.around();
target.targetThrow();
e、结果
前置增强
say...
前置增强
getName...
后置增强,返回值为:MRZhang10 入参为:10-Zhang
前置增强
方法执行之前
around...
方法执行之后
前置增强
targetThrow
抛出异常增强,异常信息:我是一个运行期异常...
Final增强
Exception in thread "main" java.lang.RuntimeException: 我是一个运行期异常...
3.7.2引介增强的使用
我们还是使用3.6.2@DeclareParents中的例子:Waiter为目标类,然后让目标类拥有ISeller接口的功能:
http://blog.csdn.net/p_3er/article/details/9269407
a、两个接口与两个类
目标类与其接口:
-
publicinterfaceIWaiter{
-
publicvoidservice();
-
}
-
@Component
-
publicclassWaiterimplementsIWaiter{
-
@Override
-
publicvoidservice(){
-
System.out.println("service");
-
}
-
}
运行期织入到目标类的功能类与其接口:
-
publicinterfaceISeller{
-
publicvoidsell();
-
}
-
publicclassSellerimplementsISeller{
-
@Override
-
publicvoidsell(){
-
System.out.println("sell");
-
}
-
}
b、配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
<!-- 目标类 -->
<bean id="waiter" class="cn.framelife.spring.schema.Waiter"></bean>
<!-- 增强所在的类 -->
<bean id="advisor" class="cn.framelife.spring.schema.Pojo"></bean>
<aop:config proxy-target-class="true">
<!—
虽然引介增强不需要在增强所在的类中定义一个方法用于增强的实现,但<aop:aspect ref="advisor">中的ref属性依然要指定一个增强Bean
-->
<aop:aspect ref="advisor">
<!—
引介增强
types-matching 目标类
implement-interface 要织入目标类的接口
default-impl 织入接口的实现类
-->
<aop:declare-parents
types-matching="cn.framelife.spring.schema.IWaiter+"
implement-interface="cn.framelife.spring.schema.ISeller"
default-impl="cn.framelife.spring.schema.Seller"/>
</aop:aspect>
</aop:config>
</beans>
c、测试
ApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"applicationContext.xml"});
IWaiter waiter = (IWaiter) context.getBean("waiter");
waiter.service();
ISeller seller = (ISeller)waiter;
seller.sell();
d、结果
service
sell
分享到:
相关推荐
**Spring AOP 基于Schema的AOP支持** 在Spring框架中,AOP(面向切面编程)是一种强大的设计模式,它允许我们定义横切关注点,如日志、事务管理等,这些关注点可以独立于业务逻辑进行管理。Spring AOP提供了基于XML...
**Spring AOP:基于Schema配置的总结与案例** 在Java企业级开发中,Spring框架以其强大的功能和灵活性深受开发者喜爱。其中,Spring AOP(面向切面编程)是解决横切关注点问题的一个重要工具,它允许我们把业务逻辑...
1. `<aop:config>`:这是Spring AOP配置的根元素,用于开启基于XML的AOP配置。 2. `<aop:pointcut>`:定义一个切入点,即一组连接点。切入点表达式可以用简单的名称引用,也可以使用AspectJ的表达式语言来精确匹配...
本篇文章将深入探讨Spring AOP的Schema实现,即基于XML配置的方式来理解和应用AOP。 一、Spring AOP基础概念 1. 切面(Aspect):切面是关注点的模块化,例如日志、事务管理。在Spring AOP中,切面由通知(Advice...
在Spring AOP中,AspectJ有两种集成方式:一种是基于注解(@Aspect),另一种是基于XML Schema配置。本案例可能侧重于后者,即XML配置方式。这种方式通常在需要更精细控制或与老项目集成时使用。 描述中提到的"NULL...
三、Spring MVC中的AOP应用 在Spring MVC中,AOP常用于处理全局异常、事务管理和安全控制。例如,你可以创建一个异常处理切面,捕获所有控制器方法抛出的异常并统一处理: ```java @Aspect public class ...
第三种实现方法—通过注解来实现 签名 注解实现aop <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop=...
22. **Schema-based配置**:包括 `<aop:config/>`, `<aop:aspect/>`, `<aop:pointcut/>`, `<aop:around/>`, `<aop:before/>`, `<aop:after/>`, `<aop:declare-parents/>`, 和 `<aop:scoped-proxy/>`,这些XML元素...
Spring AOP是基于代理的,它可以为普通Java对象(POJOs)提供拦截器模式的功能。本实例将详细介绍如何在Spring 3.2.8版本中实现AOP。 首先,我们需要理解AOP的基本概念。AOP的核心是切面(Aspect),它包含了通知...
Spring AOP通过代理模式实现这一目标,支持动态代理(基于JDK)和CGLIB代理(对于无接口的类)。 `spring-aop.xsd`包含了不同版本(2.5、3.1、3.2)的XML配置元素和属性定义,这意味着随着Spring框架的版本更新,...
3. **配置 Spring AOP** 在 Spring 配置文件中,需要启用 AOP 并配置切面。以下是一个基本示例: ```xml <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi=...
标题中的"aopalliance"指的是AOP(面向切面编程)联盟,这是一个Java库,它为不同的面向切面编程实现提供了一个共同的接口。这个库是Spring框架的重要组成部分,尤其是在SSH(Struts、Spring、Hibernate)这样的经典...
3. 注解驱动的AOP:从Spring 2.5开始,可以使用注解来定义切面。例如,通过`@Aspect`、`@Before`、`@After`等注解在类和方法上声明切面和通知: ```java @Aspect public class LoggingAspect { @Before(...
3. 在配置AOP时,确保Spring容器已经启用AOP支持,即`<aop:config>`标签的存在。 通过上述XML配置,我们可以灵活地控制Spring AOP的各个元素,实现面向切面的编程,提升代码的可读性和可维护性。了解并熟练掌握这些...
这会告诉Spring容器,我们要启用基于注解的AOP,并代理所有带有切面注解的bean。配置如下: ```xml <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi=...
3. **使用注解**:Spring AOP也支持使用注解来定义切面和通知,例如`@Before`、`@AfterReturning`等,这使得代码更加简洁。 4. **自定义切点注解**:如果多个通知共享相同的切入点,可以创建自定义的切点注解,简化...
XML配置是Spring AOP早期版本中主要的配置方式,虽然在Spring 4.x及以后版本中,基于注解的配置更加常见,但理解XML配置仍然是学习AOP的基础。 首先,我们需要了解AOP的基本概念: 1. 切面(Aspect):一个关注点的...
Spring 提供了多种方式来支持 AOP 的实现,主要包括基于代理的经典 AOP、Schema-based 的 AOP 和 @AspectJ 注解驱动的 AOP。本文将详细介绍这三种类型的配置方式。 #### 二、基于代理的经典 AOP ##### 2.1 ...