首页 > 其他分享 >为什么@Bean还要标注initMetod

为什么@Bean还要标注initMetod

时间:2024-02-20 20:22:37浏览次数:13  
标签:初始化 bean initMetod init Bean User 标注 属性

当使用@Bean注解声明一个方法返回一个bean对象时,有时候我们会遇到需要在bean对象创建后执行一些初始化逻辑的情况。
在这种情况下,我们可以使用initMethod属性来指定一个初始化方法。
虽然在@Bean方法中直接调用初始化逻辑也是可行的,但为什么还要标注initMethod呢?

代码清晰性和可维护性
将初始化逻辑提取到独立的初始化方法中可以使得配置类更加清晰和易于理解。
通过使用initMethod属性,我们可以将初始化逻辑从@Bean方法中分离出来,使得代码结构更加清晰,易于维护和理解。

@Configuration
public class AppConfig {

    @Bean(initMethod = "init")
    public UserService userService() {
        return new UserService();
    }
}

在这个示例中,UserService类中定义了一个名为init的初始化方法:

public class UserService {
    
    public void init() {
        // 执行一些初始化逻辑
        System.out.println("UserService initialized");
    }
}

当使用@Bean注解声明一个方法返回一个bean对象时,可以使用initMethod属性来指定一个初始化方法,以确保在bean属性设置完成后执行自定义的初始化操作。下面是一个示例,演示了如何使用initMethod属性来提高bean的可用性和性能。

假设我们有一个User类,它需要在初始化时进行一些数据缓存的操作:

public class User {
    private String name;

    public void init() {
        // 模拟数据缓存操作
        System.out.println("Caching user data: " + name);
    }

    // 省略getter和setter方法
}

然后我们在Spring的配置类中使用@Bean注解创建User对象,并通过initMethod属性指定初始化方法:

@Configuration
public class AppConfig {

    @Bean(initMethod = "init")
    public User user() {
        User user = new User();
        user.setName("John");
        return user;
    }
}

在这个示例中,我们使用了initMethod = "init"来指定了User类中的init方法作为初始化方法。当Spring容器创建User对象时,会在属性设置完成后调用init方法,执行数据缓存的操作。

通过这种方式,我们可以确保在bean属性设置完成后执行自定义的初始化操作,提高了bean的可用性和性能。这样可以避免在每次使用bean时都进行重复的计算或数据获取,同时也确保了bean对象在后续的使用中更加可靠和高效。

当直接在@Bean对应的方法中调用新创建的对象的特定方法时,无法保证这些操作是在bean属性设置完成后执行的。这可能导致一些意想不到的问题,比如属性值为空、属性值不符合要求、属性值被覆盖等。
假设我们有一个User类,它有一个名为init的初始化方法:

public class User {
    private String name;

    public void init() {
        System.out.println("Initializing user: " + name);
    }

    // 省略getter和setter方法
}

然后我们在Spring的配置类中使用@Bean注解创建User对象,并在@Bean方法中调用init方法:

@Configuration
public class AppConfig {

    @Bean
    public User user() {
        User user = new User();
        user.setName("John");
        user.init(); // 在@Bean方法中直接调用初始化方法
        return user;
    }
}

在这个例子中,我们在user()方法中直接调用了user.init()来执行初始化逻辑。然而,这样的做法存在一些潜在问题:
1.属性值为空:在调用init方法之前,可能无法保证name属性已经被正确设置。
2.属性值被覆盖:如果在init方法中对属性进行了修改,可能会覆盖在@Bean方法中设置的属性值。

总结:
@Bean注解的initMethod属性的作用是可以让你在bean属性设置完成后,执行一些自定义的初始化操作,比如检查属性的合法性,设置默认值,缓存一些数据等。这样可以提高bean的可用性和性能。
而如果直接在@Bean对应的方法中调用new出来的对象的指定方法,那么就不能保证这些操作是在bean属性设置完成后执行的,也就是说,可能会遇到一些意向不到的问题,比如属性值为空,属性值不符合要求,属性值被覆盖等。
所以为了避免这些问题,建议使用initMethod属性来制定初始化方法,这样可以让代码更加清晰和安全

标签:初始化,bean,initMetod,init,Bean,User,标注,属性
From: https://www.cnblogs.com/zhao-zong-yu-hai/p/18023974

相关文章

  • jmeter_BeanShell脚本&通过BeanShell进行加解密方法
    BeanShell脚本BeanShell简介:BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法;BeanShell是一种松散类型的脚本语言;BeanShell是用Java写成的,一个小型的、免费的、可以下载、嵌入式的Java源代码解释器,具有对象脚本的特性;BeanShell可以执行标准J......
  • Spring注册Bean系列--方法5:@Import+ImportBeanDefinitionRegistrar
    原文网址:​​Spring注册Bean系列--方法5:@Import+ImportBeanDefinitionRegistrar_IT利刃出鞘的博客-CSDN博客​​简介本文介绍Spring注册Bean的方法:@Import+ImportBeanDefinitionRegistrar。注册Bean的方法我写了一个系列,见:​​Spring注册Bean(提供Bean)系列--方法大全_IT利刃出......
  • 通过ApplicationContext.getBean()获取bean实例
    spring获取bean容器管理的实例常用方式有两种。    1.  使用注解注入,@Autowired和@Resource@Autowired推荐使用构造函数的方式注入,可被@RequiredArgsConstructor代替@Resource在接口的实现类有多个的时候使用,指定name=实现类名来注入指定的实现类,但@Autowired+@Qualififier......
  • org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named '
    开发遇到一个问题:org.springframework.beans.factory.NoSuchBeanDefinitionException:Nobeannamed'ckhSynCardNumToMbhkJob'available这个报错可能是因为:1.spring的xml配置文件Bean中的id和getBean的id不一致2.是否是忘记加注解了,3.启动类包扫描路径是否正确经过测试发......
  • 基于BiLSTM-CRF模型的分词、词性标注、信息抽取任务的详解,侧重模型推导细化以及LAC分
    基于BiLSTM-CRF模型的分词、词性标注、信息抽取任务的详解,侧重模型推导细化以及LAC分词实践1.GRU简介GRU(GateRecurrentUnit)门控循环单元,是[循环神经网络](RNN)的变种种,与LSTM类似通过门控单元解决RNN中不能长期记忆和反向传播中的梯度等问题。与LSTM相比,GRU内部的网络架......
  • Spingboot替换掉jar包里面的@Bean
    问题如下图,我们需要替换掉JsoncCfg配置类里面的YCloudObjectMapper这个Bean。这个Bean是在依赖的第三方jar包中的,因为用了@Bean而不是像@Component这种组件扫描添加的,所以不能使用@ComponentScan注解进行排除。现在不能修改jar包里的代码,不能在我们的项目中重新定义那个bean(Be......
  • springboot之ImportBeanDefinitionRegistrar动态注入
    SpringBoot中的使用在SpringBoot内置容器的相关自动配置中有一个ServletWebServerFactoryAutoConfiguration类。该类的部分代码如下:@Configuration(proxyBeanMethods=false)@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE)@ConditionalOnClass(ServletRequest.class)@Con......
  • jmeter 使用 BeanShell PostProcessor 过程中遇到的一些问题记录
    关于jmeter中使用BeanShellPostProcessor遇到的一些问题记录:1、BeanShellPostProcessor的位置BeanShellPostProcessor要放在获取内容对应的线程的同一个层级,如:2、内容:例如:FileWriterfstream=newFileWriter("E:\aaskNodeId.csv");//,如果要建立文件并追加写入数据,需......
  • @bean 和@ component 区别 用法
     @bean里面没有component@Bean 和 @Component 都是 Spring 框架中用于定义和注册 bean 的注解,但它们的使用场景和方式有所不同。@Bean- @Bean 注解用在方法上,通常在配置类(带有 @Configuration 注解的类)中使用。- 它表示通过方法返回的对象应该被注册为 Spring......
  • HanLP — 词性标注
    词性(Part-Of-Speech,POS)指的是单词的语法分类,也称为词类。同一个类别的词语具有相似的语法性质所有词性的集合称为词性标注集。词性的用处当下游应用遇到OOV时,可以通过OOV的词性猜测用法词性也可以直接用于抽取一些信息,比如抽取所有描述特定商品的形容词等词性标注词性标注指......