从Controller注解切入了解spring注解原理

pring容器框架包org.springframework.stereotype下Controller注解接口源代码如下:

@Target({java.lang.annotation.ElementType.TYPE})

@Retention(RetentionPolicy.RUNTIME)

@Documented

@Component

public @interface Controller

{

public abstract String value();

}

@Target({java.lang.annotation.ElementType.Type})表是注解使用在类上;

@Retention(RetentionPolicy.RUNTIME)表示注解在程序运行状态下还有效;

@Component表示该类对象以默认单例模式存放在spring容器框架中;

@Documented无关重要,略;

这个注解在程序运行状态下还有效。再看其他的注解@Respository,@Ser vice等,这两个注解的源代码和Controller的源代码一样,除了接口名,都共有一个value抽象函数。

这些所有的注解都会被component注解接口注解,所有“继承”了component注解接口的注解修饰用户的类会被spring中的注解处理器获取(getAnonations()),判定存在component注解后,注解处理器会在spring容器框架中根据用户类的全限定名通过java的反射机制创建这个用户类的对象,并放到spring容器框架中进行管理。

以上这些描述是我基于对注解系统的理解而描述的。
       bean创建的几个重要步骤:

1) 创建bean实例,也就是bean的实体化,创建过程不仅仅只有java的反射机制,还结合了动态代理的方式

2) 记录创建bean的objectFactory

3) 属性注入

4) 初始化bean

5) 注册disposablebean

Spring bean的生命周期:

说完bean的创建过程,那spring是如何找到这些bean的类文件的呢?

我们在spring的配置文件中,有这样一个标签节点<context:component-scan>,在这个标签的属性base-package中设置要扫描的包。那么可以推断,spring框架中肯定有根据base-package属性扫描得到所有需要管理的bean对象,这个节点中的所有属性会被放入扫描模块对象工具中去,结果就是将所有的bean对象放到spring的容器中去。

注意:spring容器框架额注解都会在running状态下的,所以运行时加载的文件都是已经编译后的class文件.所以使用的是asm技术读取class文件的字节码转化成MetadataReader中的AnnotationMetadataReadingVisitor结构.

标签<context:component-scan>的解析总结如下:

1)根据配置利用asm技术扫描.class文件,并将包含@Component及元注解为@Component的注解@Controller、@Service、@Repository或者还支持Java EE 6的@link javax.annotation.ManagedBean和jsr - 330的 @link javax.inject.Named,如果可用。的bean注册到beanFactory中

2)注册注解后置处理器,主要是处理属性或方法中的注解,包含:

注册@Configuration处理器ConfigurationClassPostProcessor,

注册@Autowired、@Value、@Inject处理器AutowiredAnnotationBeanPostProcessor,

注册@Required处理器RequiredAnnotationBeanPostProcessor、在支持JSR-250条件下注册javax.annotation包下注解处理器CommonAnnotationBeanPostProcessor,包括@PostConstruct、@PreDestroy、@Resource注解等、支持jpa的条件下,注册org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor处理器,处理jpa相关注解注册@EventListener处理器EventListenerMethodProcessor

注解处理器的的实例化和处理器的注册时同步的,实例化后放入到beanFactory的beanProcessors列表中去。

Spring框架的核心就是IOC,通过controller一类注解的bean的实例化过程可以大体总结spring注解的工作原理:

1)利用asm技术扫描class文件,转化成Springbean结构,把符合扫描规则的(主要是是否有相关的注解标注,例如@Component)bean注册到Spring 容器中beanFactory

2)注册处理器,包括注解处理器

4)实例化处理器(包括注解处理器),并将其注册到容器的beanPostProcessors列表中

5)创建bean的过程中,属性注入或者初始化bean时会调用对应的注解处理器进行处理。

举例注解@Autowired 。对于这个注解,您需要在xml中配置这个注解的处理器

AutowiredAnnotationBeanPostProcessor,这个处理器会扫描容器中所有的bean对象,发现bean中拥有@Autowired注解的时候会自动去找到容器中和这个注解修饰类型匹配的bean对象,并注入到对应的地方去。

那为什么AutowiredAnnotationBeanPostProcessor这个处理器对象我怎么在配置文件中没有看到设置呢?    那是因为在spring解析<context:component>标签的时候默认这个注解被隐示配置了,还有其他的注解处理器,如CommonAnnoationBeanPostProcessor。
---------------------

原文:https://blog.csdn.net/jack_wang001/article/details/78781588

原文地址:https://www.cnblogs.com/wjlwo2ni/p/11063807.html

时间: 2024-08-30 09:15:12

从Controller注解切入了解spring注解原理的相关文章

Java面试--Spring技术要点--Spring注解

20  基于Java的Spring注解配置(给一些注解的例子) 基于Java的配置,允许你在少量的Java注解的帮助下,进行你的大部分Spring配置而非通过XML文件. 以@Configuration注解为例,它用来标记类可以当做一个bean的定义,被SpringIOC容器使用.另一个例子是@Bean注解,它表示此方法将要返回一个对象,作为一个bean注册进Spring应用上下文.(一般很少用java代码对元数据进行配置) 21  Spring基于注解的容器配置.和开启配置 相对于XML文件,

Spring注解@Component、@Repository、@Service、@Controller @Resource、@Autowired、@Qualifier 解析

URL:http://www.ulewo.com/user/10001/blog/273 我们在使用spring的时候经常会用到这些注解,那么这些注解到底有什么区别呢.我们先来看代码 同样分三层来看: Action 层: package com.ulewo.ioc; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; @Co

Spring注解@Component、@Repository、@Service、@Controller区别

Spring注解@Component.@Repository.@Service.@Controller区别 Spring 2.5 中除了提供 @Component 注释外,还定义了几个拥有特殊语义的注释,它们分别是:@Repository.@Service 和 @Controller.在目前的 Spring 版本中,这 3 个注释和 @Component 是等效的,但是从注释类的命名上,很容易看出这 3 个注释分别和持久层.业务层和控制层(Web 层)相对应.虽然目前这 3 个注释和 @Comp

Spring 注解@Component,@Service,@Controller,@Repository

Spring 2.5 中除了提供 @Component 注释外,还定义了几个拥有特殊语义的注释,它们分别是:@Repository.@Service 和 @Controller.在目前的 Spring 版本中,这 3 个注释和 @Component 是等效的,但是从注释类的命名上,很容易看出这 3 个注释分别和持久层.业务层和控制层(Web 层)相对应.虽然目前这 3 个注释和 @Component 相比没有什么新意,但 Spring 将在以后的版本中为它们添加特殊的功能.所以,如果 Web 应

Spring注解@Repository、@Service、@Controller、@Component

继前几章所讲解的注解中: http://www.cnblogs.com/EasonJim/p/6892280.html http://www.cnblogs.com/EasonJim/p/6899747.html http://www.cnblogs.com/EasonJim/p/6901115.html 发现上述遗漏了一些注解,比如:@Repository.@Service.@Controller.@Component,现在做如下补充: Spring自2.0版本开始,陆续引入了一些注解用于简化

Spring注解 Component Repository Service Controller区别

Spring 4.1 中除了提供 @Component 注释外,还定义了几个拥有特殊语义的注释,它们分别是:@Repository.@Service 和 @Controller.在目前的 Spring 版本中,这 3 个注释和 @Component 是等效的,但是从注释类的命名上,很容易看出这 3 个注释分别和持久层.业务层和控制层(Web 层)相对应.虽然目前这 3 个注释和 @Component 相比没有什么新意,但 Spring 将在以后的版本中为它们添加特殊的功能.所以,如果 Web 应

Spring注解@Component、@Repository、@Service、@Controller的相关知识

Spring注解@Component.@Repository.@Service.@Controller区别 spring 2.5 中除了提供 @Component 注释外,还定义了几个拥有特殊语义的注释,它们分别是:@Repository.@Service 和 @Controller.在目前的 Spring 版本中,这 3 个注释和 @Component 是等效的,但是从注释类的命名上,很容易看出这 3 个注释分别和持久层.业务层和控制层(Web 层)相对应.虽然目前这 3 个注释和 @Comp

Spring注解:@Repository、@Service、@Controller、@Autowired

Spring的注解形式:@Repository.@Service.@Controller,它们分别对应存储层Bean,业务层Bean,和展示层Bean. 作用 @Repository.@Service.@Controller 和 @Component将类标识为Bean Spring 自 2.0 版本开始,陆续引入了一些注解用于简化 Spring 的开发. @Repository 注解便属于最先引入的一批,它用于将数据访问层 (DAO 层 ) 的类标识为 Spring Bean. 具体只需将该注解

(转载)Spring 注解@Component,@Service,@Controller,@Repository

Spring 2.5 中除了提供 @Component 注释外,还定义了几个拥有特殊语义的注释,它们分别是:@Repository.@Service 和 @Controller.在目前的 Spring 版本中,这 3 个注释和 @Component 是等效的,但是从注释类的命名上,很容易看出这 3 个注释分别和持久层.业务层和控制层(Web 层)相对应.虽然目前这 3 个注释和 @Component 相比没有什么新意,但 Spring 将在以后的版本中为它们添加特殊的功能.所以,如果 Web 应