Spring @Bean和@Component 区别 XML和JavaConfig配置

关于基于注解注册Bean的几种方式:https://www.jianshu.com/p/bdca18850673

@Component和@Bean都可以注册Bean。

区别在于:

  • @Component放在类上,表示这个类是组件类,Spring要为这个类创建bean。@Component 和@Repository , @ Controller , @Service一样,局限于自己编写的类中.
  • @Bean放在方法上,对应xml中,方法名就是这个bean的id,返回值就是这个bean的class。@Bean注解告诉Spring这个方法将会返回一个对象,这个对象要注册为Spring应用上下文中的bean。通常方法体中包含了最终产生bean实例的逻辑。使用@Bean可以把第三方库中的类实例交给spring管理。

举例说明:

一个简单的User类:

@Component
public class User {
    @Value("1")
    private String name;

    public String getName() {
        return name;
    }
}

一个简单的User2类:

public class User2 {
    @Value("2")
    private String name;


    public String getName() {
        return name;
    }
}

一个简单的User3类

@Component
public class User3 {
    @Bean
    public User2 getUser2()
    {
        return new User2();
    }
}

一个JavaConfig类:

@Configuration
public class config {

    @Bean
    public User getUser()
    {
        return new User();
    }
}

XML中除了component-scan什么都没有。

测试:

  public static void main(String[] args) {
        //如果完全使用了配置类方式去做,我们就只能通过AnnotationConfigApplication上下文来获取容器,通过配置类的class对象加载
      //  AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(config.class);
      //  User user =(User)context.getBean("User");//取的getUser是方法名
       // System.out.println(user.getName());


        ApplicationContext context2=new ClassPathXmlApplicationContext("beans.xml");
        User user2=context2.getBean("user",User.class);
        User2 user21=context2.getBean("getUser2",User2.class);
        System.out.println(user2.getName());
        System.out.println(user21.getName());
    }

User注册了bean,User2没有自己注册,User3注册了bean,并且引入了User2,所以我们也可以获取User2的bean,JavaConfig中,@Configuration就包含了@Component,所以也注册了。

JavaConfig和XML是不同的配置方式,如果没有xml,JavaConfig也很好用,@ComponentScan可以用于代替spring的xml配置文件中的<context:component-scan base-package="com.lane.pojo"/>标签。

如果把注释的部分取消注释,则下面的这段通过xml获取容器会失效,会报找不到user这个bean的错,但是XML和JavaConfig可以混合配置,看:https://www.cnblogs.com/bigdataZJ/p/SpringInAction3.html

发布了71 篇原创文章 · 获赞 17 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/carlylll/article/details/104005581