Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring 3中@Component和@Configuration之间的差异_Java_Spring_Spring 3 - Fatal编程技术网

Java Spring 3中@Component和@Configuration之间的差异

Java Spring 3中@Component和@Configuration之间的差异,java,spring,spring-3,Java,Spring,Spring 3,我遇到了Spring3提供的两个注释(和) 我对这些有点困惑。 下面是我读到的关于@Component的内容 将这个“context:component”放在bean配置文件中,这意味着, 在Spring中启用自动扫描功能。基本包已显示 您的组件存储在哪里,Spring将扫描此文件夹并 找到bean(用@Component注释)并在中注册它 弹簧容器 所以我想知道@Configuration有什么用,如果@Controller将注册我的bean而不需要在spring配置xml文件中声明它们,那么

我遇到了Spring3提供的两个注释(和) 我对这些有点困惑。
下面是我读到的关于@Component的内容

将这个“context:component”放在bean配置文件中,这意味着, 在Spring中启用自动扫描功能。基本包已显示 您的组件存储在哪里,Spring将扫描此文件夹并 找到bean(用@Component注释)并在中注册它 弹簧容器


所以我想知道@Configuration有什么用,如果@Controller将注册我的bean而不需要在spring配置xml文件中声明它们,那么@Configuration是spring 3中引入的基于Java的配置机制的核心。它提供了基于XML的配置的替代方案

因此,以下两个片段是相同的:

<beans ...>
    <context:component-scan base-package="my.base.package"/>
    ... other configuration ...
</beans>

在这两种情况下,Spring都将在
my.base.package
及以下文件中扫描使用
@Component
注释的类,或使用
@Component
元注释的其他注释之一,例如来自Book Pro Spring Integration的
@Service


@Configuration
类与常规的
@Components
类类似,只是用
@Bean
注释的方法用于工厂Bean。请注意,带有
@Bean
注释方法的
@Component
的工作方式相同,只是不尊重作用域,并且重新调用
@Bean
方法(没有缓存),因此首选
@Configuration
,即使它需要CGLIB

,这里与完整示例不同:-

//@Configuration or @Component
public static class Config {
    @Bean
    public A a() {
        return new A();
    }
    //**please see a() method called inside b() method**
    @Bean
    public B b() {
        return new B(a());
    }
}
1) 在这里,如果用@configuration注释的Config类比a()方法和b()方法都要调用一次

2) 在这里,如果用@component注释Config类,那么b()方法将被调用一次,而a()方法将被调用两次

问题(2):-因为我们已经注意到@component注释的问题。 第二种配置(2)完全不正确,因为spring将创建a的单例bean,但B将获得a的另一个实例,该实例不受spring上下文控制

解决方案:-我们可以在配置类中使用@autowired注释和@component注释

@Component
public static class Config {
    @Autowired
    A a;

    @Bean
    public A a() {
        return new A();
    }

    @Bean
    public B b() {
        return new B(a);
    }
}

虽然这很古老,但详细阐述了JavaBoy和Vijay的答案,并举例说明:

@Configuration
public class JavaConfig {
    @Bean
    public A getA() {
        return new A();
    }
}

@Component
@ComponentScan(basePackages="spring.example")
public class Main() {
    @Bean
    public B getB() {
        return new B();
    }
    @Autowired
    JavaConfig config;

    public static void main(String[]a) {
        Main m = new AnnotationConfigApplicationContext(Main.class)
            .getBean(Main.class);
        /* Different bean returned everytime on calling Main.getB() */
        System.out.println(m.getB());
        System.out.println(m.getB());
        /* Same bean returned everytime on calling JavaConfig.getA() */
        System.out.println(m.config.getA());
        System.out.println(m.config.getA());
    }
}

@Component
是一个通用原型注释,它可以指示任何候选组件,即:<代码>@Repository、@Service、@Controller,这些候选者可以自动检测


当as
@Configuration
用于创建spring框架用于创建应用程序上下文的组件时,内部
@Configuration
使用
@component
,即使是框架本身创建的spring组件也是合理的

“注意A与B相似,只是B的行为与X相似。注意A的行为也与X相似。”太好了。我想在(2)中B会被调用一次,A会被调用两次
@Configuration
public class JavaConfig {
    @Bean
    public A getA() {
        return new A();
    }
}

@Component
@ComponentScan(basePackages="spring.example")
public class Main() {
    @Bean
    public B getB() {
        return new B();
    }
    @Autowired
    JavaConfig config;

    public static void main(String[]a) {
        Main m = new AnnotationConfigApplicationContext(Main.class)
            .getBean(Main.class);
        /* Different bean returned everytime on calling Main.getB() */
        System.out.println(m.getB());
        System.out.println(m.getB());
        /* Same bean returned everytime on calling JavaConfig.getA() */
        System.out.println(m.config.getA());
        System.out.println(m.config.getA());
    }
}