作为我之前关于类加载的问题的后续行动
我很好奇注释如何在流行的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注释如何真正起作用?
答案 0 :(得分:5)
Spring是开源的,所以你不需要弄清楚它是如何工作的,看看里面:
RequestMapping
注释由RequestMappingHandlerMapping
处理,请参阅getMappingForMethod
方法。
自动配对的注释由AutowiredAnnotationBeanPostProcessor
处理,请参阅processInjection
方法。
两者都使用反射来获取注释数据,并在第一种情况下构建处理程序映射信息,或者在第二种情况下填充bean。
答案 1 :(得分:1)
Spring上下文通过一组实现bean后处理器接口的类来理解注释。所以要处理不同类型的注释,我们需要添加不同的注释bean后处理器。
如果在配置xml中添加<context:annotation-config>
,则无需添加任何注释bean后处理器。
后处理器提供了为每个bean初始化执行前处理和后处理的方法。 您可以编写自己的bean后处理器,通过创建实现BeanPostProcessor接口的bean来进行自定义处理。