Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SpringAOP:代表类型声明其他方法或字段_Java_Spring_Spring Aop - Fatal编程技术网

Java SpringAOP:代表类型声明其他方法或字段

Java SpringAOP:代表类型声明其他方法或字段,java,spring,spring-aop,Java,Spring,Spring Aop,Spring AOP规范中提到: 简介:代表类型声明其他方法或字段。SpringAOP允许您向任何建议的对象引入新接口(以及相应的实现)。例如,您可以使用简介使bean实现IsModified接口,以简化缓存。(介绍在AspectJ社区中称为类型间声明。) 我不知道如何为建议类添加一个新字段,如果您有经验,可以举个例子吗?演示Spring AOP引入的代码导致了一个很长的答案。希望这有帮助 考虑以下接口 和两个实现 UserServiceOneImpl package rg.test.aop.

Spring AOP规范中提到:

简介:代表类型声明其他方法或字段。SpringAOP允许您向任何建议的对象引入新接口(以及相应的实现)。例如,您可以使用简介使bean实现IsModified接口,以简化缓存。(介绍在AspectJ社区中称为类型间声明。)


我不知道如何为建议类添加一个新字段,如果您有经验,可以举个例子吗?

演示Spring AOP引入的代码导致了一个很长的答案。希望这有帮助

考虑以下接口

和两个实现

UserServiceOneImpl

package rg.test.aop.one;

import org.springframework.stereotype.Service;

import rg.test.aop.UserService;

@Service
public class UserServiceOneImpl implements UserService {

    @Override
    public void sayHello() {
        System.out.println("One");
    }

}
和UserServiceTwoImpl

package rg.test.aop.two;

import org.springframework.stereotype.Service;

import rg.test.aop.UserService;

@Service
public class UserServiceTwoImpl implements UserService {

    @Override
    public void sayHello() {
        System.out.println("Two");
    }

}
以及将与AOP一起引入的接口及其实现

package rg.test.aop.intro;

public interface LoginTracker {
    String FIELD = "Field";

    Integer incrementLoginCount();

}
实施

package rg.test.aop.intro;

public class DefaultLoginTracker implements LoginTracker {

    Integer count = 5;

    @Override
    public Integer incrementLoginCount() {
        return ++count;
    }

}
Spring AOP建议在包
rg.test.AOP.two

package rg.test.aop.aspect;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.DeclareParents;
import org.springframework.stereotype.Component;

import rg.test.aop.intro.DefaultLoginTracker;
import rg.test.aop.intro.LoginTracker;

@Aspect
@Component
public class IntroTestAspect {

    @DeclareParents(value="rg.test.aop.two.*+", defaultImpl=DefaultLoginTracker.class)
    LoginTracker tracker;
}
要实现的接口由注释字段的类型决定。(此处
LoginTracker

任何匹配类型的bean都实现
LoginTracker
接口

现在,当您运行以下测试类时

//package and imports

public class IntroductionTest {

    public static void main(String[] args) throws Exception {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(IntroductionConfig.class);

        LoginTracker tracker = ctx.getBean(LoginTracker.class);
        System.out.println(tracker);
        System.out.println("------------------------");
        UserService userOne = (UserService) ctx.getBean("userServiceOneImpl");
        UserService userTwo = (UserService) ctx.getBean("userServiceTwoImpl");

        printDetails(userOne);
        System.out.println("------------------------");
        printDetails(userTwo);

        ctx.registerShutdownHook();

    }

    private static void printDetails(Object obj) throws Exception {
        System.out.println("Is LoginTracker type :"+LoginTracker.class.isAssignableFrom(obj.getClass()));
        System.out.println("Is UserService type :"+UserService.class.isAssignableFrom(obj.getClass()));

        System.out.println("Implemented Interfaces : ");
        for (Class clazz : obj.getClass().getInterfaces()) {
            System.out.println(clazz);
        }

        System.out.println("Methods : ");
        for (Method method : obj.getClass().getMethods()) {
            System.out.println(method);
        }

        System.out.println("Fields : ");
        for (Field field : obj.getClass().getFields()) {
            System.out.println(field);
        }

        // If Advised
        if (Advised.class.isAssignableFrom(obj.getClass())) {
            LoginTracker us = (LoginTracker) obj;
            System.out.println(us.incrementLoginCount());

        }
    }

}
打印以下日志(注意:此处仅复制日志的相关部分,以便于参考。)

日志显示了为UserServiceTwoImpl bean引入的方法和字段

//package and imports

public class IntroductionTest {

    public static void main(String[] args) throws Exception {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(IntroductionConfig.class);

        LoginTracker tracker = ctx.getBean(LoginTracker.class);
        System.out.println(tracker);
        System.out.println("------------------------");
        UserService userOne = (UserService) ctx.getBean("userServiceOneImpl");
        UserService userTwo = (UserService) ctx.getBean("userServiceTwoImpl");

        printDetails(userOne);
        System.out.println("------------------------");
        printDetails(userTwo);

        ctx.registerShutdownHook();

    }

    private static void printDetails(Object obj) throws Exception {
        System.out.println("Is LoginTracker type :"+LoginTracker.class.isAssignableFrom(obj.getClass()));
        System.out.println("Is UserService type :"+UserService.class.isAssignableFrom(obj.getClass()));

        System.out.println("Implemented Interfaces : ");
        for (Class clazz : obj.getClass().getInterfaces()) {
            System.out.println(clazz);
        }

        System.out.println("Methods : ");
        for (Method method : obj.getClass().getMethods()) {
            System.out.println(method);
        }

        System.out.println("Fields : ");
        for (Field field : obj.getClass().getFields()) {
            System.out.println(field);
        }

        // If Advised
        if (Advised.class.isAssignableFrom(obj.getClass())) {
            LoginTracker us = (LoginTracker) obj;
            System.out.println(us.incrementLoginCount());

        }
    }

}
rg.test.aop.two.UserServiceTwoImpl@c15d8b
------------------------
Is LoginTracker type :false
Is UserService type :true
Implemented Interfaces : 
interface rg.test.aop.UserService
Methods : 
public void rg.test.aop.one.UserServiceOneImpl.sayHello()
Fields : 
------------------------
Is LoginTracker type :true
Is UserService type :true
Implemented Interfaces : 
interface rg.test.aop.UserService
interface rg.test.aop.intro.LoginTracker
interface org.springframework.aop.SpringProxy
interface org.springframework.aop.framework.Advised
interface org.springframework.core.DecoratingProxy
Methods : 
public final java.lang.Integer com.sun.proxy.$Proxy19.incrementLoginCount()
public final void com.sun.proxy.$Proxy19.sayHello()
Fields : 
public static final java.lang.String rg.test.aop.intro.LoginTracker.FIELD
Count :6