关于基于注解注册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