静态代理、动态代理与AOP——Java学习笔记(四)

静态代理、动态代理与AOP——Java学习笔记(四)_第1张图片
【图文无关】

文章目录

  • 代理模式
    • 1、静态代理
    • 2、动态代理
    • 3、使用注解方式动态代理

代理模式

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();
    }
}

静态代理、动态代理与AOP——Java学习笔记(四)_第2张图片

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);

    }
}

静态代理、动态代理与AOP——Java学习笔记(四)_第3张图片

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);

    }
}

你可能感兴趣的:(java,spring,jdk动态代理)