代理模式分爲三種:ide
1.靜態代理測試
靜態代理在使用時,須要定義接口或者父類,被代理對象與代理對象一塊兒實現相同的接口或者是繼承相同父類(代理類實現接口).this
//接口類.net
public interface IUserDao {
void save();代理
}code
//被代理類對象
public class UserDao implements IUserDao{繼承
public void save() {
System.out.println("數據已經保存!");
}事務
}
//代理類
public class UserDaoProxy implements IUserDao{
private IUserDao target;
public UserDaoProxy(IUserDao target){
this.target=target;
}
@Override
public void save() {
System.out.println("開啓事務");
target.save();
System.out.println("提交事務");
}
}
//測試類
public class App {
public static void main(String[] args) {
UserDao target=new UserDao();
UserDaoProxy userDaoProxy=new UserDaoProxy(target);
userDaoProxy.save();
}
}
2.動態代理
1.代理對象,不須要實現接口
2.代理對象的生成,是利用JDK的API,動態的在內存中構建代理對象(須要咱們指定建立代理對象/目標對象實現的接口的類型)
3.動態代理也叫作:JDK代理,接口代理
(建立一個工廠類動態生成代理對象,將織入邏輯織入接口方法)
//接口類
public interface IUserDao {
void save();
}
public class UserDao implements IUserDao {
@Override
public void save() {
System.out.println("數據已經保存!");
}
}
public class App {
public static void main(String[] args) {
//目標對象
IUserDao target =new UserDao();
//給目標對象,建立代理對象
IUserDao proxy= (IUserDao) new ProxyFactory(target).getProxyInstance();
//執行方法
proxy.save();
}
}
總結:代理對象不用實現接口,可是目標對象必定要實現接口
3.Cglib代理
靜態代理和動態代理模式都是要求目標對象是實現一個接口的目標對象,可是有時候目標對象只是一個單獨的對象,並無實現任何的接口,這個時候就能夠使用以目標對象子類的方式類實現代理,這種方法就叫作:Cglib代理
(將代理類視爲被代理類的子類對象)
1.須要引入cglib的jar文件,可是Spring的核心包中已經包括了Cglib功能,因此直接引入pring-core-3.2.5.jar
便可.
2.引入功能包後,就能夠在內存中動態構建子類
3.代理的類不能爲final,不然報錯
4.目標對象的方法若是爲final/static,那麼就不會被攔截,即不會執行目標對象額外的業務方法.
//被代理類
public class UserDao {
public void save(){
System.out.println("已經保存事務");
}
}
//生成代理類
//測試類
public class App {
public static void main(String[] args) {
//目標對象
UserDao target =new UserDao();
//代理對象
UserDao p= (UserDao) new ProxyFactory(target).getProxyInstance();
//執行代理對象的方法
p.save();
}
}
實現了MethodInterceptor接口,會將被代理類的方法進行攔截,而後再織入邏輯織入.