浅谈Java中的AOP面向切面的变成和控制反转IOC
https://blog.csdn.net/hi_kevin/article/details/7325554
https://www.cnblogs.com/zedosu/p/6632260.html
Spring中的AOP之代理模式
springAOP指的是在spring中的AOP,什么是AOP,相对于java中的面向对象(oop),在面向对象中一些公共的行为,像日志记录,权限验证等如果都使用面向对象来做,会在每个业务方法中都写上重复的代码,造成代码的冗余。
而AOP指的是面向切面编程,定义一个切面,用切面去切相应的方法,就可以织入相关的逻辑。
面向切面编程使用代理模式
一、代理模式
代理模式作为23种经典设计模式之一,其比较官方的定义为“为其他对象提供一种代理以控制对这个对象的访问”,简单点说就是,之前A类自己做一件事,在使用代理之后,A类不直接去做,而是由A类的代理类B来去做。代理类其实是在之前类的基础上做了一层封装。java中有静态代理、JDK动态代理、CGLib动态代理的方式。静态代理指的是代理类是在编译期就存在的,相反动态代理则是在程序运行期动态生成的,
二、静态代理
静态代理,简单点来说就是在程序运行之前,代理类和被代理类的关系已经确定。静态代理的实现方式一般有以下几个步骤,首先要定义一个公共的接口,供代理类和被代理类实现,如下
public interface AnimalService {
void eat();
void talk();
}
public class DogServiceImlp implements AnimalService{
@Override
public void eat() {
System.out.println("我爱吃骨头");
}
@Override
public void talk() {
System.out.println("汪----汪----汪-----");
}
}
public class CatServiceImpl implements AnimalService{
@Override
public void eat() {
System.out.println("我爱吃鱼");
}
@Override
public void talk() {
System.out.println("喵---喵---喵---");
}
}
编写代理
public class CatProxy implements AnimalService {
private CatServiceImpl cat = new CatServiceImpl();
@Override
public void eat() {
System.out.println("代理操作,开启事务");
cat.eat();
System.out.println("代理操作,关闭事务");
}
@Override
public void talk() {
System.out.println("代理操作,开启事务");
cat.talk();
System.out.println("代理操作,关闭事务");
}
}
使用代理和不使用代理的调用方式
@Test
public void ttt() {
CatServiceImpl cat = new CatServiceImpl();
cat.eat();
System.out.println("-------------------");
cat.talk();
AnimalService cat2 = new CatProxy();
cat2.eat();
System.out.println("-------------------");
cat2.talk();
}

对比,使用静态代理和不使用静态代理,可以发现使用了代理之后,可以在被代理方法的执行前或后加入别的代码,实现诸如权限及日志的操作。
但,静态代理也存在一定的问题,如果被代理方法很多,就要为每个方法进行代理,增加了代码维护的成本。有没有其他的方式可以减少代码的维护,那就是动态代理。
三、JDK动态代理
JDK提供了动态代理的方式,可以生成代理类,被代理类和接口沿用静态代理中的接口类和接口实现类,接口实现类为被代理类,下面看代理类,
------------------------- A little Progress a day makes you a big success... ----------------------------

浙公网安备 33010602011771号