代码之家  ›  专栏  ›  技术社区  ›  Pasha

为什么spring忽略了@required?

  •  2
  • Pasha  · 技术社区  · 6 年前

    我已经读过@required uses来确保属性已设置。 但是当我尝试将它与spring注释配置一起使用时,它就不起作用了。

    下面您可以熟悉我的代码库。

    @Configuration
    @ComponentScan
    public class AppConfig {
    
        @Bean(initMethod = "initMethod")
        public SimpleClass simpleClass(){
            return new SimpleClass();
        }
    
    }
    
    public class SimpleClass implements InitializingBean {
    
        private int n;
    
        public SimpleClass() {
            System.out.println("constructor");
        }
    
        public int getN() {
            return n;
        }
    
        @Required
        public void setN(int n) {
            System.out.println("setter");
            this.n = n;
        }
    
        void initMethod(){
    
        }
    
        @Override
        public void afterPropertiesSet() throws Exception {
            System.out.println("afterPropertiesSet()");
        }
    
    }
    
    public class Main {
    
        public static void main(String[] args) {
    
            ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
            SimpleClass simpleClass = context.getBean(SimpleClass.class);
    
        }
    
    }
    

    为什么spring应用程序上下文创建simplelassbean而不抱怨没有通过setter注入呢?

    升级版: 当我尝试使用xml配置和add执行同样的操作时,我收到一个“exception i n thread”main“org.springframework.beans.factory.beancreationeexception:property'n'对于bean'simple'是必需的”

    3 回复  |  直到 6 年前
        1
  •  2
  •   davidxxx    6 年前

    @Required 文件状态(重点是我的):

    将方法(通常是javabean setter方法)标记为 “必需”:即, setter方法必须配置为 用值注入的依赖项。

    使用spring,为了将方法配置为注入的依赖项,必须指定它( @Autowired 是标准的方式)。

    但同时指定两者 @自动连线 @必需的 在今天看来,一种方法很笨拙:

    @Autowired
    @Required
    public void setN(int n) {
        System.out.println("setter");
        this.n = n;
    }
    

    相反,要将setter配置为同时注入依赖项和必需的,我建议只使用 @自动连线 默认情况下是必需的,您可以注意到:

    public @interface Autowired {
    
        /**
         * Declares whether the annotated dependency is required.
         * <p>Defaults to {@code true}.
         */
        boolean required() default true;
    
    }
    

    所以这就足够了:

    @Autowired    
    public void setN(int n) {
        System.out.println("setter");
        this.n = n;
    }
    

    另外,setter注入可能会失败,因为 int n 可能不会解析为依赖项。这个 @Value 参数上的注释可能会帮助您。

        2
  •  2
  •   fg78nc    6 年前

    您需要将它与@autowired(如果插入简单值,则为@value)注释一起使用。

        3
  •  0
  •   M. Deinum    6 年前

    指的是这个 article 以下内容:

    没有 RequiredAnnotationBeanPostProcessor 豆豆,春天不会抱怨。

    所以…添加另一个类型的bean 所需注释BeanPostProcessor (使用 @Autowired )让它抱怨。

    也, @Required 注释将用于bean setter。你想这么做 @必需的 检查基本类型。据我所知,所有springbean(或j2ee bean)都是对象。

    对于基本类型,可以使用 @Value 注射。