Spring Core Spring核心功能:IOC容器,解决对象的创建及依赖关系
Spring WEB Spring对WEB模块的支持
Spring AOP切面编程
AOP的概述
AOP的底层实现
Spring AOP开发
使用AspectJ实现AOP
Spring JDBC Template使用
AOP 编程基本概念
AOP:aspect object programming 面向切面的编程,功能:让关注点代码与业务代码分离
关注点:很多重复代码(方法)叫关注点
切面:关注点形成的类,就叫切面,面向切面的编程,就是指很多功能重复的代码的抽象,再在 运行时向业务方法中动态的植入“切面类代码”
切入点:通过切入点表达式,指定拦截哪些类的哪些方法,给指定的类在运行时植入切面类代码
代理模式
代理模式一种设计模式,提供了对目标对象的另外的访问方式即通过代理访问目标对象
好处:可以在目标对象实现的基础上,增加额外的功能的操作。
扩展目标对象的功能。
1、静态代理
保存数据到数据库
Dao直接保存
添加事务
代理对象,要实现与目标对象一样的接口
优点:可以做到不修改目标对象功能前提下,对目标对象扩展。
缺点:1、因为代理对象需求实现与目标对象相同的接口,会有很多代理类
2、一旦接口增加方法,目标对象与代理对象都需要维护
解决方式:代理工厂?
使用动态代理
2、动态代理
代理对象不需要实现接口
代理对象生成,使用到JDKAPI,动态的在内存中创建代理对象
动态代理,也叫JDK代理,接口代理
API中
Proxy
public static Object newProxyInstance(
ClassLoader loader,//指定当前目标对象的使用类的加载器
Class<?>[] interfaces,//目标对象实现的接口类型
InvocationHandler h)//时间处理器
目标对象一定要实现接口,否则不能使用动态代理
代理对象实现:Class $Proxy0 implements XXXX
3、Cglib代理
子类代理。在内存中构建一个子类对象从而实现对目标对象的扩展
Cglib许多AOP框架使用
步骤:
引用.jar文件——Spring Core包中包含
在内存中动态创建目标对象的子类
目标对象不可以是final
目标对象方法是final、static,则不会拦截
示例:
package com.ziv.cglib; import java.net.ProxySelector; public class Appcglib { public static void main(String[] args) { //目标对象 UserDao target = new UserDao(); //代理对象 UserDao proxy = (UserDao) new ProxyFactory(target).getProxyFactory(); try { proxy.save(); proxy.update(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(proxy.getClass()); } }
package com.ziv.cglib; import java.lang.reflect.Method; import org.springframework.cglib.proxy.Enhancer; import org.springframework.cglib.proxy.MethodInterceptor; import org.springframework.cglib.proxy.MethodProxy; /** * cblib子类代理工厂(对UserDao在内存中动态创建一个代理) * * @author jzhong * */ public class ProxyFactory implements MethodInterceptor { //目标对象 private Object target; public ProxyFactory(Object target) { this.target = target; } //代理对象 public Object getProxyFactory() { //1、工具类 Enhancer en=new Enhancer(); //2、设置父类 en.setSuperclass(target.getClass()); //3、设置回调方法 en.setCallback(this); //4、创建代理 return en.create(); } @Override public Object intercept(Object arg0, Method method, Object[] arg2, MethodProxy arg3) throws Throwable { System.out.println("开始事务...."); //执行目标对象方法 Object result = method.invoke(target, arg2); System.out.println("结束事务...."); return result; } }
package com.ziv.cglib; /** * 目标类 * * @author jzhong * */ public class UserDao { public void save() throws Exception { // 开始事务 // 目标方法 System.out.println("----------数据已保存----"); // 提交事务 } public void update() throws Exception { // 目标方法 System.out.println("----------数据已更新----"); } }
在Spring AOP编程中
如果加入容器中的目标对象有实现接口,用JDK代理
如果目标对象没有有实现接口,用cglib代理
4、手动实现AOP编程
AOP面向切面的编程
AOP业务代码与关注点分离
关注点
重复代码(方法)叫关注点
AOP:
关注点代码写一次
开发者只需要关注核心业务
运行时,执行核心业务代码业务代码,动态植入关注点代码【代理】