Spring Bean的創建過程


Spring Bean的創建過程

以下代碼是學習Spring的hello world,第一行代碼中的ApplicationContext會管理項目中的bean,本文從Bean的創建過程展開...

    AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
    UserService userService = applicationContext.getBean(UserService.class);

bean的生成過程如下:

推斷構造方法 -> 普通對象 -> 依賴注入(DI)-> 初始化前(@PostConstruct)->  初始化(implements InitializingBean) -> 初始化后(AOP)-> Bean


推斷構造方法

先掃描指定目錄下帶@Component的class, 然后通過推斷構造方法來先生成一個實例

  • 如果該類只有一個構造方法就用該構造方法來生成對象
    example(只有一個無參構造)

    @Component
    public class UserService {
    
        public static final Logger logger = LoggerFactory.getLogger(UserService.class);
    
        @Autowired
        private OrderService orderService;
    
        public UserService() {
            logger.info("UserService construct -- without param ");
        }
    
        public String getUerNameById(int userId) {
            return "simon";
        }
    }
    

    測試類

    public class ApplicationTests {
        public static final Logger logger = LoggerFactory.getLogger(ApplicationTests.class);
    
        public static void main(String[] args) {
            AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
            UserService userService = applicationContext.getBean(UserService.class);
            String uerName = userService.getUerNameById(1);
            logger.info(uerName);
        }
    }
    
    

    從運行結果可知使用無參構造來初始化bean

    example(只有一個有參構造)

    @Component
    public class UserService {
    
        public static final Logger logger = LoggerFactory.getLogger(UserService.class);
    
        @Autowired
        private OrderService orderService;
    
        public UserService() {
            logger.info("UserService construct -- without param ");
        }
    
        public String getUerNameById(int userId) {
            return "simon";
        }
    }
    

    從運行結果可知使用有參構造來初始化bean


  • 如果該類有多個構造方法,使用無參構造方法,沒有無參就報錯

    example(一個無參構造,一個有參)

        public UserService() {
            logger.info("UserService construct -- without param ");
        }
    
        public UserService(OrderService orderService) {
            logger.info("UserService construct -- with orderService");
        }
    

    從運行結果可知使用仍無參構造來初始化的bean

    example(兩個有參,沒有無參)

      public UserService() {
          logger.info("UserService construct -- without param ");
      }
    
      public UserService(OrderService orderService) {
          logger.info("UserService construct -- with orderService");
      }
    

    找不到默認的構造方法,exception:No default constructor found

依賴注入

通過構推斷法得到一個實例后,Spring會判斷該對象中的屬性是否含有@Autowired, 如果有的話就把這些屬性從context中找出來,然后注入到該對象中

初始化前

初始化

初始化后(AOP)得到新的代理對象


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM