Java 如何在Springbeans上实施/验证spring范围注释

Java 如何在Springbeans上实施/验证spring范围注释,java,spring,maven,dependency-injection,Java,Spring,Maven,Dependency Injection,我们完全由注释驱动,不使用XML文件进行spring配置 Springbeans的默认作用域是singleton,许多开发人员都忘记了它,最终创建了应该具有不同作用域的bean。各种作用域bean的混合和匹配增加了问题的复杂性 是否有任何maven插件可以检查具有@Component注释的任何类是否也具有@Scope注释,如果缺少,则生成失败。这将迫使开发人员考虑范围和使用模式。如果类似的东西不存在,我可以编写插件或有一个自定义工具,可以检查这一点,并在jenkins构建期间启动。任何sprin

我们完全由注释驱动,不使用XML文件进行spring配置

Springbeans的默认作用域是singleton,许多开发人员都忘记了它,最终创建了应该具有不同作用域的bean。各种作用域bean的混合和匹配增加了问题的复杂性

是否有任何maven插件可以检查具有
@Component
注释的任何类是否也具有
@Scope
注释,如果缺少,则生成失败。这将迫使开发人员考虑范围和使用模式。如果类似的东西不存在,我可以编写插件或有一个自定义工具,可以检查这一点,并在jenkins构建期间启动。任何spring代码都能帮我做到这一点吗


此外,如果Springbean中有
@Autowire
注释,是否有方法验证注入的bean是否具有正确的作用域。如果您将原型范围的bean注入到单例范围的bean中,我将使用这个假设,很可能这不是您想要的。虽然在某些用例中,这可能是开发人员想要的,但在我们的例子中,到目前为止,这主要是开发人员的错误。

您可以使用AspectJ基于切入点声明错误和/或警告的功能

免责声明:我从未使用过Spring,所以我不是那里的专家,只是编一个没有太多演示意义的示例

原型范围为的SpringBean:

package de.scrum\u master.app;
导入org.springframework.context.annotation.Scope;
导入org.springframework.stereotype.Component;
@组成部分
@范围(“原型”)
公共类ScopedBean{}
缺少范围声明的Springbean:

package de.scrum\u master.app;
导入org.springframework.stereotype.Component;
@组成部分
公共类UnscopedBean{}
使用不同类型自动布线的SpringBean:

这个bean使用构造函数和setter方法连接。如果在字段声明中取消注释注释,甚至可以使用其他类型的连接。这没有意义,但我们希望在以后的某个方面引发编译错误

package de.scrum\u master.app;
导入org.springframework.beans.factory.annotation.Autowired;
导入org.springframework.context.annotation.Scope;
导入org.springframework.stereotype.Component;
@组成部分
@范围(“单例”)
公共类BeanWithAutowire{
//@自动连线
私有ScopedBean ScopedBean;
@自动连线
公共BeanWithAutowire(ScopedBean ScopedBean){
this.scopedBean=scopedBean;
}
@自动连线
公共无效setScopedBean(ScopedBean ScopedBean){
this.scopedBean=scopedBean;
}
}
静态注释一致性检查方面:

package de.scrum\u master.aspect;
导入org.springframework.beans.factory.annotation.Autowired;
导入org.springframework.context.annotation.Scope;
导入org.springframework.stereotype.Component;
公共方面BeanNotationChecker{
声明错误:
@注释(组件)和注释(范围):
“未找到范围声明的Spring组件”;
声明错误:
执行(@Autowired*.new(..,@Scope(“prototype”)*,..)&&in(@Scope(“singleton”)*):
“单例bean通过构造函数自动连接到原型容器”;
声明错误:
执行(@Autowired**(..,@Scope(“prototype”)*,..)&&在(@Scope(“singleton”)*)内执行:
“singleton bean通过setter方法自动连接到原型容器中”;
声明错误:
在(@Scope(“singleton”)*)内设置(@Autowired**)和(&S):
“单例bean通过字段分配自动连接到原型容器”;
}
使用AspectJ编译器的Maven POM:


4.0.0
de.scrum-master.stackoverflow
aspectj失败构建
1.0-快照
AspectJ-错误/缺少批注的生成失败
UTF-8
1.7
1.8.4
de.scrum\u master.app.ScopedBean
org.apache.maven.plugins
maven编译器插件
3.1
${java.source-target.version}
${java.source-target.version}
假的
org.codehaus.mojo
aspectj maven插件
1.7
真的
${java.source-target.version}
${java.source-target.version}
忽视
${java.source-target.version}
UTF-8
真的
过程源
编译
测试编译
org.aspectj
aspectjtools
${aspectj.version}
org.apache.maven.plugins
maven编译器插件
org.codehaus.mojo
aspectj maven插件
org.aspectj
aspectjrt
${aspectj.version}
运行时
org.aspectj
aspectjrt
org.springfra
@Bean
@Scope("prototype")
@InjectableInto("singleton")
MyBean getMyBean(){
 //...
}