当前位置: 首页 > 知识库问答 >
问题:

spring - @Bean不加public修饰会生效吗?为什么?

笪涛
2023-12-03

@Bean不加public修饰会生效吗?为什么

@Bean    RestTemplate restTemplate() {        return new RestTemplate();    }

证明生效或者没生效

共有1个答案

宰父子安
2023-12-03

通常模式

Spring 对 @Bean注解的要求是必须是可重写,所以public,protected,package这几种修饰都是可以的。

简单验证:

import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.web.client.RestTemplate;@Configurationpublic class Config {    @Bean    RestTemplate restTemplate() {        return new RestTemplate();    }}
import org.springframework.web.client.RestTemplate;public class MyService {    RestTemplate restTemplate;    public MyService(RestTemplate restTemplate) {        this.restTemplate = restTemplate;    }    public String getHelloWorld() {        return restTemplate.getForObject("http://httpbin.org/ip", String.class);    }}
import org.springframework.context.ApplicationContext;import org.springframework.web.client.RestTemplate;public class Main {    public static void main(String[] args) {        ApplicationContext context = new org.springframework.context.annotation.AnnotationConfigApplicationContext(Config.class);        MyService myService = new MyService(context.getBean(RestTemplate.class)) ;        System.out.println("Hello world from: "+myService.getHelloWorld() );    }}

运行输出:

Hello world from: {  "origin": "114.251.201.2"}

反过来说, private 是不可以的

另外, static 方法也是可以被 @Bean 修饰的。

摘一段源码文档:

Typically, @Bean methods are declared within @Configuration classes. In this case, bean methods may reference other @Bean methods in the same class by calling them directly. This ensures that references between beans are strongly typed and navigable. Such so-called 'inter-bean references' are guaranteed to respect scoping and AOP semantics, just like getBean() lookups would. These are the semantics known from the original 'Spring JavaConfig' project which require CGLIB subclassing of each such configuration class at runtime. As a consequence, @Configuration classes and their factory methods must not be marked as final or private in this mode.

最后一句机翻一下:

这些是原始“Spring JavaConfig”项目中已知的语义,需要在运行时对每个此类配置类进行 CGLIB 子类化。因此,在此模式下,不得将@Configuration类及其工厂方法标记为最终或私有。

所以通常模式 finalprivate 修饰是不可以的。

小模式(Lite Mode)

@Bean 直接定义的 @Component \ @Service 里:

import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.Bean;import org.springframework.stereotype.Component;import org.springframework.web.client.RestTemplate;@Componentpublic class MyService {    @Autowired    RestTemplate restTemplate;    public String getHelloWorld() {        return restTemplate.getForObject("http://httpbin.org/ip", String.class);    }    @Bean    private RestTemplate restTemplate() {        return new RestTemplate();    }}
import org.springframework.context.ApplicationContext;import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class Main {    public static void main(String[] args) {        ApplicationContext context = new AnnotationConfigApplicationContext(MyService.class);        MyService myService = context.getBean(MyService.class);        System.out.println("Hello world from: "+myService.getHelloWorld() );    }}

这种情况下,定义成 private 是可以。

总结

小模式下可以为private, 通常模式下不可以为private, 限制更少的 package 都是可以的

 类似资料:
  • 最近,我正在编写一个类,我决定将其作为包私有(即没有访问修饰符,或默认的)。它有一个内部类和一些帮助器方法,还有一个方法打算由同一个包中的类使用。所有这些类成员都是。但是后来我有了一个想法:这个方法应该有访问修饰符还是没有访问修饰符,就像包含它的类一样? 一方面,由于类本身是package-private的,只能在其包内访问和使用,因此没有实际的理由将方法设为。但同时,从语义上讲,这个方法意在成为

  • https://www.bilibili.com/video/BV1TP411v7v6?p=37&vd_source=87... 这个视频开头,有个配置类里面有@bean方法,这种是导入第三方bean的方式哦。但这里的配置类不是没有import吗,为什么这个@bean能生效哦

  • 我目前正在用Spring componentModel设置一个MapStruct映射器,到目前为止一切都很好,各个子映射器可以按照预期进行自动注入。但是,在加载ApplicationContext时,使用修饰映射器会导致以下失败: 创建名为“Example MapperImpl”的bean时出错:通过构造函数参数0表示不满足的依赖关系;嵌套异常是org.springframework.beans.

  • 本文向大家介绍vue的.sync修饰符可以用表达式吗?为什么?相关面试题,主要包含被问及vue的.sync修饰符可以用表达式吗?为什么?时的应答技巧和注意事项,需要的朋友参考一下 带有 .sync 修饰符的 v-bind 不能和表达式一起使用 (例如 v-bind:title.sync=”doc.title + ‘!’” 是无效的)。取而代之的是,你只能提供你想要绑定的 property 名,类似

  • Java修饰符的合理顺序是什么? null 我把建议的字眼改为合理的字眼,是为了平息有关命令是否建议的讨论。

  • 本文向大家介绍asp.net 修饰符介绍(关于public、private、protected、internal),包括了asp.net 修饰符介绍(关于public、private、protected、internal)的使用技巧和注意事项,需要的朋友参考一下 1.private修饰符 private修饰符用于设置类或类成员的访问权限仅为所属类的内部, private也被称为私有修饰符。某些时候