0

在我使用 Spring 容器的应用程序中,我创建了自己的注解,并且我希望在运行时获取使用我的注解进行注解的类的 Class 对象。为此,我想利用 Spring 容器。

在我的 .xml 配置文件中,我把

<context:component-scan base-package="some.package" >
   <context:include-filter type="annotation" expression="some.package.Question" />
</context:component-scan>

所以用我的 Question 注释注释的类被 Spring 检测到。问题是这些类没有参数构造函数,所以现在我有 2 个选项:

  1. 在这些类中定义无参数构造函数
  2. 在 .xml 中定义 bean 并使用 constructor-arg

但是是否可以用一些注释来注释构造函数参数,所以 Spring 会知道它需要null在创建 bean 期间传递值?

此外,这些 bean 将具有原型范围,并且从应用程序的角度来看,在创建 bean 期间不知道构造函数参数的内容。

编辑:我不得不使用@Value("#{null}")注释构造函数参数

4

2 回答 2

1

我认为您使用无参数构造函数的第一个建议听起来更清晰-原因是,从您的角度来看,即使实例变量具有空值,创建的对象也被认为已正确初始化-这可以通过使用默认构造函数来表示

如果无法更改,您使用 @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;
    }

}
于 2012-08-08T12:26:57.207 回答
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;
    }
于 2012-08-08T12:57:06.350 回答