@Configuration
public class WebAppConfig extends WebMvcConfigurerAdapter {
@Bean
AuthorizeInterceptor authorizelInterceptor() {
return new AuthorizeInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(authorizelInterceptor())
.addPathPatterns("/user/**");
super.addInterceptors(registry);
}
}
我是这么理解这段代码的:@Bean
注解的方法里new出来的对象会仍到IOC里,下面调用了上面注解的方法会在IOC里拿出这个Bean。如果这个理解没错的话比较好奇下面的方法调用怎么会变成到IOC里取Bean,试了一下JDK的动态代理中下面这个方法addInterceptors()
调用authorizelInterceptor()
方法,在执行authorizelInterceptor()
这个方法的时候是原模原样执行的不会再走一次代理。当然Jdk不行,Cglib是可以实现这个的。
那么@Bean
它是怎么实现的,这里动态代理到底可不可行?
spring在启动的时候会扫描路径里的有@Service @Component @Controller @RestController标记的类,还有配置文件里<bean>标记的类,然后实例化并将类里面的依赖的组件注入后放入一个容器,在系统运行的时候就去找这些东西,这里@Bean标记和配置文件里<Bean>是一个意思,是告诉spring要初始化这样一个组件并放入容器中。这里是把authorizelInterceptor()方法的返回值放入容器,并命名这个bean为类名(默认)。spring的组件默认是单例的。