注解开发Spring AOP(三)——引入

注解开发Spring AOP(一)

注解开发Spring AOP(二)

Spring AOP通过动态代理技术将各类通知织入约定的流程中。有时候需要引入其他类的方法来得到更好的实现,这就需要引入技术。

在之前的案例中进行功能的增强,在输出Role对象前,对Role对象进行判断是否为空。

(1)目标对象接口和实现类跟之前的一样,代码如下:

package com.ssm.aop.service;

import com.ssm.aop.game.Role;

public interface RoleService {
    public void printRole(Role role);
}

package com.ssm.aop.service.Impl;
 
import com.ssm.aop.game.Role;
import com.ssm.aop.service.RoleService;
import org.springframework.stereotype.Component;
 
@Component
public class RoleServiceImpl implements RoleService {
 
    @Override
    public void printRole(Role role) {
        System.out.println("{id: "+role.getId()+", "
        +"role_name:"+role.getRoleName()+", "
        +"note:"+role.getNote()+"}");
    }
}

(2)验证Role对象是否为空。编写验证接口和实现类

package com.ssm.aop.verifier;

import com.ssm.aop.game.Role;

public interface RoleVerifier {
    public boolean verify(Role role);
}
package com.ssm.aop.verifier.Impl;

import com.ssm.aop.game.Role;
import com.ssm.aop.verifier.RoleVerifier;

public class RoleVerifierImpl implements RoleVerifier {
    @Override
    public boolean verify(Role role) {
        return role != null;
    }
}

(3)通过Spring AOP,声明切面(通知+切点)(以前置通知为例)。并通过@DeclareParents注解引入上述判断role对象是否为空的方法。

package com.ssm.aop.aspect;

import com.ssm.aop.game.Role;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;

@Aspect
public class RoleAspect {
   @DeclareParents(value = "com.ssm.aop.service.Impl.RoleServiceImpl+",defaultImpl = RoleVerifierImpl.class)
    public RoleVerifier roleVerifier;
    
    @Before("execution(* com.ssm.aop.service.Impl.RoleServiceImpl.printRole(..))")
    public void before()
    {
        System.out.println("before...");
       
    }


}

注解@DeclareParents中配置项的作用:

value:表示对一个类进行增强,在该例子中对RoleServiceImpl类进行增强,也就是引入一个新的接口,该例子中就是引入一个判断role是否为空的接口。

defaultImpl:代表其默认的实现类,引入的接口的实现类,这边是RoleVerifierImpl

(3)测试代码:

package com.ssm.aop.main;

import com.ssm.aop.config.AopConfig;
import com.ssm.aop.game.Role;
import com.ssm.aop.service.RoleService;
import com.ssm.aop.verifier.RoleVerifier;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Main {
    public static void main(String[] args) {
        ApplicationContext ctx = new AnnotationConfigApplicationContext(AopConfig.class);
        RoleService roleService = (RoleService) ctx.getBean(RoleService.class);
        RoleVerifier roleVerifier=(RoleVerifier) roleService;
        Role role = new Role();
        role.setId(1L);
        role.setRoleName("role_name_1");
        role.setNote("note_1");
        if(roleVerifier.verify(role))
        {
            roleService.printRole(role);

        }


    }
}

首先使用getBean获取RoleService对象,然后将RoleService对象强制转换为RoleVerifier接口的对象,这样就可以使用verify方法了。

实现原理:Spring AOP将代理对象挂到RoleService和RoleVerifier两个接口下,那么对应的bean就可以进行强制转换,可以在RoleService和RoleVerifier之间相互转换。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值