大家仔细看看,是不是其实和我们定义的class差不多呢,主要都是一些get/set方法。里面的字段呢,下一讲我们详细讲解一下,会结合一些融会贯通的地方。
bean definition接口的实现有哪些然后我们看看这个接口有哪些实现吧?
可以看到,这里有两个是我标红了,因为他们特殊,特殊在他们不属于spring-beans包,而是在spring-context包里。后边遇到了我们再单说,这里存疑。
再来看看这个接口的继承图:
可以获取注解信息的子接口AnnotatedBeanDefinition我们看到,这个接口有一个子接口,是AnnotatedBeanDefinition。这个接口定义如下:
/** * Extended {@link org.springframework.beans.factory.config.BeanDefinition} * interface that exposes {@link org.springframework.core.type.AnnotationMetadata} * about its bean class - without requiring the class to be loaded yet. * 这个接口扩展了BeanDefinition,可以获得bean definition中的bean class上的注解元数据。 * 举个例子,假设我们用@controller标注了某个类,那这里就能获取到@controller这个注解里面的信息 * * @author Juergen Hoeller * @since 2.5 * @see AnnotatedGenericBeanDefinition * @see org.springframework.core.type.AnnotationMetadata */ public interface AnnotatedBeanDefinition extends BeanDefinition { /** * Obtain the annotation metadata (as well as basic class metadata) * for this bean definition's bean class. * @return the annotation metadata object (never {@code null}) */ AnnotationMetadata getMetadata(); }可以想一想有什么用,这个接口能取到bean definition中对应bean class上标注的注解元数据。
比如下面的controller举例:
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Component public @interface Controller { /** * The value may indicate a suggestion for a logical component name, * to be turned into a Spring bean in case of an autodetected component. * @return the suggested component name, if any */ String value() default ""; }那这个AnnotatedBeanDefinition就能取到controller中的value字段的值。
我这里也写了个简单的例子,如下:
@Component("testService") public class HelloWorldService { } @Autowired private ApplicationContext applicationContext; @Override public void run(String... args) { DefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory) applicationContext.getAutowireCapableBeanFactory(); // 获取bean definition,然后获取其注解元数据 AnnotatedBeanDefinition annotatedBeanDefinition = (AnnotatedBeanDefinition) beanFactory.getBeanDefinition("testService"); AnnotationMetadata metadata = annotatedBeanDefinition.getMetadata(); Map<String, Object> annotationAttributes = metadata.getAnnotationAttributes("org.springframework.stereotype.Component"); log.info("annotationAttributes:{}",annotationAttributes); }我这边打印出来就是:
信息: annotationAttributes:{value=testService}
代码在
https://gitee.com/ckl111/spring-boot-first-version-learn/tree/master/all-demo-in-spring-learning/spring-bootstrap-bean-definition-demo
接口下的实现类仔细看了两个接口 AnnotatedBeanDefinition和BeanDefinition,其实实现类都是差不多那几个。