• Spring Boot中单例类实现对象的注入方式


    Spring Boot 单例类实现对象的注入

    1、最近接手了一个项目

    项目用的是SpringBoot,但其中有个类用的是单例,为了不改变单例,且还需要引入Spring管理的Bean对象

    2、对于一个单例类按照平时的注解方式添加

    启动时会报空指针异常,因为static类对象是创建对象后,内存中还没有注入Bean信息,且无法初始化Bean实例,这里的解决办法是利用@PostConstruct来对单例类中对象的注入

    @Component
    public class MesssageHandle implements IMessageHandler {
       private final static Logger logger = LoggerFactory.getLogger(MesssageHandle.class);
       private static MesssageHandle instance = new MesssageHandle();
       @Autowired
       private ScheduleService scheduleService;
       private MesssageHandle(){ }
       public static MesssageHandle getInstance() {
          return instance;
       }
     
       @PostConstruct
       public void init(){
          instance = this;
          instance.scheduleService = this.scheduleService;
       }

    spring boot的对象注入

    1、需求

    现在我们的项目中需要引入一个java类库,我想要很方便的使用该类库中的一个类,并且我想要创建这个类的一个单例对象。然后可以很方便的在各个模块中用@AutoWired进行对象注入。

    比如一个配置文件,我在一个地方创建Configuration对象,读取配置文件中的配置,然后在各个模块中使用该对象。

    2、需求分析

    这个需求涉及到两个问题

    一个是单例对象的创建;另外一个是单例对象的引用。因为,你要用一个对象,你首先得创建它。创建一个对象在Spring中有固定的模式,在定义类的时候使用@Component注解,@Component默认是单例的。这样spring framework在进行component scan的时候就会创建这个对象。用的时候很简单,只需要@Autowired就可以了。

    @Autowired最好使用构造器注入,也就是说,不是直接将@Autowired放在成员变量上面,而是放在构建函数上面,然后通过构造函数的参数注入。为何要这么麻烦?

    3、Spring boot是对spring使用的简化

    所以这整个的过程也是Spring boot所具备的能力。

    4、以上分析的是自己创建的类对象注入

    现在如果用这种对象注入来使用成熟的包中的对象呢?

    4.1 使用配置文件生成bean

    <bean class="xxx"></bean>

    4.2 使用@Configuration注解生成bean

    @Configuration
    public class AppConfig {
        @Bean(name = "timedCache")
        public TimedCache<String, Muser> listStrBean() {
            return new TimedCache<String, Muser>(30 * 6000);
        } 
    }

    5 各个常用的注解

    5.1 dao

    @Repository

    5.2 model

    不需要注解

    5.3 restful的controller

    @RestController

    5.4 service

    service接口处不用,在接口的实现类处用@Service

    6 关于@Autowired

    要用到另外一个类的对象时,首先定义一个引用。

    然后在本类的构造函数中给该引用赋值,然后将@Autowired来注解这个构造函数。

    @PostConstruct注解使用

    1.2 注解修饰的方法,不可以具有参数 例如init()

    否则抛错:
    Lifecycle method annotation requires a no-arg method

    https://blog.csdn.net/a232884c/article/details/122683275

  • 相关阅读:
    初探 Linux
    操作系统简介
    1208. 尽可能使字符串相等
    643. 子数组最大平均数 I
    480. 滑动窗口中位数
    Bisect in Python
    HTTP 和 HTTPS 的区别
    URI和URL的区别
    HTTP 1.0和HTTP 1.1的主要区别是什么?
    MySQL游标的使用笔记大全
  • 原文地址:https://www.cnblogs.com/shanheyongmu/p/16733501.html
Copyright © 2020-2023  润新知