Spring注释如何工作?

时间:2013-03-07 10:20:36

标签: spring annotations classloader spring-ioc

动机

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

我很好奇注释如何在流行的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。用于实例化的反射

可以通过BeanFactory在运行时反射来读取

@Autowired来处理实例化顺序并实例化配置的属性。

public class Customer 
{
    private Person person;

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

问题

Spring注释如何真正起作用?

2 个答案:

答案 0 :(得分:5)

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

  • RequestMapping注释由RequestMappingHandlerMapping处理,请参阅getMappingForMethod方法。

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

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

答案 1 :(得分:1)

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

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

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