首页 文章

Spring @Required和@Mandatory注释

提问于
浏览
2

这是 BeanClass.java

package com.practice.spring;

import org.springframework.beans.factory.annotation.Required;

import com.apress.springrecipes.sequence.Mandatory;

public class BeanClass {

    private int count;
    private String prefix;

    public BeanClass() {
        System.out.println("Default Constructor");
    }

    public BeanClass(int count, String prefix) {
        this.count = count;
        this.prefix = prefix;
        System.out.println(prefix+count);
    }

    @Required
    public void setCount(int count) {
        this.count = count;
    }

    @Mandatory
    public void setPrefix(String prefix) {
        this.prefix = prefix;
    }

    @Override
    public String toString() {
        return prefix+count;
    }

}

这是 beans.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context.xsd">

    <context:annotation-config />

    <bean id="beanClass1"
          class="com.practice.spring.BeanClass">
        <property name="count" value="1" />
        <property name="prefix" value="Bean" />
    </bean>
    <bean id="beanClass2"
          class="com.practice.spring.BeanClass">
        <constructor-arg value="2" />
        <constructor-arg value="Bean" />
    </bean>
    <bean id="beanClass3"
          class="com.practice.spring.BeanClass">
        <constructor-arg>
            <value>3</value>
        </constructor-arg>
        <constructor-arg>
            <value>Bean</value>
        </constructor-arg>
    </bean>
</beans>

这就是我实例化上下文的方式 .

ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");

Problem:

count属性是必需的,前缀是必需的 . 如果你看到 beanClass2 我正在通过构造函数设置属性,并且在 beanClass3 中也是如此

但是当我执行代码时,它会抛出异常 . 令我困惑的重要事情是:

线程“main”中的异常org.springframework.beans.factory.BeanCreationException:在类路径资源[beans.xml]中定义的名称为'beanClass2'的bean创建错误:bean的初始化失败;嵌套异常是org.springframework.beans.factory.BeanInitializationException:bean'beanClass2'需要属性'count'

它打印Default Constructor&Bean2 . 我也在这里粘贴整个堆栈跟踪:

2014年12月9日下午8:47:33 org.springframework.context.support.AbstractApplicationContext prepareRefresh INFO:刷新org.springframework.context.support.ClassPathXmlApplicationContext@1a71e93:启动日期[Tue Dec 09 20:47:33 PKT 2014] ; org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions INFO:从类路径资源加载XML bean定义[beans.xml] 2014年12月9日8:47:33上下文层次结构根据2014年12月9日8:47:33 PM org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons INFO:在org.springframework.beans.factory.support.DefaultListableBeanFactory@4aed64中预实例化单例:定义bean [org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework .context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,beanClass1,beanClass2,beanClass3];工厂层次结构的根默认构造函数Bean2 2014年12月9日8:47:33 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry destroySingletons信息:在org.springframework.beans.factory.support.DefaultListableBeanFactory@4aed64中销毁单例:定义bean [org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,beanClass1,beanClass2,beanClass3];工厂层次结构的根在线程“main”中的异常org.springframework.beans.factory.BeanCreationException:在类路径资源[beans.xml]中定义的名称为'beanClass2'的bean创建错误:bean的初始化失败;嵌套异常是org.springframework.beans.factory.BeanInitializationException:org.springframework上的org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:527)中bean'beanClass2'需要属性'count' . bean.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)位于org.springframework.beans.factory.support.DefaultSingletonBeanRegistry的org.springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject(AbstractBeanFactory.java:291) .getSingleton(DefaultSingletonBeanRegistry.java:222)org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288)org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190) )org.springfram上的org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:563) eg.sptext.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:872)位于org.springframework.context.support.ClassPathXmlApplicationContext的org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:423) . (ClassPathXmlApplicationContext.java :139)atg.springframework.context.support.ClassPathXmlApplicationContext . (ClassPathXmlApplicationContext.java:83)at com.practice.spring.Main.main(Main.java:13)引起:org.springframework.beans.factory.BeanInitializationException :bean'beanClass2'所在的属性'count'是必需的org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor.postProcessPropertyValues(RequiredAnnotationBeanPostProcessor.java:149)位于org.springframework.beans.factory的org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1064) . support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517)... 11更多

1 回答

  • 3

    @Required意味着你使用的是setter注入,而不是构造函数注入 . 这些设计有两个选项 - 不是同时做两个选项 .

    请注意Spring的博客 -

    @ Required允许您指示Spring为您检查所需的依赖项 . 如果你不能使用构造函数注入,或者由于其他原因,你更喜欢setter注入,@ Required是要走的路 .

    Setter Injection vs Constructor Injection .

    最近,

    @ Required将方法(通常是JavaBean setter方法)标记为“required”:即,必须将setter方法配置为使用值依赖注入 .

    RequiredAnnotation

    所以,你将它标记为必须依赖注入 - 而不是注入构造函数 .

相关问题