控制反转(IoC)
IOC 让程序员不再关注怎么去创建对象,而是关注与对象创建之后的操作,把对象的创建、初始化、销毁等工作交给spring容器来做。
面向切面(AOP)
AOP(Aspect Oriented Programming),通常称为面向切面编程。它利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为"Aspect",即切面。
所谓"切面",简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。
JDK动态代理
动态代理是通过反射类拿到目标类的接口实现,进行拦截和拓展。
优点:
可以不用实现目标类的接口,直接通过反射拿到目标的方法进行拦截。
缺点:
目标类对象一定要实现接口
操作:
public class ObjectInterceptor implements InvocationHandler {
//目标类
private Object target;
//切面类(这里指事务类)
private MyTransatation myTransatation;
//通过构造器赋值
public ObjectInterceptor(Object target,MyTransatation transaction){
this.target = target;
this.myTransatation = transaction;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{
//开启事务
this.myTransatation.before();
//调用目标类方法
method.invoke(this.target, args);
//提交事务
this.myTransatation.after();
return null;
}
}
TestUsers测试类
//目标类
Object target =new UsersServiceImpl();
//事务类
MyTransatation myTransatation=new MyTransatation();
ObjectInterceptor proxyObject =new ObjectInterceptor(target, myTransatation);
/三个参数的含义:
* 1、目标类的类加载器
* 2、目标类所有实现的接口
* 3、拦截器/
IUsersService userService = (IUsersService) Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(), proxyObject);
userService.saveUsers();
userService.delete();
Cglib代理
是通过字节码创建子类的方式,并在子类中采用方法拦截拦截父类所有的方法,进行切入。CGLIB可以代理没有接口的类。
优点:
可以代理类和接口,在执行效率比较高
缺点:
虽说在代理执行上效率比较高,但是在创建对象上,要使用字节码来进行创建对象,耗时会比JDK久很多。对于final修饰的方法是无法进行代理的。
操作:
代理类:
public class BookFacadeCglib implements MethodInterceptor {
private Object target;
//业务类对象,供代理方法中进行真正的业务方法调用
//有参构造方法
private MyTransatation transaction;
public BookFacadeCglib(Object target, MyTransatation transaction) {
this.target = target;
this.transaction = transaction;
}
//相当于JDK动态代理中的绑定
public Object getInstance(Object target) {
this.target = target; //给业务对象赋值
Enhancer enhancer = new Enhancer(); //创建加强器,用来创建动态代理类
//为加强器指定要代理的业务类(即:为下面生成的代理类指定父类)
enhancer.setSuperclass(this.target.getClass());
//设置回调:对于代理类上所有方法的调用,都会调用CallBack,而Callback则需要实现
// intercept();//方法进行拦
enhancer.setCallback(this);
// 创建动态代理类对象并返回
return enhancer.create();
}
// 实现回调方法
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
this.transaction.before();
proxy.invokeSuper(obj, args); //调用业务类(父类中)的方法
this.transaction.after();
return null;
}
}
测试类
UsersServiceImpl usi=new UsersServiceImpl();
MyTransatation mt =new MyTransatation();
BookFacadeCglib cglib=new BookFacadeCglib(usi,mt);
UsersServiceImpl usersService=(UsersServiceImpl)cglib.getInstance(usi);
usersService.saveUsers();
usersService.delete ();