組件生命周期
認識組件的聲明周期
實驗1
通過@Bean指定組件的生命周期
package com.guigu.spring.ioc.bean;@Data
public class User {private String username;private String password;private Car car;@Autowiredpublic void setCar(Car car) {System.out.println("自動注入: 屬性值" + car);this.car = car;}public User() {System.out.println("User 構造器...");}/*** 組件初始化*/public void initUser() {System.out.println("User組件初始化");}/*** 組件銷毀*/public void destoryUser() {System.out.println("User組件銷毀");}
}
package com.guigu.spring.ioc.config;@Configuration
public class UserConfig {@Bean(initMethod = "initUser", destroyMethod = "destoryUser")public User user() {return new User();}
}
package com.guigu.spring.ioc;/*** 主入口文件*/
@SpringBootApplication
public class Spring01IocApplication {/*** 組件的聲明周期*/public static void main(String[] args) {ConfigurableApplicationContext ioc = SpringApplication.run(Spring01IocApplication.class, args);}}
實驗2
了解 InitializingBean接口 和 DisposableBean接口的 調用時機
package com.guigu.spring.ioc.bean;@Data
public class User implements InitializingBean, DisposableBean {private String username;private String password;private Car car;@Autowiredpublic void setCar(Car car) {System.out.println("setter自動注入: 屬性值" + car);this.car = car;}public User() {System.out.println("User 構造器...");}/*** 組件初始化*/public void initUser() {System.out.println("User組件初始化");}/*** 組件銷毀*/public void destoryUser() {System.out.println("User組件銷毀");}/*** 屬性設置之后調用: set賦值完成了* @throws Exception*/@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("[InitializingBean]接口調用afterPropertiesSet方法");}@Overridepublic void destroy() throws Exception {System.out.println("[DisposableBean]接口調用destroy方法");}
}
實驗3
了解 @PostConstruct 和 @PreDestroy 的執行時機
package com.guigu.spring.ioc.bean;@Data
public class User implements InitializingBean, DisposableBean {private String username;private String password;private Car car;/*** 構造器后置處理鉤子* 構造器之后執行*/@PostConstructpublic void postConstruct() {System.out.println("@PostConstruct....");}/*** 銷毀預處理鉤子*/@PreDestroypublic void preDestroy() {System.out.println("@PreDestroy....");}
}
實驗4
理解后置處理器機制: 前面的周期都是本質都是通知, 處理機制本質是攔截, 可以直接修改bean
package com.guigu.spring.ioc.processor;@Component // 攔截所有Bean的后置處理器
public class MyTestBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {System.out.println("[postProcessBeforeInitialization]: " + beanName);if(bean instanceof User hello) {hello.setUsername("張三測試");System.out.println("User: " + bean);}return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {System.out.println("[postProcessAfterInitialization]: " + beanName);return bean;}
}
單元測試
使用單元測試測試容器
- @SpringBootTest注解用來開啟測試,
- 是測試那個主程序類呢? 根據包進行匹配,
- 所以單元測試類所在的包要和主程序所在的包保持一致
注入組件并查看
package com.guigu.spring.ioc;@SpringBootTest // 測試SpringBoot功能, 測試容器
class Spring01IocApplicationTests {@AutowiredCar car;@Testvoid contextLoads() {System.out.println(car);}}
查看容器的創建
查看單元測試方法的結果