静态代理(每个接口写一个代理类)
动态代理(写一个代理类,不管是哪个接口都可以调用,自动生成)(反射调用我们以前存在的代码)
我们运行的时候,先用接口new以前的对象就是impl,
再把他丢进我们的代理类里面,这样我们新增的代码就加上去了
注意:(代理类里面要用构造器实现impl,然后在新增代码里面调用以前存在的代码)
一开始的代码
现在新增一个需求,比如说我们保存用户之前先要打印日志
不能修改以前的代码(可能很多人在用)
这时候我们新建一个代理类,同样实现这个接口,但是在前后加上我们需要的功能,
重点:我们调用的时候还是需要调用原来impl的,只是在他的上下加上我们后面需要的代码
重点:我们创建以前的impl的对象,但是把他丢在我们的代理类里面,运行的时候,我们调用接口,相当于运行的是我们的代理类
构造器(需要构造以前的代码)
代理类(新增的代码+调用以前那个impl的)
参数类型写成UserService(接口),是为了兼容所有实现类。
但你实际传进去的,永远是UserServiceImpl这样的具体对象。
类型是"门框",实际对象是"进门的人"。
重点:我们手写代理类的时候,需要传参,把imp传进去,但是我们一般写接口好一点,写接口传进去,他的子类都能传进去
动态代理:
解决:把手写代理类这件事。交给程序在运行时自动生成