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

在这里插入图片描述
【图文无关】

代理模式

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

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值