Xml 自动连线不';不行?

Xml 自动连线不';不行?,xml,spring,autowired,Xml,Spring,Autowired,(JavaSpringWebApp) 我有: public class PersonValidator implements Validator { private PersonDAO d; @Autowired public void setD(PersonDAO d) { this.d = d; } public void validate(Object target, Errors errors) { \\ some logic d.emailAlreadyExists("te

(JavaSpringWebApp)

我有:

public class PersonValidator implements Validator {

private PersonDAO d;

@Autowired
public void setD(PersonDAO d) {
    this.d = d;
}
public void validate(Object target, Errors errors) {
\\ some logic
d.emailAlreadyExists("testMail@test.test"); 
}}
我想我真的了解bean和自动布线-似乎不了解。“d.email..”代码向我抛出空指针异常,它使用PersonDAO d的任何方法都能做到这一点。据我所知,问题是没有注射任何药物

但是,如果我尝试将其注入到使用此验证器的控制器上,则一切正常:

@Controller
@RequestMapping("/person")
public class PersonController
{


private PersonDAO d;

@Autowired
public void setD(PersonDAO d) {
    this.d = d;
}

 // some method with RequestMapping declaration {
    Boolean b = d.emailAlreadyExists(person.getMail());       
logger.info( b.toString());

  // } end some method
虽然上面的代码不是我想要的。 我想将我的DAO注入PersonValidator,因为需要对db执行一些DAO方法检查。这样它就可以按照以下方式工作:

 \\ these lines are in Controller under method
PersonValidator validator = new PersonValidator(); // my  d.emailAlreadyExists("testMail@test.test"); is inside
validator.validate(person, bindingResult); 
PersonDAO是用xml声明的,但PersonValidator不是。我不能将SpringDAOBean注入到简单的java对象中吗?比如PersonValidator,它不是xml格式的


(顺便说一句,组件扫描是可以的-以防万一)

如果您在包含
PersonValidator
的包上进行组件扫描,那么在
PersonValidator
类的顶部添加
@component
注释就足够了:

@Component
public class PersonValidator implements Validator {
根据您的需要,您可能还希望更改singleton默认范围:

@Component
@Scope("prototype")
public class PersonValidator implements Validator {

或者,您可以在SpringXML中声明您的
PersonValidator
。如果你不做这两件事中的一个,Spring甚至不会考虑你的对象,那么就没有什么东西会自动存储。

注入弹簧bean的对象必须通过XML或注释来知道Spring,否则它的生命周期完全独立于Spring。但是它们在代码本身中变得不可见。有时候这不是我想要的。我如何为表单返回的人使用验证器(我不能把那个人也放在xml中,因为它不是单例的性质)l?使用.getBean并显式调用AppContext并不是我想要做的。我不明白你在说什么。我已经按照你的建议声明了,但给了我无法获得连接的异常。(无法获得JDBC连接)但控制器没有发生同样的情况….(控制器可以访问db)DAO与数据源连接良好,我很遗憾这是一个不同的问题,但您的问题是关于NullPointer异常,因为您无法自动连接字段,所以第一个问题现在解决了吗?没有,因为同样的注入也适用于控制器(完美地适用于DB并提取所需的内容)。问题似乎是很难“自动连接已经自动连接另一个bean的autowire bean”,在这种情况下,我试图从控制器自动连接PersonValidator,而这个自动连接的validator必须自动连接DAO,但出现了一些问题。我刚刚找到了解决方案,但若我同时将DAO和PersonValidator注入控制器,那个么很奇怪,注入控制器的PersonValidator的DAO突然开始工作。我很困惑,这个问题还没有解决。我注意到重读代码的一件事是您执行了
\\这些行在控制器中的PersonValidator validator=new PersonValidator()方法下--不要这样做。如果用newspring创建bean,它将不会自动连接(除非是@Configurable,但这是另一回事)。我不知道这个项目到底发生了什么,但在apache服务器重新运行的每一秒,我都会遇到获取jdbc连接的错误-有时有效,有时无效:-\n我想你是对的,我接受你的答案。