Spring注释如何工作?

ipa*_*lic 9 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";
    }
}
Run Code Online (Sandbox Code Playgroud)

2.用于实例化的反射

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

public class Customer 
{
    private Person person;

    @Autowired
    public void setPerson(Person person) {
        this.person = person;
    }
}
Run Code Online (Sandbox Code Playgroud)

Spring注释如何真正起作用?

Jos*_*tin 7

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

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

  • 自动装配Autowired注解被处理AutowiredAnnotationBeanPostProcessor,看processInjection方法.

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