1、1)Aspect(切面)
比如说事务、权限等,与业务逻辑没有关系的部分
2)joinPoint(连接点)
目标类的目标方法。
3)PointCut(切入点)
就是指我们要对哪些方法拦截的定义
4)Advice(通知)
5)Target(目标对象)
代理的目标对象
6)Weaving(织入)
是指把切面应用到目标对象来创建新的代理对象的过程,切面在指定的连接点织入到目标对象
2、通知(Advice)分为
Before ——前置通知
After——后置通知
After-returning——最后通知
After-throwing ——异常通知
Around——环绕通知
配置文件
<?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
<
beans
xmlns
=
"http://www.springframework.org/schema/beans"
xmlns:aop
=
"http://www.springframework.org/schema/aop"
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-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
<!--
spring aop的命名空间需要自己加进来
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
spring aop还需要两个jar包
aspectjrt.jar
aspectjweaver.jar
导入目标类,导入切面
-->
<
bean
id
=
"personDao"
class
=
"_10SpringAOP.PersonDaoImpl"
></
bean
>
<
bean
id
=
"myTransaction"
class
=
"_10SpringAOP.MyTransaction"
></
bean
>
<
aop:config
>
<
aop:pointcut
expression
=
"execution(* _10SpringAOP.PersonDaoImpl.*(..))"
id
=
"perform"
/>
<
aop:aspect
ref
=
"myTransaction"
>
<
aop:before
method
=
"beginTransaction"
pointcut-ref
=
"perform"
/>
<!-- 记得加上returning -->
<
aop:after-returning
method
=
"commit"
pointcut-ref
=
"perform"
returning
=
"var"
/>
<
aop:after
method
=
"finalMethod"
pointcut-ref
=
"perform"
/>
<!-- 记得加上throwsing -->
<
aop:after-throwing
method
=
"throwMethod"
pointcut-ref
=
"perform"
throwing
=
"ex"
/>
<
aop:around
method
=
"aroundMethod"
pointcut-ref
=
"perform"
/>
</
aop:aspect
>
</
aop:config
>
</
beans
>
import
org.aspectj.lang.annotation.AfterReturning;
import
org.aspectj.lang.annotation.Aspect;
import
org.aspectj.lang.annotation.Before;
import
org.aspectj.lang.annotation.Pointcut;
import
org.springframework.stereotype.Component;
/**
* @Aspect
* ==
* <aop:config>
* <aop:pointcut
* expression=
* "execution(* cn.itcast.spring.aop.annotation.sh.PersonDaoImpl.*(..))"
* id="aa()"/>
* </aop:config>
* @author Think
*
*/
@Component
(
"MyTranscation"
)
@Aspect
public
class
MyTranscation {
//说明那个是目标对象
@Pointcut
(
"execution(* _13SpringAop_annotation.PersonDaoImpl.*(..))"
)
//方法签名 返回值必须是void 方法的修饰符最好是private
//空方法
private
void
add(){}
@Before
(
"add()"
)
public
void
beginTransaction(){
System.out.println(
"beginTranscation"
);
}
@AfterReturning
(value=
"add()"
,returning=
"var"
)
public
void
commit(Object var){
System.out.println(
"commit"
);
System.out.println(
"var is "
+ var);
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
package
_13SpringAop_annotation;
import
org.springframework.context.ApplicationContext;
import
org.springframework.context.support.ClassPathXmlApplicationContext;
//beginTranscation
//save person
//commit
//var is aaa
public
class
test {
public
static
void
main (String[] args){
ApplicationContext context =
new
ClassPathXmlApplicationContext(
"applicationContext.xml"
);
PersonDaoImpl persondao = (PersonDaoImpl) context.getBean(
"personDao"
);
persondao.savePerson(
new
Person());
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
<?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
<
beans
xmlns
=
"http://www.springframework.org/schema/beans"
xmlns:context
=
"http://www.springframework.org/schema/context"
xmlns:aop
=
"http://www.springframework.org/schema/aop"
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-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<!--
把目标类和切面纳入到spring容器中管理,启动类扫描的机制
-->
<
context:component-scan
base-package
=
"_13SpringAop_annotation"
></
context:component-scan
>
<!--
启动aop的注解解析器
-->
<
aop:aspectj-autoproxy
></
aop:aspectj-autoproxy
>
</
beans
>
|