Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.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 为什么这个Spring方面没有使用方法参数打印?_Java_Spring_Aop_Aspects - Fatal编程技术网

Java 为什么这个Spring方面没有使用方法参数打印?

Java 为什么这个Spring方面没有使用方法参数打印?,java,spring,aop,aspects,Java,Spring,Aop,Aspects,首先,我要说的是,我面临的问题是从第一个代码块截取思想(字符串思想)方法,而不是打印 我正在运行SpringInAction的教程。有一个魔术师类,该类实现MindReader接口,使用方法拦截思想(字符串思想)和获取思想() 相位被认为是阅读一个志愿者的思想这个志愿者通过方法thinkOfSomething(stringthinks) 我有我的javaBeanConfig和魔术师以及志愿者 @Configuration public class BeanConfig { @Bean

首先,我要说的是,我面临的问题是从第一个代码块截取思想(字符串思想)
方法,而不是打印

我正在运行SpringInAction的教程。有一个
魔术师
类,该类
实现MindReader
接口,使用方法
拦截思想(字符串思想)
获取思想()

相位被认为是阅读一个
志愿者的思想
这个
志愿者通过方法
thinkOfSomething(stringthinks)

我有我的java
BeanConfig
魔术师
以及
志愿者

@Configuration
public class BeanConfig {

    @Bean
    public MindReader magician() {
        return new Magician();
    }

    @Bean
    public Thinker volunteer() {
        return new Volunteer();
    }  
}
我正在尝试运行它,让
魔术师
方法打印
方法中的行
方法

public class App {
    public static void main(String[] args) {
        ApplicationContext context = 
                new ClassPathXmlApplicationContext("spring-idol.xml");

        System.out.println();
        Thinker volunteer = (Thinker)context.getBean("volunteer");
        volunteer.thinkOfSomething("This is what I'm thinking");
    }
}

  • 无EORRS
  • 没有例外
  • 包在
    @切入点(执行(
    魔术师方面)是正确的
  • 我的Spring配置xml中有这两项

    <context:component-scan base-package="com.underdogdevs.myspringaspectj" />
    <aop:aspectj-autoproxy />
    
    
    
问题是来自
魔术师
方面的
没有按应有的方式打印。我在这里遗漏了什么吗?为什么没有打印?我有其他方面方法,不带参数,运行正常。我没有正确传递参数值吗?

试试这个

@Configuration
public class BeanConfig {

    @Bean
    public Magician magician() {
        return new Magician();
    }
...

我不知道它是否出现在Spring的文档中,但很明显,当Spring分析
魔术师()
的返回类型时,当它是
MindReader
时,Spring看不到任何注释。

Evgeniy有一个解决方案,我只想解释一下会发生什么

当您指定

<aop:aspectj-autoproxy />
这是一个
BeanPostProcessor

处理当前应用程序中的所有AspectJ注释方面 任何AspectJ注释类 将自动被识别,并且如果Spring AOP基于代理的模型能够应用它

这个过程的一个步骤包括寻找候选顾问。它通过扫描bean定义和检查bean类型来实现。这发生在创建任何bean之前,因此这个过程只能依赖于声明的内容。这是猜测

使用
声明,通常不会有问题,因为您将在
属性中明确声明bean的类

但是,使用
@Bean
方法,可以指定一个接口。请注意,如果使用工厂方法生成Bean,
@Bean
声明都可能失败

因此,
AnnotationAwareAspectJAutoProxyCreator
查看上下文中的所有bean定义并猜测它们的类型。通过
@bean
声明,它查看方法的返回类型

在您的情况下,返回类型将是
MindReader
,这不是候选类型,因为它没有
@Aspect
注释。因此,不会应用任何建议(没有代理),您也不会看到预期的行为

可能的解决办法:

  • 更改返回类型,从而使Spring明白bean类型是什么
  • 摆脱你的
    @Bean
    定义,用
    @Component
    注释你的
    魔术师
    类,并将其包设置为
    组件扫描
    内德。因为类型显然是注释过的类,Spring将能够分辨出它也用
    @Aspect
    注释过


请注意,还有许多其他的
BeanPostProcessor
实现猜测bean的类型。您必须知道在哪一点(初始化之前或之后)处理发生。

这可能是一个猜测,因为我认为你的方面是正确的;你是否尝试将志愿者和魔术师注释为
@组件
s?或者将切入点放在@Before注释中?!guido我刚刚尝试过,但不起作用。我想这就是这个
的目的,扫描con中的bean文本,没有准确地指定
@Component
,实际上
上下文:Component scan
用于扫描类以搜索@Component注释(和@Service、@Controller、…以及@Configuration,后者用@Component元注释)您能解释一下为什么这样做吗?是否所有方面bean都需要以这种方式声明,使用具体类?谢谢+3;)
@Configuration
public class BeanConfig {

    @Bean
    public Magician magician() {
        return new Magician();
    }
...
<aop:aspectj-autoproxy />