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)
我有我的javaBeanConfig
和魔术师
以及志愿者
@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 />