spring的@Bean是怎么实现的?

@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它是怎么实现的,这里动态代理到底可不可行?

阅读 3.8k
1 个回答

spring在启动的时候会扫描路径里的有@Service @Component @Controller @RestController标记的类,还有配置文件里<bean>标记的类,然后实例化并将类里面的依赖的组件注入后放入一个容器,在系统运行的时候就去找这些东西,这里@Bean标记和配置文件里<Bean>是一个意思,是告诉spring要初始化这样一个组件并放入容器中。这里是把authorizelInterceptor()方法的返回值放入容器,并命名这个bean为类名(默认)。spring的组件默认是单例的。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题