spring-21

几种不同类型的自动代理

  1. BeanNameAutoProxyCreator:此自动代理根据指定的bean名称模式创建代理。您可以配置这种类型的自动代理来拦截特定名称模式的bean,并为其创建代理。例如,您可以配置BeanNameAutoProxyCreator来拦截所有以"Service"结尾的bean,并为它们创建代理。

  2. DefaultAdvisorAutoProxyCreator:此自动代理依赖于Advisor对象的配置。Advisor是一种Spring特定的对象,它包含一个Pointcut和一个Advice。Pointcut定义了要拦截的特定方法,Advice定义了在方法调用前或调用后要执行的操作。DefaultAdvisorAutoProxyCreator使用Advisor对象的配置来创建代理。您可以将Advisor对象与BeanPostProcessor一起使用,以便在bean创建过程中根据配置创建代理。

  3. AnnotationAwareAspectJAutoProxyCreator:此自动代理基于AspectJ注解的配置。AspectJ是一种面向切面编程(AOP)的框架,它允许开发人员通过在代码中添加注解来定义切点和切面。AnnotationAwareAspectJAutoProxyCreator会扫描应用程序中的所有bean,查找带有AspectJ注解的类,并为这些类创建代理。这样,被注解的类的方法就可以在调用时通过代理进行处理。

代理的优势

  1. 松耦合:通过使用代理模式,可以将目标对象与原始调用对象解耦,从而降低系统的耦合度。客户端无需直接访问目标对象,而是通过代理对象间接访问,可以在代理对象中加入附加的逻辑处理。

  2. 隐藏复杂性:代理对象可以隐藏目标对象的复杂性和内部实现细节,使客户端只关注业务逻辑的调用。

  3. 动态代理:Spring框架中的代理模式支持动态代理,即在运行时根据需要动态地创建代理对象。这样可以根据实际需求灵活地代理不同的目标对象,而无需事先编写特定的代理类。

  4. 安全性控制:代理模式可以实现对目标对象的访问控制和权限限制,例如可以在代理对象中加入身份验证、权限验证等逻辑。

  5. 其他横切关注点处理:Spring框架的代理模式还可以用于处理一些横切关注点,如事务管理、日志记录、性能监控等。可以将这些横切关注点的逻辑代码从业务逻辑中分离出来,提高代码的可维护性和可复用性。

实例  

     在Spring中,有几种不同类型的自动代理可供选择,包括基于AspectJ的自动代理、基于JDK动态代理的自动代理和基于CGLIB的自动代理。

下面是每种自动代理的完整代码示例:

  1. 基于AspectJ的自动代理:
@Configuration
@EnableAspectJAutoProxy
public class AppConfig {
    // 配置其他的bean和逻辑
}

@Aspect
@Component
public class LoggingAspect {
    @Before("execution(public * com.example.MyService.*(..))")
    public void logBefore(JoinPoint joinPoint) {
        System.out.println("Before method: " + joinPoint.getSignature().getName());
    }
}

@Service
public class MyService {
    public void doSomething() {
        System.out.println("Doing something...");
    }
}

public class Main {
    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        MyService myService = context.getBean(MyService.class);
        myService.doSomething();
    }
}

  1. 基于JDK动态代理的自动代理:
@Configuration
@EnableAspectJAutoProxy(proxyTargetClass = true)
public class AppConfig {
    // 配置其他的bean和逻辑
}

@Aspect
@Component
public class LoggingAspect {
    @Before("execution(public * com.example.MyService.*(..))")
    public void logBefore(JoinPoint joinPoint) {
        System.out.println("Before method: " + joinPoint.getSignature().getName());
    }
}

@Service
public class MyService {
    public void doSomething() {
        System.out.println("Doing something...");
    }
}

public class Main {
    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        MyService myService = context.getBean(MyService.class);
        myService.doSomething();
    }
}

  1. 基于CGLIB的自动代理:
@Configuration
@EnableAspectJAutoProxy(proxyTargetClass = true)
public class AppConfig {
    // 配置其他的bean和逻辑
}

@Aspect
@Component
public class LoggingAspect {
    @Before("execution(public * com.example.MyService.*(..))")
    public void logBefore(JoinPoint joinPoint) {
        System.out.println("Before method: " + joinPoint.getSignature().getName());
    }
}

@Service
public class MyService {
    public void doSomething() {
        System.out.println("Doing something...");
    }
}

public class Main {
    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        MyService myService = context.getBean(MyService.class);
        myService.doSomething();
    }
}

总结

   Spring代理是Spring框架提供的一种面向切面编程(AOP)的机制。通过代理,可以在目标对象的方法执行之前、之后或者异常抛出时插入额外的逻辑,以实现横切关注点的分离。

Spring代理主要有两种方式:JDK动态代理和CGLIB动态代理。

JDK动态代理是基于接口的代理形式,它通过反射机制动态地生成一个实现目标接口的代理类。JDK动态代理要求目标对象必须实现一个或多个接口,代理类实现这些接口,并将目标对象的方法委托给目标对象执行。JDK动态代理的优点是效率较高,缺点是只能对接口进行代理。

CGLIB动态代理是基于类的代理形式,它通过继承目标类、重写其中的方法并添加增强逻辑的方式实现代理。CGLIB动态代理不要求目标对象实现接口,代理类继承目标类,并将目标对象的方法委托给目标对象执行。CGLIB动态代理的优点是可以代理没有实现接口的类,缺点是效率相对较低。

Spring代理可以通过配置文件或者注解的方式进行配置。在配置文件中,可以通过<aop:config>元素配置代理方式、目标对象和切面逻辑等信息。在注解中,可以使用@Aspect注解标注切面类,并使用@Before@After@Around等注解标注增强方法。

    

  • 20
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值