准备工作:
- 在 eclipse 或者 IDEA 中,新建一个 maven 项目。在 pom.xml 中添加 spring-context 和 junit 依赖:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.5.RELEASE<ersion>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12<ersion>
<scope>test</scope>
</dependency>
- 顺便补充下,我在实际开发时的顺序一般是:pom.xml(添加相关依赖)–> xxx.properties(配置文件) --> 各个package/class的开发,毕竟现在很提倡约定 > 配置 > 开发!
简单回顾下之前基于各种 beans.xml 的开发形式:
- 新建 Person 实体类:两个属性 + setter/getter + toString
private String name;
private int age;
- 在 src/main/resources 下,右键 new -> 选择 Spring Bean Configuration File(如果找不到的话,在 new -> other 中搜索 spring,如下图所示),新建 beans.xml。
以前就是这种 xml 中进行各种 bean 的注入的,例如实体类,数据源,还会进行事务的管理,AOP的配置等等。这里重点不是这种 xml,因此对其不作过多介绍。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
<bean id="person" class="com.uestc.auto.xiaoxie.bean.Person">
<property name="age" value="23"></property>
<property name="name" value="Karolina"></property>
</bean>
</beans>
- 新建测试类,测试上面那个 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 的层级关系图:
基于 @Configuration 和 @Bean 注解
-
从Spring3.0,@Configuration 注解用于定义配置类,可替换 xml 配置文件。被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会 被AnnotationConfigApplicationContext 或 AnnotationConfigWebApplicationContext 类进行扫描,并用于构建bean的定义,初始化Spring容器。
但是,有人说“在基于注解的 spring 开发中,跟 xml 配置文件对应的就是 @Configuration 标识的配置类”。这句话我觉得说的有点漏洞!!!因为我后面测试了一下,配置类上不加 @Configuration 注解,直接使用 @Bean,“竟然”也是可以成功注入以及获取 bean 的。 其实,这里想探讨的问题是:@Bean 注解是否一定要与 @Configuration 注解一起使用(目前测试的效果是不需要),在后续博客中将会作深入研究!!! -
我们可以新建一个类,名称为: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)
- 编写测试类,测试上面那个 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();
}