AOP(面向切面编程)Aspect-Oriented-Programming
和面向对象编程互相补充,一个是横向、一个是纵向
UserDaoImpl->save(前后加日志)用什么办法
方法前后添加逻辑
第一种方式-》直接加代码
如果没有源码
第二种方法-》利用继承(重写方法)前后加逻辑(能不用继承, 就不用)
第三种方式->实现接口implements UserDao(使用组合)
UserDao userDao = new UserDaoImpl1
Public class LogIntercepter 写日志的方法
动态代理,jdk里面可以产生动态代理Proxy ,InvocationHandler( 动态代理)
Aop 面试的时候问的特别多(回答出来,成功会很高,薪水也会高)
要动态代理的类需要继承一个接口。 不过hibernate不需要。直接改2进制
Public class LogInterceptor implements InvocationHandler {
Private Object target;(加上set、get方法)
Pubic void beforeMethod(){
}
Public Object invoke(Object org0, Method m, Object[] args) thows Throwable{
beforeMethod();
m.invoke(target, args);
return null;
}
}
、、产生代理对象,首先参数一个被代理对象
测试方法
Public void testProxy(){
UserDAO userDAO = new UserDAOImpl();
LogInterceptoer li = new LogIntercepter();
li.setTarget(userDAO);
UserDAO
userDAOProxy = (UserDAO)Proxy.newProxyInstance(userDao.getClass().getClassLoader(), new class[]{UserDAO.class}, li);
userDAOProxy.save(new User);
}
对一些方法前后需要加个逻辑(用动态代理)
设计更好的,动态想加就加。(利用配置文件配置),想用就用
什么是AOP,AOP的作用,面向对象编程是一条线。面向切面是在这条线的某一处切一刀添加逻辑(方法本身不知道)
AOP都用在哪写方面(1.权限、2日志、3效率、4事务、5异常的管理)
业务逻辑是主要内容,每个文件都加上权限、日志、效率、累代码很繁琐
原来的业务内容上加了一些内容,没法专注一个业务了
去掉、拿掉不方便
写程序不需要处理异常了,自己单独写个业务逻辑,配置文件控制想给哪个方法的异常
Servelit 的Filter的思想就是AOP思想,struts2的Interceptor
Spring两种动态代理的方式(xml、annocation)
<aop:aspect-autoproxy/>可以使用aspect注解的方式产生动态代理
Aspect是面向切面的框架,专门产生动态代理,spring使用了它
@Aspect @Before(在方法执行之前执行)
把逻辑织入到哪个对象哪个方法(spring管理的)
切入点语法
@Aspect
@Componet
Public class LogInterceptor {
@Before(“execution(public
void com.bjxst.dao.impl.UserDAOImpl.save(com.bjsxt.model.User))”)
public void befor() {
System.out.println(“method.start”);
}
}
Aop的一些概念需要了解就行了。
一个东西要想形成一定规模,一定要把一些术语提炼出来,建立一门科学。这些术语提炼一定要精确,详细。
AOP概念
JoinPoint(连接点、切入点)@Before
PointCut(“execution(* com.xyz.someapp.service.*.*(..))”)->切点、切入点集合,一下定义多个切入点
Aspect(切面),切面类好多方法加到不同的被代理的类的方法上,指的切面类
Advice(建议) 指的切面类的逻辑,加到切入点上的逻辑
Target(被切入对象)
Weave(织入)
其他advice、织入点语法
@AfterReturning(参数)
@AfterThrowing(参数)
@After(参数)指finally
@Around(参数)指环绕 —》责任链模式
@Pointcut(execution(* com.xyz.someapp.service..*.*(..))”)–à公用的advice
Public void myMethod(){};
@Before(“myMethod()”)
声明似的异常处理,struts2已经实现。把异常在页面显示
@Around(“myMethod()”)
Public void aroundMethod(ProceedingJoinPoint pjp) thows Throwable{
System.out.println(“start”);
pjp.proceed();
System.out.println(“start”);
}
@Before和@Around哪个先执行哪个后执行。不要依赖这种先后顺序
没有实现接口的,它直接调用cglib库,2进制实现动态代理,实现AOP
Xml方式实现aop(必须掌握)
<aop:aspect-autoproxy/>这个不需要啦
<bean id =”logInterceptor” class=”com.bjsxt.aop.LogInterceptor”></bean>
<aop:config>
<aop:pointcut expression=* com.xyz.someapp.service..*.*(..))” id=”servicePointct”>
</aop:pointcut>(这个也可以加到aspect里面,表示局部的)
<aop:aspect id =”logAspect” ref=”logInterceptor”>
<aop:before method=”before” pointcut-ref=”servicePoint” />
<aop:before method=”before” pointcu =” com.xyz.someapp.service..*.*(..))” /> //同上
</aop:aspect>
</aop:config>
考虑用xml好还是用annocation好,xml是经常使用的,切面类是我们自己写的,将来你用的切面类是第三方提供的。用别人的切面类逻辑时只能用xml配置
必须理解AOP的概念,必须理解,面试经常问到
长得越难看,成就就越大,我这辈子成就不会太大了
不理解动态代理就不会理解AOP
Spring两大核心概念IOC和AOP(学习到25)
转载请注明:学时网 » spring3.0听课学习笔记(二)