18

动机

作为我之前关于类加载的问题的后续行动

我很好奇注释在流行的 Spring 框架中是如何工作的。

可能的解决方案

据我了解,可能会使用两种机制:

1. 类加载上的字节码注入

Spring 可以使用自己的类加载器来加载所需的类。在运行时,当类被加载并且 Spring 确定它具有一些适当的注释时,它会注入字节码以向类添加额外的属性或行为。

因此,@Controller可能会更改带有注释的控制器以扩展某些控制器基类,并且在使用注释时可能会更改函数以实现路由@RequestMapping

@Controller
public class HelloWorldController {

    @RequestMapping("/helloWorld")
    public String helloWorld(Model model) {
        model.addAttribute("message", "Hello World!");
        return "helloWorld";
    }
}

2. 用于实例化的反射

@Autowired可以由 BeanFactory 在运行时通过反射读取,以处理实例化顺序并实例化配置的属性。

public class Customer 
{
    private Person person;

    @Autowired
    public void setPerson(Person person) {
        this.person = person;
    }
}

问题

Spring 注解如何真正起作用?

4

2 回答 2

11

Spring 是开源的,所以你不需要弄清楚它是如何工作的,看看里面:

  • RequestMapping注释由 处理RequestMappingHandlerMapping,见getMappingForMethod方法。

  • 自动装配注释由 处理AutowiredAnnotationBeanPostProcessor,请参阅processInjection方法。

两者都使用反射来获取注释数据并在第一种情况下构建处理程序映射信息,或者在第二种情况下填充 bean。

于 2013-03-07T12:47:35.033 回答
1

Spring上下文通过实现bean后处理器接口的一组类来理解注释。所以要处理不同类型的注释,我们需要添加不同的注释 bean 后处理器。

如果添加<context:annotation-config>配置 xml,则无需添加任何注释 bean 后处理器。

后处理器提供了对每个 bean 初始化进行预处理和后处理的方法。您可以通过创建一个实现 BeanPostProcessor 接口的 bean 来编写自己的 bean 后处理器来进行自定义处理。

于 2013-03-10T15:33:55.170 回答