全方位解析Spring IoC:(三)元数据

225 阅读6分钟

由于掘金文章存在字数限制,本文拆开了各个章节分开发布,全文可点击以下链接进行阅读:blog.omghaowan.com/archives/sp…

根据上文所述,Metadata配置主要提供于容器读取并指导容器完成对bean的实例化、配置和组装。而在配置Metadata时,我们是可以通过XMLJava的方式完成配置的。

通过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@ResourceJSR-250规范的注解,可修饰类、方法和字段,主要用于标识需要自动装配的属性。其中,我们可通过name属性指定需注入的bean名称,默认它会使用字段名或Setter方法属性名作为需注入的bean名称。跳转
@Value@Value是一个方法级别、参数级别和字段级别的注解,它用于指定被修饰元素的值表达式。跳转
@PostConstruct@PostConstructJSR-250规范的注解,可修饰方法,主要用于标识bean的初始化方法。跳转
@PreDestroy@PreDestroyJSR-250规范的注解,可修饰方法,主要用于标识bean的销毁方法。跳转
@Inject@InjectJSR-330规范的注解,可修饰构造器、方法和字段,主要用于标识当前修饰的元素使用Spring依赖注入机制进行自动装配(作用与@Autowired相同)。跳转
@Named@NamedJSR-330规范的注解,可修饰类,主要用于标识当前类是一个可被容器检测到的bean组件,作用与@Component相同。跳转
@ManagedBean@ManagedBeanJSR-250规范的注解,可修饰类,主要用于标识当前类是一个可被容器检测到的bean组件,作用与@Component相同。跳转