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之间相互转换。