Spring06-静态代理
为什么使用代理?
- 可以隐藏目标类的具体实现;
- 在不修改目标类代码的情况下能够对其功能进行增强。
代理分类:代理分为静态代理和动态代理
什么是静态代理?
若代理类在程序运行前就已经存在,那么这种代理方式被成为 静态代理,这种情况下,代理类通常都是我们在Java代码中定义的。 通常情况下, 静态代理中的代理类和目标类会实现同一接口或是派生自相同的父类。
1.静态代理类
- 创建静态代理类和目标类实现相同的接口
package com.caorui.proxy;
import com.caorui.service.SomeService;
//静态代理类,要和目标类实现相同的接口
public class ServiceProxy implements SomeService{
SomeService target;
public ServiceProxy() {
super();
}
public ServiceProxy(SomeService target) {
super();
this.target = target;
}
public SomeService getTarget() {
return target;
}
public void setTarget(SomeService target) {
this.target = target;
}
public String doSome() {
return target.doSome().toUpperCase();
}
}
- 创建目标类
package com.caorui.service;
//主业务接口
public interface SomeService {
String doSome();
}
package com.caorui.service.impl;
import com.caorui.service.SomeService;
//目标类
public class SomeServiceImpl implements SomeService {
public SomeServiceImpl() {
System.out.println("SomeServiceImpl.SomeServiceImpl()");
}
@Override
public String doSome() {
return "SomeServiceImpl.doSome()";
}
}
- 测试类
package com.caorui.test;
import org.junit.Test;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;
import com.caorui.proxy.ServiceProxy;
import com.caorui.service.SomeService;
import com.caorui.service.impl.SomeServiceImpl;
public class SomeTest {
public static void main(String[] args) {
//定义目标对象
SomeService target = new SomeServiceImpl();
//定义目标的代理对象
SomeService proxy = new ServiceProxy(target);
//直接对目标类增强
System.out.println(proxy.doSome());
}
}