IoC容器可以自动管理Bean的初始化和销毁方法,用到的就是@PostConstruct(构造后)和@PreDestory(销毁前)注解.
@Service
//@Scope("singleton")//默认单例模式
public class AlphaService {
public AlphaService(){
System.out.println("实例化AlphaService");
}
@PostConstruct
public void init(){
System.out.println("初始化AlphaService");
}
@PreDestroy
public void destory(){
System.out.println("销毁AlphaService");
}
}@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration(classes = CommunityApplication.class)
//这个是为了在test中用main的环境,因为Spring容器的注入有两个条件:
//@SpringBootApplication所在包及其子包内,相应的注解这里就是@Service
public class CommunityApplicationTests implements ApplicationContextAware {
public ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
//上面就是构建IoCr
@Test
public void testManagementBean() {
AlphaService alphaService = applicationContext.getBean(AlphaService.class);
System.out.println(alphaService);
alphaService = applicationContext.getBean(AlphaService.class);
System.out.println(alphaService);
}
}2019-12-22 10:30:10.211 INFO 35996 --- [ main] c.n.community.CommunityApplicationTests : Starting CommunityApplicationTests on wan-HP with PID 35996 (started by wan in E:\牛客高薪项目课\所有素材和源码\第一章素材和源码\源码\community) 2019-12-22 10:30:10.212 INFO 35996 --- [ main] c.n.community.CommunityApplicationTests : No active profile set, falling back to default profiles: default 实例化AlphaService 初始化AlphaSevice 2019-12-22 10:30:11.906 INFO 35996 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' 2019-12-22 10:30:12.094 WARN 35996 --- [ main] ion$DefaultTemplateResolverConfiguration : Cannot find template location: classpath:/templates/ (please add some templates or check your Thymeleaf configuration) 2019-12-22 10:30:12.312 INFO 35996 --- [ main] c.n.community.CommunityApplicationTests : Started CommunityApplicationTests in 2.451 seconds (JVM running for 3.52) com.nowcoder.community.service.AlphaService@de81be1 com.nowcoder.community.service.AlphaService@de81be1 2019-12-22 10:30:12.833 INFO 35996 --- [ Thread-2] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor' 销毁AlphaService Process finished with exit code 0
这里我们可以看到两次的getBean我们只会实例化一次,即单例。如果我们希望每次getBean都实例化,那么我们就需要切换为多例模式(prototype)
@Service
@Scope("prototype")
public class AlphaService {
public AlphaService(){
System.out.println("实例化AlphaService");
}
@PostConstruct
public void init(){
System.out.println("初始化AlphaSevice");
}
@PreDestroy
public void destory(){
System.out.println("销毁AlphaService");
}
}2019-12-22 11:01:16.246 WARN 37288 --- [ main] ion$DefaultTemplateResolverConfiguration : Cannot find template location: classpath:/templates/ (please add some templates or check your Thymeleaf configuration) 2019-12-22 11:01:16.505 INFO 37288 --- [ main] c.n.community.CommunityApplicationTests : Started CommunityApplicationTests in 2.613 seconds (JVM running for 3.686) 实例化AlphaService 初始化AlphaSevice com.nowcoder.community.service.AlphaService@568750b7 实例化AlphaService 初始化AlphaSevice com.nowcoder.community.service.AlphaService@3e28fee1 2019-12-22 11:01:17.058 INFO 37288 --- [ Thread-2] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor' Process finished with exit code 0
这里我们发现他实例化了两次, 但是我们发现并没有出现销毁方法,这是由于多例对象Spring容器只负责创建而不负责回收,因此不会调用销毁方法。
下面的链接中博主详细测试了多例方法的生命周期:
spring-多例对象prototype-生命周期方法问题

京公网安备 11010502036488号