关于实例化对象时自定义操作方法前后顺序

话不多说,先上代码:

启动类

package com.skyarthur.springboot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

	public static void main(String[] args) {
		SpringApplication.run(Application.class, args);
	}
}

controller类

/*
 * Copyright (C) 2018 Baidu, Inc. All Rights Reserved.
 */
package com.skyarthur.springboot.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.view.json.MappingJackson2JsonView;

import com.google.common.base.Strings;
import com.skyarthur.springboot.controller.bean.Person;

import lombok.extern.slf4j.Slf4j;

@Slf4j
@Controller
@RequestMapping("/data")
public class DemoController {

    @RequestMapping("/demo")
    @ResponseBody
    public String demo(String name) {
        return Strings.isNullOrEmpty(name) ? "demo" : name;
    }

    @RequestMapping("/person")
    @ResponseBody
    public Person getPersonInfo() {
        return new Person("skyarthur", 30);
    }

    @RequestMapping("/model")
    @ResponseBody
    public String getModel() {
        Person person = new Person("skyarthur", 30);
        return "request model method success";
    }

    @RequestMapping("/json")
    @ResponseBody
    public String getJsonView() {
        Person person = new Person("skyarthur", 30);
        return "request json method success";
    }

}

测试对象bean

/*
 * Copyright (C) 2018 Baidu, Inc. All Rights Reserved.
 */
package com.skyarthur.springboot.common.bean;

import javax.annotation.PostConstruct;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.InitializingBean;

@Slf4j
public class InitSequenceBean implements InitializingBean {

    public InitSequenceBean() {
        log.info("InitSequenceBean: construct");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        log.info("InitSequenceBean: afterPropertiesSet");
    }

    @PostConstruct
    public void postConstruct() {
        log.info("InitSequenceBean: postConstruct");
    }

    public void initMethod() {
        log.info("InitSequenceBean: initMethod");
    }
}

炮灰类 —为代码完整性,无意义

/*
 * Copyright (C) 2018 Baidu, Inc. All Rights Reserved.
 */
package com.skyarthur.springboot.controller.bean;

import lombok.AllArgsConstructor;
import lombok.Data;

@Data
@AllArgsConstructor
public class Person {
    private String name;
    private int age;
}

配置类

/*
 * Copyright (C) 2018 Baidu, Inc. All Rights Reserved.
 */
package com.skyarthur.springboot.common.config;

import lombok.extern.slf4j.Slf4j;
import org.jboss.logging.Logger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.skyarthur.springboot.common.bean.InitSequenceBean;

@Slf4j
@Configuration
public class SystemConfig {

    @Bean(initMethod = "initMethod", name = "initSequenceBean")
    public InitSequenceBean initSequenceBean() {
    	log.info("SystemConfig: initSequenceBean");
        return new InitSequenceBean();
    }
}

yml 文件内容空

测试结果

2019-11-22 11:02:33.541  INFO 17016 --- [           main] c.s.s.common.config.SystemConfig         : SystemConfig: initSequenceBean
2019-11-22 11:02:33.541  INFO 17016 --- [           main] c.s.s.common.bean.InitSequenceBean       : InitSequenceBean: construct
2019-11-22 11:02:33.543  INFO 17016 --- [           main] c.s.s.common.bean.InitSequenceBean       : InitSequenceBean: postConstruct
2019-11-22 11:02:33.543  INFO 17016 --- [           main] c.s.s.common.bean.InitSequenceBean       : InitSequenceBean: afterPropertiesSet
2019-11-22 11:02:33.543  INFO 17016 --- [           main] c.s.s.common.bean.InitSequenceBean       : InitSequenceBean: initMethod

结论

construct > @PostConstruct > InitializingBean.afterPropertiesSet > initMethod

拓展
启动中或启动完整后自动调用方法的几种方式

public class DataSourceInitListener  implements ApplicationListener<ContextRefreshedEvent> {
     
    protected static final Logger LOGGER = LoggerFactory.getLogger(DataSourceInitListener.class);
     
    @SuppressWarnings("unchecked")
    @Override
    public void onApplicationEvent(ContextRefreshedEvent ev) {
        //防止重复执行。
        if(ev.getApplicationContext().getParent() == null){
         	//TODO 业务逻辑
        }
    }
 
}
public class DataSourceInitListener  implements CommandLineRunner {
     
    protected static final Logger LOGGER = LoggerFactory.getLogger(DataSourceInitListener.class);
     
    @Override
    public void run(String... args) throws Exception {

    }
 
}
public class DataSourceInitListener  implements ApplicationRunner {
     
    protected static final Logger LOGGER = LoggerFactory.getLogger(DataSourceInitListener.class);
     
    @Override
    public void run(ApplicationArguments args) throws Exception {
        
    }
 
}

以及上面设计的 @PostConstruct , InitializingBean.afterPropertiesSet , initMethod 等方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Python类进行实例的时候,不是按顺序执行每个函数。在类被实例时,会先执行类的构造函数(也称为初始方法,即`__init__`方法),该方法用于初始类的实例,并可以传递参数。构造函数执行完成后,才会执行其他方法。 除了构造函数外,其他方法的执行顺序取决于如何调用它们。当我们在实例一个类后,可以通过实例对象来调用类的其他方法。这些方法的执行顺序是由我们在代码中指定的调用顺序决定的。通常情况下,方法的执行是按照定义顺序进行的。 需要注意的是,类的实例方法之间可以相互调用,也可以在一个方法中调用另一个方法。这些方法的执行顺序仍然符合代码中的调用顺序。此外,我们还可以在类内定义装饰器来控制方法的执行顺序。 总之,Python类进行实例时,不是按顺序执行每个函数,而是在类的构造函数执行完毕后,根据我们在代码中的调用顺序来决定其他方法的执行顺序。 ### 回答2: 在Python中,类的实例过程并不是按顺序执行每个函数。当我们创建一个类的实例时,Python会首先执行类的初始方法__init__()。这个方法通常用于初始实例的属性。接着,其他函数按需求被调用。 实例类时,可以选择是否传递参数给__init__()方法,如果传递了参数,那么这些参数会被传递给__init__()方法,并被用于初始实例的属性。 除了__init__()方法外,类还可以定义其他函数(也称为方法),例如实例方法、静态方法和类方法。这些方法实例类后,通过实例对象或类本身进行调用。它们的执行顺序是根据我们在代码中的调用顺序来决定的,而不是根据定义顺序。 总之,Python类的实例过程包括初始方法和其他定义方法。执行顺序取决于我们在代码中的调用顺序,而不是函数的定义顺序。 ### 回答3: 在Python中,类进行实例时并不是按顺序执行每个函数。实例一个类的过程主要是两个步骤,首先是创建一个实例对象,然后是对这个实例对象进行初始。 在创建实例对象时,Python会先执行类中的`__new__`方法,该方法用于创建并返回一个实例对象。然后,在初始实例对象时,Python会调用`__init__`方法,该方法用于对实例对象的属性进行初始操作。 与其他编程语言不同,Python类中的其他函数(方法)并不会在实例时自动执行,需要通过实例对象来显式调用。通过实例对象调用类中的方法,可以根据需要灵活地执行相应的函数。例如,可以通过实例对象调用类中的其他自定义函数,或者调用内置的特殊方法(如`__str__`、`__repr__`等)来定制实例对象的行为。 总结起来,Python类进行实例时,并不是按顺序执行每个函数,而是先调用`__new__`方法创建实例对象,然后再调用`__init__`方法实例对象进行初始。其他类中的函数需要通过实例对象来显式调用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值