什么是AOP
回答:举列+画图
1.面向切面编程Aspect-Oriented-Programming
a)是对面向对象的思维方式的有力补充
3.好处:可以动态的添加和删除在切面上的逻辑而不影响原来的执行代码
a)Filter
b)Struts2的interceptor
4.概念:
a)JoinPoint链接点:在那些个点或位置上上把我的切面逻辑加上去
b)PointCut切人点, 实际上就是JoinPoint的集合
a)Aspect(切面)
c)Advice切面代表的面,而advice代表这个切面上某个连接点的逻辑
b)Target被代理对象
c)Weave把我们逻辑缝合到那个业务上去
Spring AOP配置与应用
1.aspectj是专门用来产生动态代理或者说是专门面向AOP编程的框架,spring可以使用aspectj,使用aspectj必须引入相应的jar包
2.加入新的命名空间及schemaLocation:
A) xmlns:aop="http://www.springframework.org/schema/aop"并且
在xsi:schemaLocation中添加http://www.springframework.org/schema/aop和http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
3.如果想给提示还要在XML catalog中配置
Location:spring-aop-2.5.xsd的目录(在spring/dist/resources中)
Key:http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
并且http://www.springframework.org/schema/aop/spring-aop-2.5.xsd后面的
spring-aop-2.5.xsd视情况而定,有时候要,有时候不要也行
4.如果想使用annotation来帮你产生代理,那么必须要在xml中声明<aop:aspectj-autoproxy/> autoproxy的意思是说自动的去帮我产生代理,只要在spring的容器启动过程当中,它扫描到有个东西需要产生代理,它就会帮你产生代理;如果想使用xml来帮你产生代理,那么就不需要xml中声明<aop:aspectj-autoproxy/>
5.引入和aspectj相关的jar包:
如果使用的是annotation的话aopalliance.jar是不可少的,如果使用的xml的方式则不需要
6.Execution(public * com.bjsxt.dao..*.*(..))意思是
1.第一个“*”表示返回值可以是任何类型
2.“Com.bjsxt.dao..”意思是com.bjsxt.dao包及子包中
3.第二个*表示任何类
4.第三个*表示任何方法
6.一个类你实现了接口后,它就会用jdk自带的proxy和InvocationHandler来帮你产生代理;如果这个类没有实现接口,那么它就会用直接操纵2进制码的类库(要引入cglb的jar包),也就是CGLB来帮你产生代理的代码(这就是使用annotation来实现的动态代理,也就是来实现的AOP的编程);在没
2.两种方式:
a)使用Annotation
b)使用xml
3.Annotation
a)加上对应的xsd文件spring-aop.xsd
b)beans.xml <aop:aspectj-autoproxy />
c)此时就可以解析对应的Annotation了
d)建立我们的拦截类
e)用@Aspect注解这个类
f)建立处理方法
g)用@Before来注解方法
h)写明白切入点(execution …….)
i)让spring对我们的拦截器类进行管理@Component
4.常见的Annotation:
a)@Before
b)@Pointcut
@Pointcut("execution(* com.niit.service.imp.UserServiceImp.addUser(com.niit.model.User))")
public void myMethod(){}
我们在每个advice上面都要定义织入点语法这样有点麻烦,我们干脆跟织入点语法取
个别名myMethod(),这个以后就可以只用method()来代替织入点语法
c)@AfterReturning在方法返回之后
d)@AfterThrowing 在抛了异常之后
e)@After
f)@Around
@Around("myMethod()")
public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("method start before....");
Object retVal = pjp.proceed();
System.out.println("method end after....");
return retVal;
}
注意:不要依赖与spring的逻辑,到底是@before先执行还是@Around先执行,不要依赖这个
注意:
一个类(UserServiceImp)如果实现接口(UserService)时,它就会使用jdk自带的Proxy和InvocationHandler来帮我们产生代理。
但是这个类(UserServiceImp)如果没有实现接口,我们也能产生这个类的代理对象,那么它就会用直接操纵二进制码的方式CGLB来帮我们产生代理的代码,如果这个类如果没有实现接口,那么就必须导入CGLB.jar包
5.织入点语法
a)void !void
b)参考文档(* ..)
6.xml配置AOP
关于AOP,annotation的方式可以不用掌握,但xml方式一定要掌握
a)把interceptor对象初始化
b)<aop:config
i.<aop:aspect …..
1.<aop:pointcut
2.<aop:before