Spring AOP之二 ——AOP的实现方式

AOP的实现者
  • AspectJ
  • AspectWerkz
  • JBoss AOP
  • Spring AOP
实现AOP的技术,主要分为两大类:
一是采用动态代理技术
利用截取消息的方式,对消息进行装饰,以取代原有对象行为的执行。
二是采用静态织入的方式
引入特定的语法创建aspect.从而使得编译器可以在编译器间织入有关aspect的代码。
两者是殊途同归,实现AOP的技术特性是相同的。

Spring AOP
SpringAOP使用纯Java实现,它不需要专门的编译过程,不需要特殊的类装载器,它在 运行期通过代理方式向目标类织入增强代码。Spring并不尝试提供最完整的AOP实现,相反,它侧重于提供一种和Spring IoC容器整合的AOP实现,用以解决企业级开发中的常见问题。在Spring中,我们可以无缝地将Spring AOP、IoC和AspectJ整合在一起。 

Spring AOP是AOP技术在Spring中的具体实现,它和IOC一样是构成Sping框架的重要技术。Spring AOP是基于IOC的。
Spring AOP底层是通过JDK动态代理和CGLib动态代理技术为目标Bean实现横切逻辑的。

1.JDK动态代理

2.CGLib动态代理

AspectJ
AspectJ是语言级的AOP实现。AspectJ扩展了Java语言,定义了AOP语法,能够在编译期提供横切代码的织入,所以它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件。主页位于 http://www.eclipse.org/aspectj


Spring 2.0增加了对AspectJ更直接的支持。
AspectJ不是通过代理实现的,而是通过编译时织入实现的。织入是一种更高效的AOP实现,是较简单的代理方案的很好替代。


1.导入jar包(4个)
spring-aop-3.2.0.RELEASE.jar
com.springsource.org.aopalliance-1.0.0.jar
spring-aspects-3.2.0.RELEASE.jar
com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
2.导入头约束
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xmlns:aop="http://www.springframework.org/schema/aop"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
						http://www.springframework.org/schema/beans/spring-beans.xsd
						http://www.springframework.org/schema/aop 
						http://www.springframework.org/schema/aop/spring-aop.xsd">


3.开启AspectJ自动代理
<!-- 启用aspectJ自动代理  -->
<aop:aspectj-autoproxy/>
4.提供目标类
class UserDao{}
5.定义切面类
@Aspect
public class MyAdvisor {
	/**
	 * 前置通知
	 */
	@Before(value="execution(* cn.itcast.aspectj.annotation.*.save*(..))")
	public void before1(){
		System.out.println("前置通知执行了 ");
	}
}
6.在spring配置文件中注册目标对象和切面
<!-- 目标对象 -->
<bean id="userDao" class="cn.itcast.aspectj.annotation.UserDao"/>

<!-- 切面 -->
<bean id="myAdvisor" class="cn.itcast.aspectj.annotation.MyAdvisor"/>
7.在程序中使用代理对象
ApplicationContext ctx = new ClassPathXmlApplicationContext("cn/it/aspectj/annotation/beans.xml");
UserDao proxy = (UserDao) ctx.getBean("userDao");
proxy.find();
proxy.saveUser();
System.out.println(proxy.getClass().getName());

转载于:https://my.oschina.net/javandroid/blog/878259

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值