当前位置: 首页 > 知识库问答 >
问题:

Spring@required&@强制注释

缑桐
2023-03-14
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;
    }

}
<?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");

问题:

count属性是必需的&前缀是必需的。如果您看到beanClass2,我将通过构造函数设置属性,在beanClass3中也是如此

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

2014年12月9日8:47:33 PM org.springframework.beans.factory.support.defaultsingletonbeanregistry destroySingletons信息:在org.springframework.beans.factory.support.defaultListablebeanFactory@4aed64:定义beans[org.springframework.beans.factory.defaultListablebeanFactory@4aed64:defining Anclass3];线程“main”org.springframework.beans.factory.BeanCreationException中的工厂层次结构异常根目录:创建类路径资源[beans.xml]中定义的名为“BeanClass2”的bean时出错:bean初始化失败;嵌套异常是org.springframework.beans.factory.beanInitializationException:在org.springframework.beans.factory.support.abstractauTawaitaPableBeanFactory.docreateBean(abstractauTauTowireCapableBeanFactory.java:527)在org.springframework.beans.factory.support.abstractauTauTowireCapableBeanFactory.createBean(tory.java:291)在org.springframework.beans.factory.support.defaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)在org.springframework.beans.factory.support.abstractBeanFactory.dogetbean(abstractBeanFactory.java:288)在factory.java:563)位于org.springframework.context.support.AbstractApplicationContext.FinishBeanFactoryInitialization(AbstractApplicationContext.java:872)在org.springframework.context.support.AbstractApplicationContext.Refresh(AbstractApplicationContext.java:423)在org.springframework.context.support.ClasspathXMLApplicationContext.(classpathXMLApplicationContext.(139)在AninitializationException:在org.springframework.beans.factory.annotation.RequiredanNotationBeanPostProcessor.PostProcessPropertyValues(RequiredanNotationBeanPostProcessor.java:149)在org.springframework.beans.factory.support.abstractaUtaItaPableBeanFactory.populateBean(AbstractaUtaIreCableBeanFactory.java:1064)在oCreateBean(AbstractaUtowireCapableBeanFactory.java:517)...11多

共有1个答案

姜磊
2023-03-14

@Required意味着您正在使用setter注入,而不是构造函数注入。它们被设计成两个选项--而不是同时做两个选项。

请注意Spring的博客-

@Required允许您指示Spring为您检查所需的依赖项。如果您不适合使用构造函数注入,或者出于其他原因,您更喜欢setter注入,@Required是应该做的。

@Required将一个方法(通常是JavaBean setter方法)标记为“Required”:也就是说,必须将setter方法配置为使用值注入依赖项。

需求表示法

因此,您将其标记为必须注入依赖项-而不是注入构造函数。

 类似资料:
  • 此外,如果spring bean中有注释,那么是否有一种方法可以验证注入的bean是否具有正确的作用域。我的假设是,如果您将原型作用域bean注入到单例作用域bean中,很可能这不是您想要的。虽然在某些用例中,这是开发人员想要的,但在我们的案例中,到目前为止,这主要是开发人员的错误。

  • 我有一个spring rest服务,它接受Person对象。Person对象具有名称、电话号码和电子邮件。当添加一个人时,电话号码是强制性的。如果存在电话号码属性,它将使用或或验证是否为空。但是如果属性不存在,验证就不起作用。请建议提供任何验证注释,以检查JSON请求中是否存在该属性。 以下是请求体测试用例 {“name”:“anu”,“phonenumber”:“”,“email”:“test@

  • 服务类别: 配置类: 属性文件 我正在尝试读取file upload属性并将其传递给controller类。

  • 问题内容: 是否有一个静态分析工具可以在IDE外部运行一致地强制使用@Override注释?CheckStyle具有MissingOverride检查,但仅适用于使用@inheritDoc Javadoc标记的方法。我正在寻找一种可以在连续集成计算机上的新构建配置中运行的工具。 问题答案: 一种方法是使用TeamCity的“检查”运行器。我不确定它是否真的可以在IDE之外运行,因为它是在Intel

  • @Required注解应用于bean属性的setter方法,它表明影响的bean属性在配置时必须放在XML配置文件中。 十九、请举例说明@Qualifier 注解? 如果在xml中定义了一种类型的多个bean,同时在java注解中又想把其中一个bean对象作为属性,那么此时可以使用@Qualifier加@Autowired来达到这一目的,若不加@Qualifier这个注解,在运行时会出现“ No

  • 问题内容: 我试图 忽略 了注释,并且仍然领域已经嵌入在表中。我找不到任何能说明注解是可选的内容。 是 还是 不是 可选的? 以下代码 生成始终相同的表 即使我 没有 指定。 我的配置: JBoss EAP 6.4.0 hibernate-jpa-2.0-api-1.0.1.Final-redhat-3.jar JPA规范说: http://docs.oracle.com/javaee/7/api