由于掘金文章存在字数限制,本文拆开了各个章节分开发布,全文可点击以下链接进行阅读:blog.omghaowan.com/archives/sp…
根据上文所述,Metadata配置主要提供于容器读取并指导容器完成对bean的实例化、配置和组装。而在配置Metadata时,我们是可以通过XML和Java的方式完成配置的。
通过XML配置Metadata
通过XML的方式对Metadata进行配置则需要将需要声明的bean配置为<bean/>元素(包含在<beans/>中),如下所示:
<?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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="..." class="...">
<!-- collaborators and configuration for this bean go here -->
</bean>
<bean id="..." class="...">
<!-- collaborators and configuration for this bean go here -->
</bean>
<!-- more bean definitions go here -->
</beans>
下面列出一些常见的XML标签和属性:
| 标签 | 描述 | 更多 | ||||||
| <beans> | <beans>用于包含需要声明的<bean> | - | ||||||
| default-init-method | default-init-method指定当前<beans>下的全部<bean>的默认初始化方法 | - | ||||||
| default-destroy-method | default-destroy-method指定当前<beans>下的全部<bean>的默认销毁方法 | - | ||||||
| default-lazy-init | default-lazy-init指定当前<beans>下的全部<bean>都为lazy-init | - | ||||||
| default-autowire-candidates | default-autowire-candidates指定当前<beans>下的全部<bean>只有匹配其设置的一个/多个模式时才能成为自动装配的候选者 | - | ||||||
| <bean> | <bean>表示要声明的bean | - | ||||||
| id | id属性是一个唯一表示bean的字符串 | - | ||||||
| name | name属性用于指定bean的名字 | - | ||||||
| class | class属性使用全限定类名来指定bean的类型 | - | ||||||
| factory-bean | factory-bean属性用于指定构建bean的实例工厂方法所在bean的名称,不过注意class属性需要设置为空 | - | ||||||
| factory-method | factory-method属性用于指定构建bean的静态/实例工厂方法的名称,如指定实例工厂方法则需要配合factory-bean属性 | - | ||||||
| depends-on | depends-on属性显式指定在初始化当前bean前需要强制初始化一个或多个bean。另外,depends-on属性在基于初始化的顺序上还可以控制了其销毁的顺序。 | - | ||||||
| lazy-init | lazy-init属性用于标识当前bean为延迟初始化,容器会在它第一次被请求时才创建bean实例,而不是在启动时初始化。但是需要注意,当这个lazy-init的bean是单例且作为非lazy-init的bean依赖时,容器还是会在启动时创建它。 | - | ||||||
| autowire | autowire属性用于指定bean为自动装配模式 | - | ||||||
| init-method | init-method属性用于指定bean的初始化方法(无参无返回值的方法) | - | ||||||
| destroy-method | destroy-method属性用于指定bean的销毁方法(无参无返回值的方法) | - | ||||||
| scope | scope属性用于指定bean的作用域 | - | ||||||
| <constructor-arg> | <constructor-arg>标签表示构造器注入所需指定的参数 | - | ||||||
| ref | ref属性用于指定构造参数所引用的bean实例id,如果构造参数没有存在歧义可以仅仅按照参数的顺序进行声明 | - | ||||||
| type | type属性用于指定构造参数的类型,需要配置value或ref属性使用 | - | ||||||
| index | index属性用于指定构造参数的索引,对于解析多个存在歧义的参数可通过index属性来解决 | - | ||||||
| name | name属性用于指定构造参数的名字,对于解析多个存在歧义的参数可通过name属性来解决 | - | ||||||
| value | value属性用于指定构造参数的值(基本类型),一般配合type、index和name属性使用 | - | ||||||
| <property> | <property>标签表示bean属性 | - | ||||||
| ref | ref属性用于指定属性所引用的bean实例id | - | ||||||
| type | type属性用于指定属性的类型,需要配置value或ref属性使用 | - | ||||||
| name | name属性用于指定属性的名字 | - | ||||||
| value | value属性用于指定属性的值(基本类型),一般配合type和name属性使用 | - | ||||||
通过Java配置Metadata
通过Java的方式对Metadata进行配置主要是通过注解声明。如下所示:
@Configuration
public class AppConfig {
@Bean
public MyService myService() {
return new MyServiceImpl();
}
}
下面列出一些常见的Java注解和属性:
| 注解 | 描述 | 更多 |
|---|---|---|
@Configuration | @Configuration是一个类级别注解,它用于标识当前类是bean定义的配置类(容器会扫描@Configuration注解类中声明的bean,并且@Configuration类本身也会作为bean被注册到容器中)。 | 跳转 |
@Component | @Component是一个类级别注解,它用于标识当前类是一个可被容器检测到的bean组件(容器会扫描@Component注解类中声明的bean)。 | 跳转 |
@Controller | @Controller是一个类级别注解,它是由@Component注解衍生出的专用于标识Controller层的注解,本质上还是@Component。 | 跳转 |
@Service | @Service是一个类级别注解,它是由@Component注解衍生出的专用于标识Service层的注解,本质上还是@Component。 | 跳转 |
@Repository | @Repository是一个类级别注解,它是由@Component注解衍生出的专用于标识Repository层的注解,本质上还是@Component。 | 跳转 |
@Bean | @Bean是一个方法级别注解,它用于将当前方法返回的对象声明为bean,即将当前方法返回的对象注册到容器中。需要注意,它需要与@Configuration或@Component联合使用。 | 跳转 |
@Autowired | @Autowired是一个构造器级别、方法级别、参数级别和字段级别的注解,它用于标识当前修饰的元素使用Spring依赖注入机制进行自动装配。 | 跳转 |
@Primary | @Primary是一个类级别和方法级别的注解,它用于标识当前bean作为依赖注入到其他实例时具有更高的优先级(当单值依赖在执行自动装配时,如果存在多个候选者,@Primary注解所修饰候选者具有更高的优先级)。 | 跳转 |
@Scope | @Scope是一个类级别和方法级别的注解,它用于指定当前bean的作用域。需要注意,它仅在具体bean类(@Component组件)或工厂方法(@Bean方法)上有效。 | 跳转 |
@Qualifier | @Qualifier是一个类级别、方法级别、参数级别和字段级别的注解,它用于在自动装配时对候选者进行标识(指定限定符)。 | 跳转 |
@Resource | @Resource为JSR-250规范的注解,可修饰类、方法和字段,主要用于标识需要自动装配的属性。其中,我们可通过name属性指定需注入的bean名称,默认它会使用字段名或Setter方法属性名作为需注入的bean名称。 | 跳转 |
@Value | @Value是一个方法级别、参数级别和字段级别的注解,它用于指定被修饰元素的值表达式。 | 跳转 |
@PostConstruct | @PostConstruct为JSR-250规范的注解,可修饰方法,主要用于标识bean的初始化方法。 | 跳转 |
@PreDestroy | @PreDestroy为JSR-250规范的注解,可修饰方法,主要用于标识bean的销毁方法。 | 跳转 |
@Inject | @Inject为JSR-330规范的注解,可修饰构造器、方法和字段,主要用于标识当前修饰的元素使用Spring依赖注入机制进行自动装配(作用与@Autowired相同)。 | 跳转 |
@Named | @Named为JSR-330规范的注解,可修饰类,主要用于标识当前类是一个可被容器检测到的bean组件,作用与@Component相同。 | 跳转 |
@ManagedBean | @ManagedBean为JSR-250规范的注解,可修饰类,主要用于标识当前类是一个可被容器检测到的bean组件,作用与@Component相同。 | 跳转 |