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 hierarchy
2017-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 hierarchy
2017-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***********
***********后面**********
*******凤尾*******