Spring容器 - null参数的注释

时间:2012-08-08 10:12:09

标签: spring dependency-injection

在我使用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个选项:

  1. 在这些类中定义无参数构造函数
  2. 在.xml中定义bean并使用constructor-arg
  3. 但是可以使用一些注释来注释构造函数参数,因此Spring会知道在创建bean期间需要传递null值吗?

    这些bean也将具有原型范围,从应用程序的角度来看,构造函数参数的内容在创建bean期间是未知的。

    编辑: 我必须使用@Value("#{null}")作为注释构造函数参数

2 个答案:

答案 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;
    }