导语
前些天,以为刚接触Spring的朋友,问我她代码中的@Bean("XXX")中的这个“XXX”怎么和bean 的名字怎么不一样,然后我就想着是不是该写一下这类博客。其实说到这里我要说一下她当时写的代码是在一个类中使用了@Configuration注解标注的,然后方法上标注了@Bean注解,此时如果对Spring比较熟悉的应该就知道我所说的是什么了。
是的,她所做的就是再写一个配置类,那么配置类是什么呢?它的前身又是什么呢?其实@Configuration注解在Spring 3.0版本的时候就已经提供功能了。今天这里暂且不说这些Spring的历史,笔者简单的以Spring的XML配置文件和注解的方式来对比一下。在开始之前先放一张图(图片是哪位朋友问问题时的截图)和一段代码(代码是@Configuration注解的简单代码),如下:
/**
* Indicates that a class declares one or more {@link Bean @Bean} methods and
* @author Rod Johnson
* @author Chris Beams
* @author Juergen Hoeller
* @since 3.0
* @see Bean
* @see Profile
* @see Import
* @see ImportResource
* @see ComponentScan
* @see Lazy
* @see PropertySource
* @see AnnotationConfigApplicationContext
* @see ConfigurationClassPostProcessor
* @see org.springframework.core.env.Environment
* @see org.springframework.test.context.ContextConfiguration
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {
@AliasFor(annotation = Component.class)
String value() default "";
........
}
一、XML配置文件的实现方式
在以前的XML配置文件中,我们所实现的方式就是使用<bean/>标签的方式来实现的,不多说直接上代码:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="person" class="com.pat.bean.Person">
<property name="id" value="1"/>
<property name="name" value="不才人"/>
<property name="age" value="26"/>
</bean>
</beans>
public class Person {
private Integer id;
private String name;
private int age;
// 此处省略一万行代码
}
从上面的代码可以看出,在实体类中所定义的属性在XML配置文件中是以<property/>标签来体现的。继续看下测试代码:
public class MainTest {
public static void main(String[] args) {
// 配置文件测试方式
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-bean.xml");
Person person = applicationContext.getBean(Person.class);
System.out.println(person);
}
}
这段代码就是先冲类路径下获取spring-bean.xml配置文件,然后获取Person对象,最后打印,这貌似没什么可说的,那就来说下本次的重点@Configuration注解吧。
二、@Configuration注解
在当前这个Spring Boot横行的时代,@Configuration注解的使用已经是家常便饭的事情了,一些一开始没接触过Spring的朋友,可能对一些注解和使用方式可能一脸懵逼,因为Spring Boot的的基础是Spring,那么就先说下@Configuration注解的前身?不急,先来看下代码:
@Configuration
public class PersonConfig {
@Bean
public Person person(){
return new Person(2, "浪随客", 27);
}
}
这代码是不是和前面一开始的图片中的代码使用很相似?是的,这就是一个demo,我们先看下这里和XML中的是不是感觉又那么一丝丝相似,是的,其实最后都会打印出Person实体对象的信息,也就是说标注了@Configuration注解的类就是一个配置类,也就和XML中的<beans/> 标签的作用是一样的,在这个里面PersonConfig 类中,我们也可以使用多个@Bean注解来标注出多个实体对象。就像<beans/>标签中可以有多个<bean/>标签一样。
其实在上面的XML的方式中所说到的<bean/>标签中的id属性就是用来声明这个对象的名称的,不信可以自己试试(代码路径最后会贴出来),说到这里就要说到配置类中的对象名称是什么了,在@Bean注解没标注任何信息的时候,方法名称就是当前返回对象的名称,如果@Bean("pesron123")是这样写的,那么这里面的“person123”就是类名称了。不信你也可以试试。最后还是特一下这个使用方式的测试方法,代码如下:
public class MainTest {
public static void main(String[] args) {
// // 配置文件测试方式
// ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-bean.xml");
// Person person = applicationContext.getBean(Person.class);
// @Configuration配置类测试方式
AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(PersonConfig.class);
Person person = annotationConfigApplicationContext.getBean(Person.class);
System.out.println(person);
}
}
总结
本次文章,主要说了一下几点:
1.列举了XML配置文件的使用方式和@Configuration注解的使用方式
2.对两者进行了一下对比
3.说了一下@Bean的使用
代码:https://github.com/zfy-zhang/spring-annotation