spring--AOP经典(XML Sechma和Annotation 两种配置方式总结)学习小例子
1 最近在复习spring AOP,下面是自己测试的一个学习例子,共大家参考,有不同意见欢迎指出。 2
3 1.定义接口:
4 public interface IHello { 5 6 public void hello(String name); 7 }
2.接口的实现类: public class HelloSpeaker implements IHello{ public void hello(String name) { System.out.println("Hello()---"+name); } }
1 3.定义一个Before Aspect 2 3 public class LogAspect implements BeforeAdvice{ 4 5 private Logger logger = Logger.getLogger(this.getClass().getName()); 6 7 /** 8 * before方法是:在目标对象上的方法被执行前要执行的方法,jointPoint参数是可选项。 9 * 通过JointPoint对象,可以获得目标对象【getTarget()】、目标方法上的参数[getArgs()]等信息 10 * @param jointPoint 11 */ 12 public void before(JoinPoint jointPoint){ 13 //在这里添加业务逻辑代码 14 logger.log(Level.INFO, "这是before(),在hello方法执行之前执行,在这里添加要织入的业务逻辑代码!!!"+ 15 jointPoint.getSignature().getDeclaringTypeName()+"."+jointPoint.getSignature().getName()); 16 17 } 18 }
1 4.编写配置文件: 2 3 <!-- 4 注释: 5 <aop:aspect></aop:aspect>用于定义Advice实例 6 <aop:before></aop:before>表示当前实例用于实现 Before Advice 7 pointcut属性用于指定porintcut表达式 8 --> 9 <!-- Advice 等价于 Aspect--> 10 <bean id="logAspect" class="spaop.LogAspect"></bean> 11 <!-- 目标类 --> 12 <bean id="helloSpecker" class="spaop.HelloSpeaker"></bean> 13 <aop:config> 14 <!-- Pointcut 指在哪些方法织入? --> 15 <aop:pointcut id="logHello" expression="execution(* spaop.IHello.*(..))"/><!-- 注意这里的写法,*号必须与spaop之间有个空格,其中*代表返回值类型,往后指方法 --> 16 <!-- Advice的配置 指在方法的前、后、Around中织入? --> 17 <aop:aspect id="logging" ref="logAspect"> 18 <aop:before pointcut-ref="logHello" method="before"/> 19 </aop:aspect> 20 </aop:config>
1 5.编写一个测试类: 2 public class TestCC { 3 public static void main(String[] args) { 4 ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); 5 try { 6 IHello helloSpeaker = (IHello) ctx.getBean("helloSpecker"); 7 helloSpeaker.hello("kingjames"); 8 } catch (Exception e) { 9 e.printStackTrace(); 10 } 11 } 12 }
运行结果:
10:49:17,421 INFO - 这是before(),在hello方法执行之前执行,在这里添加要织入的业务逻辑代码!!!spaop.IHello.hello
Hello()---kingjames
总结:按照以上步骤规则类写,不易犯错误
1 例子2:基于Annotation的配置方式 2 1.定义接口: 3 public interface IHello { 4 5 public void hello(String name); 6 }
1 2.接口实现类: 2 public class HelloSpeaker implements IHello{ 3 4 public void hello(String name) { 5 System.out.println("Hello()---"+name); 6 } 7 }
1 3.编写Aspect类:使用Annotation的方式 2 @Aspect //相当于是一个Advice 3 public class LogBeforeAdvice { 4 5 @Before("execution(* spaop.IHello.*(..))") 6 public void before(JoinPoint joinPoint){ 7 //在这里织入逻辑代码... 8 System.out.println("Logging before"+joinPoint.getSignature().getName()+"执行Before方法,把业务逻辑代码添加到这来,以便插入到hello()方法的前面。。!!"); 9 } 10 } 11
1 4.配置文件: 2 <!-- Advice 等价于 Aspect--> 3 <bean id="logAspect" class="spaop.LogAspect"></bean> 4 <!-- 目标类 --> 5 <bean id="helloSpecker" class="spaop.HelloSpeaker"></bean>
<!-- 使用自动装配的方式 --> 6 <bean id="logBeforeAdvice" class="spaop.annotation.LogBeforeAdvice"></bean> 7 <aop:aspectj-autoproxy /> 8
                    
                
                
            
        
浙公网安备 33010602011771号