当前位置: 代码迷 >> ASP >> AOP具体兑现-AspectJ(2)
  详细解决方案

AOP具体兑现-AspectJ(2)

热度:782   发布时间:2013-03-17 13:48:32.0
AOP具体实现--AspectJ(2)

   

   上篇文章我们对AOP的相关概念进行了解,接下来我们将采用Annotation的方式完成AOP的实现.当然也可以用XML的配置方式进行实现.

 

采用Annotation完成AOP示例

 

1、spring的依赖包配置

SPRING_HOME/dist/spring.jar

SPRING_HOME/lib/log4j/log4j-1.2.14.jar

SPRING_HOME/lib/jakarta-commons/commons-logging.jar

SPRING_HOME/lib/aspectj/*.jar

 

2、将横切性关注点模块化,建立SecurityHandler.java

 

 

			package com.bjpowernode.spring;
			
			import org.aspectj.lang.annotation.After;
			import org.aspectj.lang.annotation.Aspect;
			import org.aspectj.lang.annotation.Before;
			import org.aspectj.lang.annotation.Pointcut;
			
			
			//采用注解指定SecurityHandler为Aspect
			@Aspect
			public class SecurityHandler {
				
				
				/**
				 * 定义Pointcut,Pointcut的名称为addAddMethod(),此方法没有返回值和参数
				 * 该方法就是一个标识,不进行调用
				 */
				@Pointcut("execution(* add*(..))")
				private void addAddMethod(){};
				
				
				/**
				 * 定义Advice,表示我们的Advice应用到哪些Pointcut订阅的Joinpoint上
				 */
				@Before("addAddMethod()")
				//@After("addAddMethod()")
				private void checkSecurity() {
					System.out.println("-------checkSecurity-------");
				}		
			}

 

3、采用注解指定SecurityHandler为Aspect

 

4、采用注解定义Advice和Pointcut

 

5、启用AspectJ对Annotation的支持,并且将目标类和Aspect类配置到IoC容器中

 

 

			<?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:aop="http://www.springframework.org/schema/aop"
				     xmlns:tx="http://www.springframework.org/schema/tx"
				     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
			           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
			           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
			           
			    <!-- 启用AspectJ对Annotation的支持 -->       
				<aop:aspectj-autoproxy/>           
				
				<bean id="userManager" class="com.bjpowernode.spring.UserManagerImpl"/>
				
				<bean id="securityHandler" class="com.bjpowernode.spring.SecurityHandler"/>
			</beans>

 

6、开发客户端

 

			package com.bjpowernode.spring;
			
			import org.springframework.beans.factory.BeanFactory;
			import org.springframework.context.support.ClassPathXmlApplicationContext;
			
			public class Client {
			
				public static void main(String[] args) {
					BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");
					UserManager userManager = (UserManager)factory.getBean("userManager");
					userManager.addUser("张三", "123");
				}
			
			}


小结:

上述实例的主要功能是在进行增加用户的时候进行安全检查,本实例通过System.out.println("-------checkSecurity-------");来代替具体的检查内容.如果不用AOP思想来实现的话,那些与商业逻辑无关的重复代码遍布在整个程序中。实际的工程项目中涉及到的类和函数,远远不止几个。AspectJ令代码更精简,结构更良好.

 

 

 

2楼lb85858585昨天 21:53
AspectJ令代码更精简,结构更良好。补充一个:维护工作量更小~~
1楼StubbornPotatoes昨天 23:48
注解其实也挺好使。