【问题标题】:In spring boot config class, why should I use Bean annotation and set the method 'public'?在 spring boot config 类中,为什么要使用 Bean 注解并将方法设置为“public”?
【发布时间】:2018-12-20 13:22:00
【问题描述】:

我正在学习Spring boot + oauth2 + JWT,在AuthorizationServerConfig.class(或其他一些配置类)中,我注意到在许多示例中,他们使用@Bean注解来装饰一些方法,并将方法设置为'民众'。例如:

@Configuration
@EnableAuthorizationServer
@Slf4j
public class AuthorizationServerConfig extends 
AuthorizationServerConfigurerAdapter {
....
....
    @Bean
    public TokenStore tokenStore() {
        return new JwtTokenStore(this.accessTokenConverter());
    }
....
}

如果我删除 Bean 注释并将方法设为私有,我的应用程序仍然可以工作。所以我的问题是,为什么我们需要 Bean 注解并公开方法?

【问题讨论】:

  • Bean 使方法的结果成为 Spring 托管 bean,没有它就不会。它可能看起来有效,但最终你会遇到奇怪的问题(因为你可能没有得到你认为你得到的东西或多个实例等)。
  • 谢谢你们的回答!后来我在ResourceServerConfig中发现,这个例子重用了TokenStore。为了将它们注入 ResourceServerConfig.class,我们必须将其公开并使用 @Bean。

标签: java spring spring-boot configuration annotations


【解决方案1】:

在 Spring 中,@Bean 注释是一种向 IOC 上下文公开特定对象实例的方式(我认为是最简单的方式)。这意味着您可以使用 @Autowired 注释 (old but good documentation) 在任何其他 bean 中“取回”此实例

Spring Boot 是一种“spring autoconfigurator”,它将通过为您的应用程序提供通用设置所需的所有 Bean 来自动配置 spring 上下文。 Spring Boot 提供了通过 java 类和属性文件自定义环境的能力。 在您的情况下,您正在通过一个 java 类(使用 @Configuration 注释的类)自定义 spring 上下文,在该类中,您使用自己的实例覆盖默认的 spring TokenStore bean,在这种情况下,它可能是语义上等于提供的实例Spring Boot 这就是为什么如果您删除 @Bean 注释或将“private”关键字放在应用程序正在运行的方法中,因为相同的 bean 会通过 spring boot 自动注入到 spring 上下文中(我假设有一个类通过@Autowire 使用您的 TokenStore)。

我希望这个小小的(并且非常简单的)解释可以帮助您了解 Spring Boot 的工作原理:)

【讨论】:

    【解决方案2】:

    如果您删除 Bean 和您的类的公共方法,它将在 Spring 上下文中不可用,例如,您将无法(获取 null 值)在 Spring 类中自动连接它

    @Autowired
    TokenStore tokenStore
    

    【讨论】:

    • 您不会得到null,您的应用程序甚至无法启动,因为需要@Autowired 依赖项。
    猜你喜欢
    • 2017-01-07
    • 1970-01-01
    • 2015-11-11
    • 1970-01-01
    • 2014-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多