【图文无关】
代理模式
1、静态代理
/**
* 静态代理举例
*
* 特点:代理类和被代理类在编译期间,就确定下来了。
*/
interface ClothFactory{
void produceCloth();
}
//代理类
class PersonTest implements ClothFactory{
private ClothFactory factory;//用被代理类对象进行实例化
public PersonTest(ClothFactory factory){
this.factory = factory;
}
@Override
public void produceCloth() {
System.out.println("造纸厂开始做一些准备工作");
factory.produceCloth();
System.out.println("造纸厂做一些后续收尾工作");
}
}
//被代理类
class NeckTest implements ClothFactory{
@Override
public void produceCloth() {
System.out.println("造纸厂计划生产一批卫生纸");
}
}
public class StaticProxyTest {
public static void main(String[] args) {
//创建被代理类的对象
ClothFactory word = new NeckTest();
//创建代理类的对象
ClothFactory proxyPaperFactory = new PersonTest(word);
proxyPaperFactory.produceCloth();
}
}
2、动态代理
/**
* 动态代理举例
*/
//被代理类
public class Cloth implements ClothFactory {
@Override
public void produceCloth() {
System.out.println("造衣服");
}
@Override
public String dye(String color) {
return "给衣服染"+color;
}
}
//代理类
public class ProxyFactory {
public static Object getProxyFactory(Object o){
handler handler = new handler();
handler.bind(o);
return Proxy.newProxyInstance(o.getClass().getClassLoader(),o.getClass().getInterfaces(),handler);
}
}
class handler implements InvocationHandler{
private Object object;
public void bind(Object object){
this.object = object;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//增强方法
System.out.println("种棉花");
Object invoke = method.invoke(object, args);
//增强方法
System.out.println("清洗机器");
return invoke;
}
}
//测试类
public class TestProxy {
public static void main(String[] args) {
Cloth cloth = new Cloth();
ClothFactory proxyFactory = (ClothFactory) ProxyFactory.getProxyFactory(cloth);
proxyFactory.produceCloth();
String dye = proxyFactory.dye("蓝色");
System.out.println(dye);
}
}
3、使用注解方式动态代理
//设置类
@Configuration
//开启注解扫描
@ComponentScan(basePackages = {"com.atdragon.boot01.proxytest"})
//开启自动代理,proxyTargetClass = true不写会报错
@EnableAspectJAutoProxy(proxyTargetClass = true)
public class ConfigAop {
}
//被代理类
@Component
public class Cloth implements ClothFactory {
@Override
public void produceCloth() {
System.out.println("造衣服");
}
@Override
public String dye(String color) {
return "给衣服染"+color;
}
}
@Component
@Aspect//代理类,开启代理
public class AnnotationProxy {
//设置切入点
@Pointcut(value = "execution(* com.atdragon.boot01.proxytest.Cloth.dye(..))")
public void pointCut(){}
//增强方法
@Before(value = "pointCut()")
public void brfore(){
System.out.println("种棉花");
}
@After(value = "pointCut()")
public void after(){
System.out.println("清洗机器");
}
}
//测试类
public class TestProxy {
public static void main(String[] args) {
AnnotationConfigApplicationContext context
= new AnnotationConfigApplicationContext(ConfigAop.class);
Cloth cloth = context.getBean("cloth", Cloth.class);
String dye = cloth.dye("红色");
System.out.println(dye);
}
}