术语先来一发
- 目标对象(Target)
- 代理对象(Proxy)
- 连接点(Joinpoint)
- 切入点(Pointcut)
- 通知(增强)(Advice)
- 切面(Aspect、Advisor)
- 织入、切入(weaving)
1. 创建目标对象和代理对象, 目标对象还和Spring IOC一样的注解, 下面是代理类
增加了@Aspect以及描述方法的通知类型
package org.spring.exampleAOP;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
/**
* 切面类
*/
@Component //首先创建对象
@Aspect //再说明此对象是代理对象
public class MyAspect1 {
@After("execution(* org.spring.exampleAOP.Sadamu.*(..))") //切入点表达式 After置后执行
public void log(){
System.out.println("记录日志");
}
}
2. applicationContext.xml的配置
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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="org.spring.exampleAOP" />
<!--2,开启代理-->
<aop:aspectj-autoproxy />
</beans>
3. 零配置也就是在Spring配置类中增加了开启代理注解 @EnableAspectJAutoProxy
package org.spring.exampleAOP;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.context.annotation.PropertySource;
/**
* spring 配置类
*/
@Configuration
@ComponentScan(value = {"org.spring.exampleAOP"}) //注解扫描
@PropertySource(value="classpath:my.properties") //加载配置文件
@EnableAspectJAutoProxy
//@Import(value={SpringConfig.class}) // 导入多个配置类 对于properties
public class SpringConfig {
}
4. 测试, 还和原来一样
package org.spring.exampleAOP;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Test {
public static void main(String[] args) {
//读取xml文件
//ApplicationContext applicationContext1 = new FileSystemXmlApplicationContext("./src/applicationContext.xml");
//零配置方式
ApplicationContext applicationContext1 = new AnnotationConfigApplicationContext(SpringConfig.class);
//获取Bean对象
People people1 = (People) applicationContext1.getBean("sadamu");
people1.Shoot();
}
}
5. 测试结果
萨达姆开枪了
记录日志
Process finished with exit code 0