如何在可以在spring上下文之外调用方法的类中使用自动装配

时间:2012-12-26 06:25:29

标签: java spring

将我的网络应用程序转换为Spring。在Spring上下文中启动自动装配是成功的,但在其他情况下失败则应该如此。

我有一个MangaBean,其中有一个名为genre的属性。类型的价值应该是例外类型中的一个。我已经将验证放在bean本身中。像这样:

    @Component
public class MangaBean{
    private String title;
    private String author;
    private String isbn;
    private String genre;

    //getters

    public void setTitle(String title){
        //validations
    }

    public void setGenre(String genre){
        boolean result=MangaUtil.verifyGenre(genre);
        if(result){
            this.genre=genre;
        }else{
            this.genre=null;
        }
    }
}

util调用从表中获取一组类型的方法并验证提供的类型。

@Component
public class MangaUtil{
    @Autowired
    MangaDao mDao;

    public static boolean verifyGenre(String genre){
        List<String> genres=mDao.getGenresList();   //null pointer exception 
            //do validations
    }
}

MangaDao包含一个自动装配的NamedParameterJDBCTemplate,它从数据库中提取类型。

MangaDao代码:

@Repository
public class MangaDao{
    @Autowired
    private NamedParameterJdbcTemplate template;

    public List<String> getGenresList(){
        String query="select genres from manga_table";
        Map<String,String> paramMap=new HashMap<String, String>();
        return template.queryForList(query, paramMap, String.class);
    }
}

在上面的安排中,当我自动装配MangaUtil时,对MangaUtil的调用工作正常。例如:

@Component
public class MangaBean{
    @Autowired
    MangaUtil mangaUtil;
    private String title;
    private String author;
    private String isbn;
    private String genre;

    //getters

    public void setTitle(String title){
        //validations
    }

    public void setGenre(String genre){
        boolean result=mangaUtil.verifyGenre(genre);
        if(result){
            this.genre=genre;
        }else{
            this.genre=null;
        }
    }
} 

但是如果我在bean中使用自动装配,那么在我自己实例化bean MangaBean mb=new MangaBean()的情况下,autowire会失败。请为这种情况提供建议。 我想从bean中调用validator方法而不在bean本身进行任何自动装配。有可能吗?。如果没有,有什么方法可以存储一个类型列表并在bean中使用它来验证我的数据。请指教。

2 个答案:

答案 0 :(得分:1)

默认情况下,自动装配仅适用于Spring托管bean,即Spring创建的bean。使其适用于用例如实例化的bean。 new请参阅Spring文档:

http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/aop.html#aop-atconfigurable

您需要使用@Configurable注释并根据文档配置AspectJ。

答案 1 :(得分:0)

也许不是你问题的真正答案。但我想知道你是如何编译这段代码的:

@Component
public class MangaUtil(){ // <<< parentheses not allowed here
    @Autowired
    MangaDao mDao;

    public static boolean verifyGenre(String genre){
        List<String> genres=mDao.getGenresList();   // <<< you are referencing a non static attribute from a static method
    }
}