Spring全自动编写代理-----AOP
来源:互联网 发布:粑粑是什么网络意思 编辑:程序博客网 时间:2024/04/29 22:12
spring aop编程:全自动
初步估计这应该是开发中最常用的(因为简单,懒人专用)
Aspectj织入点语法:
1、execution(public * *(..)) 任何类的任何返回值的任何方法
2、execution(* set*(..)) 任何类的set开头的方法
3、execution(* com.xyz.service.AccountService.*(..)) 任何返回值的规定类里面的方法
4、execution(* com.xyz.service…(..)) 任何返回值的,规定包或者规定包子包的任何类任何方法
1.从spring容器获得目标类,如果配置aop,spring将自动生成代理。
2.要确定目标类,aspectj 切入点表达式,导入jar包
spring-framework-3.0.2.RELEASE-dependencies\org.aspectj\com.springsource.org.aspectj.weaver\1.6.8.RELEASE
下面我们用案例说明一下:
用文字描述往往是枯燥的,结合案例就好多啦,尤其是第一次实现成功,总有点收获的喜悦。
1.现制定一个目标类,也就是被需要代理的类。
首先得有一个借口
package com.fly.aop;/** * 目标类 * @author Administrator * */public interface PersonService { public void addPerson(); public void updataPerson(); public void deletePerson();}
其次是这个接口的实现类
package com.fly.aop;import org.springframework.stereotype.Service;/** * 目标类 * @author Administrator * */@Service("personServiceIml") //加入Spring管理容器public class PersonServiceIml implements PersonService { @Override public void addPerson() { System.out.println("**********add*********"); } @Override public void updataPerson() { System.out.println("**********updata*********"); } @Override public void deletePerson() { System.out.println("**********delete*********"); }}
接下来有了目标类,有了目标类中的方法(切入点),就可以创建切面类啦,这个切面类是最基本的用法,后面我们会写个复杂用法的案例
直接指定要织入的位置和逻辑:下面的代码
package com.fly.aop;import org.aspectj.lang.annotation.After;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;import org.springframework.stereotype.Component;/** * 切面类 * @author Administrator * */@Component("myAspect") @Aspect // 声明切面public class MyAspect { // 指定织入的方法 也就是在调用addPerson()这个方法前织入下面的方法 @Before(value = "execution(public void addPerson())") public void before(){ System.out.println("********前面************"); } // 指定织入的方法 也就是在调用deletePerson()这个方法后织入下面的方法 @After(value = "execution(public void deletePerson())") public void after(){ System.out.println("***********后面**********"); }}
配置文件applicationContext.xml
<?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: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.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 1.扫描 注解类 --> <context:component-scan base-package="com.fly.aop"></context:component-scan> <!-- 2.确定 aop注解生效 --> <aop:aspectj-autoproxy></aop:aspectj-autoproxy></beans>
测试类:
package com.fly.aop;import org.junit.Test;import org.springframework.beans.factory.BeanFactory;import org.springframework.context.support.ClassPathXmlApplicationContext;public class TestDemo1 { @Test public void demo(){ String xmlPath = "com/fly/aop/applicaitonContext.xml"; BeanFactory context = new ClassPathXmlApplicationContext(xmlPath); PersonService bean = (PersonService) context.getBean("personServiceIml"); bean.addPerson(); bean.updataPerson(); bean.deletePerson(); }}
打印结果如下:
2017-3-3 9:36:53 org.springframework.context.support.AbstractApplicationContext prepareRefresh信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@78dc6a77: startup date [Fri Mar 03 09:36:53 CST 2017]; root of context hierarchy2017-3-3 9:36:53 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions信息: Loading XML bean definitions from class path resource [com/fly/aop/applicaitonContext.xml]2017-3-3 9:36:53 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons信息: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@75bc16f0: defining beans [myAspect,personServiceIml,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.aop.config.internalAutoProxyCreator,org.springframework.context.annotation.ConfigurationClassPostProcessor.importAwareProcessor]; root of factory hierarchy********前面**********************add*******************updata*******************delete********************后面**********
在其他类配置文件不变的情况下,我们再来改动一下切面类:
package com.fly.aop;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.AfterReturning;import org.aspectj.lang.annotation.Around;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;import org.aspectj.lang.annotation.Pointcut;import org.springframework.stereotype.Component;/** * 切面类 * @author Administrator * */@Component("myAspect") @Aspect // 声明切面public class MyAspect { // 指定织入的方法 也就是在调用addPerson()这个方法前织入下面的方法 @Before(value = "execution(public void addPerson())") public void before(){ System.out.println("********前面************"); } // 指定织入的方法 也就是在调用deletePerson()这个方法后织入下面的方法 @AfterReturning(value = "execution(public void deletePerson())") public void after(){ System.out.println("***********后面**********"); }/*****************************通过定义pointcut来指定:****************************************************************/ // 声明公共切入点或者说(定义pointcut织入点集合) @Pointcut("execution(public void deletePerson())") public void MyMethod(){} @Before("MyMethod()") public void beforeMethod(){ System.out.println("*******鸡首*******"); } @AfterReturning("MyMethod()") public void afterMethod(){ System.out.println("*******凤尾*******"); } // 或者下面这种方式 //执行前后都拦截。以pjp.proceed的方法分割开来 @Around("MyMethod()") public void aroundMethod(ProceedingJoinPoint pjp) throws Throwable{ System.out.println("***********before**********"); pjp.proceed(); System.out.println("*********after***********"); }}
测试类:
package com.fly.aop;import org.junit.Test;import org.springframework.beans.factory.BeanFactory;import org.springframework.context.support.ClassPathXmlApplicationContext;public class TestDemo1 { @Test public void demo(){ String xmlPath = "com/fly/aop/applicaitonContext.xml"; BeanFactory context = new ClassPathXmlApplicationContext(xmlPath); PersonService bean = (PersonService) context.getBean("personServiceIml");// bean.addPerson();// bean.updataPerson(); bean.deletePerson(); }}
打印结果:
2017-3-3 10:06:56 org.springframework.context.support.AbstractApplicationContext prepareRefresh信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@1b016632: startup date [Fri Mar 03 10:06:56 CST 2017]; root of context hierarchy2017-3-3 10:06:56 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions信息: Loading XML bean definitions from class path resource [com/fly/aop/applicaitonContext.xml]2017-3-3 10:06:57 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons信息: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@f8622f3: defining beans [myAspect,personServiceIml,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.aop.config.internalAutoProxyCreator,org.springframework.context.annotation.ConfigurationClassPostProcessor.importAwareProcessor]; root of factory hierarchy***********before*****************鸡首*****************delete******************after**********************后面*****************凤尾*******
0 0
- Spring全自动编写代理-----AOP
- Spring AOP 全自动编程
- Spring(十)spring编写代理(aop编程)
- Spring AOP 代理机制
- spring aop代理列子
- Spring Aop xml代理
- Spring AOP代理机制
- Spring Aop 动态代理
- Spring AOP 代理机制
- Spring AOP 代理机制
- Spring Aop代理
- Spring AOP代理模式
- Spring AOP动态代理
- Spring AOP 动态代理
- spring aop动态代理
- Spring AOP 代理模式
- Spring(AOP动态代理)
- Spring代理/aop异常
- Vulkan编程指南翻译 第五章 展现 第3节 交换链
- mysql存储过程中定义权限
- 分布式系统
- 系统分析与设计学习笔记之一: Introduction of SE & OOAD
- 面向对象编程Object Oriented Programming
- Spring全自动编写代理-----AOP
- 当起大量爬虫,爬同一个网页,运行到后面会大量出现错误
- 正则表示IP
- 使用轻量级Spring @Scheduled注解执行定时任务
- springMVC 使用 swagger
- 小程序怎么突然不火了?
- Android 贝塞尔曲线菜鸟起步
- Ubuntu 16.04.1 LTS配置Python3.6.0
- PlantUml