在我使用Spring容器的应用程序中,我创建了自己的注释,我想在运行时获取使用我的注释注释的类的Class对象。为此我想利用Spring容器。
在我的.xml配置文件中,我把
<context:component-scan base-package="some.package" >
<context:include-filter type="annotation" expression="some.package.Question" />
</context:component-scan>
所以Spring会检测用我的Question注释注释的类。问题是那些类没有参数构造函数,所以现在我有2个选项:
但是可以使用一些注释来注释构造函数参数,因此Spring会知道在创建bean期间需要传递null
值吗?
这些bean也将具有原型范围,从应用程序的角度来看,构造函数参数的内容在创建bean期间是未知的。
编辑:
我必须使用@Value("#{null}")
作为注释构造函数参数
答案 0 :(得分:1)
我认为你使用no-arg构造函数的第一个建议听起来更清晰 - 原因是,从你的角度来看,创建的对象被认为是正确初始化的,即使实例变量具有空值 - 这可以通过默认构造函数
如果无法更改,使用@Value(“#{null}”)的方法也有效,我可以在测试用例中测试:
@MyAnnotation
public class Component1 {
private String message;
@Autowired
public Component1(@Value("#{null}") String message){
this.message = message;
}
public String sayHello(){
return this.message;
}
}
答案 1 :(得分:1)
这可能不是您想要的,但如果您想重新使用Spring的类路径扫描程序并将其包装在您自己的实现中,您可以使用以下内容;
Class annotation = [your class here ];
String offsetPath = [your path here ];
// Scan a classpath for a given annotation class
ClassPathScanningCandidateComponentProvider scanner = new ClassPathScanningCandidateComponentProvider(false);
// MZ: Supply the include filter, to filter on an annotation class
scanner.addIncludeFilter(new AnnotationTypeFilter(annotation));
for (BeanDefinition bd : scanner.findCandidateComponents(offsetPath))
{
String name = bd.getBeanClassName();
try
{
Class classWithAnnotation = Class.forName(name);
}
catch (Exception e)
{
//Logger.fatal("Unable to build sessionfactory, loading of class failed: " + e.getMessage(), e);
return null;
}