Spring 与组件注入相关的注解之 @Configuration 和 @Bean

准备工作:
  1. 在 eclipse 或者 IDEA 中,新建一个 maven 项目。在 pom.xml 中添加 spring-context 和 junit 依赖:
	
 			org.springframework
		spring-context
		5.1.5.RELEASE
	
	
	
		junit
		junit
		4.12
		test
	
  1. 顺便补充下,我在实际开发时的顺序一般是:pom.xml(添加相关依赖)–> xxx.properties(配置文件) --> 各个package/class的开发,毕竟现在很提倡约定 > 配置 > 开发!
简单回顾下之前基于各种 beans.xml 的开发形式:
  1. 新建 Person 实体类:两个属性 + setter/getter + toString
	private String name;
	private int age;
  1. 在 src/main/resources 下,右键 new -> 选择 Spring Bean Configuration File(如果找不到的话,在 new -> other 中搜索 spring,如下图所示),新建 beans.xml。
    Spring 与组件注入相关的注解之 @Configuration 和 @Bean_第1张图片
    以前就是这种 xml 中进行各种 bean 的注入的,例如实体类,数据源,还会进行事务的管理,AOP的配置等等。这里重点不是这种 xml,因此对其不作过多介绍。
	
	
		
		
			
			
		
	
  1. 新建测试类,测试上面那个 id 为 person 的 bean 的获取:
	@Test
	public void test1(){
		// spring 上下文: ApplicationContext,这个用的是 ApplicationContext 的子类
		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:/beans.xml");
		// 通过 id 来获取 bean
		Person person = (Person) context.getBean(“person");
		System.out.println(person);
		context.close();
	}

下图所示为 ApplicationContext 的层级关系图:
Spring 与组件注入相关的注解之 @Configuration 和 @Bean_第2张图片

基于 @Configuration 和 @Bean 注解
  1. 从Spring3.0,@Configuration 注解用于定义配置类,可替换 xml 配置文件。被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会 被AnnotationConfigApplicationContext 或 AnnotationConfigWebApplicationContext 类进行扫描,并用于构建bean的定义,初始化Spring容器。
    但是,有人说“在基于注解的 spring 开发中,跟 xml 配置文件对应的就是 @Configuration 标识的配置类”。这句话我觉得说的有点漏洞!!!因为我后面测试了一下,配置类上不加 @Configuration 注解,直接使用 @Bean,“竟然”也是可以成功注入以及获取 bean 的。 其实,这里想探讨的问题是:@Bean 注解是否一定要与 @Configuration 注解一起使用(目前测试的效果是不需要),在后续博客中将会作深入研究!!!

  2. 我们可以新建一个类,名称为:SpringConfig1.java,并定义一个用 @Bean 注解修饰的方法:方法的返回值就是要注入容器中的组件的类型,方法名就是要注入到容器中的组件的 id。

@Configuration // 通过这个注解标识这是一个Spring配置类
public class SpringConfig1{

	/*
	 * 定义一个方法,通过@Bean注解向Spring IOC容器注入一个组件:
	 * 	   组件的类型就是方法返回值的类型;
	 * 	   组件的id默认为方法名,可以通过@Bean的value属性修改id,如@Bean(value="person11") 
	 */
	@Bean(value="person11") 
	public Person person(){
		return new Person("kristina", 24);
	}
}

(上面这段代码的作用就等价于 beans.xml)

  1. 编写测试类,测试上面那个 id 为 person11 的 bean 的获取:
@Test
   public void testAnnotation(){
   	// 1.通过配置文件的形式
//		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:/beans.xml");
//		Person person = context.getBean(Person.class);
//		System.out.println(person);
   	
   	// 2.通过配置类的形式(就是上面的 SpringConfig1)
   	AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig1.class);
   	Person person = context.getBean(Person.class);
   	System.out.println(person);
   	
   	// 还可以获取容器中所有bean的id,等等
   	String[] names = context.getBeanDefinitionNames();
   	for (String name : names) {
   		System.out.println(name);
   	}
   	
   	context.close();
   }

你可能感兴趣的:(java,spring,注解)