文章目录Bean的作用域Bean的生命周期Bean的作用域在IOC中可以通过 ControllerServiceRepositoryComponentConfigurationBean 来声明Bean对象通过 ApplicationContext 或者 BeanFactory 来获取对象或通过 Autowired , Setter 方法或者构造方法等来为应用程序注入所依赖的Bean对象。对于下面的代码两个Bean对象输出的结果一致SpringBootTestclassDemoApplicationTests{AutowiredprivateApplicationContextapplicationContext;//Spring 容器TestvoidcontextLoads(){Dogdog1applicationContext.getBean(Dog.class);dog1.setName(狗狗1);System.out.println(dog1);//狗狗1System.out.println(dog1.getName());//com.example.demo.scope.Dog2b10ace9Dogdog2applicationContext.getBean(Dog.class);System.out.println(dog2);//狗狗1System.out.println(dog2.getName());//com.example.demo.scope.Dog2b10ace9}}在Spring中支持以下几种种作用域后4种在Spring MVC环境才生效singleton单例作用域每个Spring IoC容器内同名称的bean只有一个实例单例默认prototype原型作用域多例作用域每次使用该bean时会创建新的实例非单例request请求作用域每个HTTP请求生命周期内创建新的实例web环境中了解session会话作用域每个HTTP Session生命周期内创建新的实例web环境中了解Application全局作用域每个ServletContext生命周期内创建新的实例web环境中了解websocketHTTP WebSocket 作用域了解ComponentpublicclassDogBeanConfig{BeanpublicDogdog(){DogdognewDog();dog.setName(旺旺);returndog;}BeanScope(ConfigurableBeanFactory.SCOPE_SINGLETON)publicDogsingleDog(){DogdognewDog();returndog;}BeanScope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)publicDogprototypeDog(){DogdognewDog();returndog;}BeanRequestScopepublicDogrequestDog(){DogdognewDog();returndog;}BeanSessionScopepublicDogsessionDog(){DogdognewDog();returndog;}BeanApplicationScopepublicDogapplicationDog(){DogdognewDog();returndog;}}RestControllerpublicclassDogController{AutowiredprivateDogsingleDog;AutowiredprivateDogprototypeDog;AutowiredprivateDogrequestDog;AutowiredprivateDogsessionDog;AutowiredprivateDogapplicationDog;AutowiredprivateApplicationContextapplicationContext;RequestMapping(/single)publicStringsingle(){DogcontextDog(Dog)applicationContext.getBean(singleDog);returndog:singleDog.toString(),contextDog:contextDog;}RequestMapping(/prototype)publicStringprototype(){DogcontextDog(Dog)applicationContext.getBean(prototypeDog);returndog:prototypeDog.toString(),contextDog:contextDog;}RequestMapping(/request)publicStringrequest(){DogcontextDog(Dog)applicationContext.getBean(requestDog);returndog:requestDog.toString(),contextDog:contextDog.toString();}RequestMapping(/session)publicStringsession(){DogcontextDog(Dog)applicationContext.getBean(sessionDog);returndog:sessionDog.toString(),contextDog:contextDog.toString();}RequestMapping(/application)publicStringapplication(){DogcontextDog(Dog)applicationContext.getBean(applicationDog);returndog:applicationDog.toString(),contextDog:contextDog.toString();}}单例作用域多个请求中拿到同一个对象全部相同多例作用域每次拿到的都不是一个对象每次的Dog地址都不同请求作用域在同一个请求中是一个对象不同的请求中是另一组不同的对象同一个URL访问中的适用applicationContext和Autowired获取的Dog一样另一个请求中是另一对一样的会话作用域在同一个会话中是同一个对象不同的会话中同一个浏览器中的两个Dog一样不同浏览器中不一样的一对Application作用域整个Web容器内全部相同singleton 和 Application的区别Application scope就是对于整个web容器来说Bean的作⽤域是ServletContext级别的。这个和singleton有点类似区别在于: Application scope是ServletContext的单例singleton是⼀个ApplicationContext的单例。 在⼀个web容器中ApplicationContext可以有多个。Bean的生命周期Bean 的生命周期分为以下5个部分实例化(为Bean分配内存空间)属性赋值(Bean注入和装配比如 AutoWired)初始化执行各种通知如 BeanNameAwareBeanFactoryAwareApplicationContextAware 的接口方法。执行初始化方法包括xml定义 init-method使用注解的方式 PostConstruct执行初始化后置方法(BeanPostProcessor)使用Bean销毁Bean销毁容器的各种方法如 PreDestroyDisposableBean 接口方法destroy-method。ComponentpublicclassBeanLifeComponent{publicBeanLifeComponent(){System.out.println(执行构造函数....);}AutowiredpublicvoidsetDog(Dogdog){System.out.println(执行setter方法....);}PostConstructpublicvoidinit(){System.out.println(执行init方法....);}publicvoiduse(){System.out.println(执行use方法....);}PreDestroypublicvoiddestroy(){System.out.println(执行destroy方法....);}}SpringBootTestclassSpringPrincipleApplicationTests{AutowiredprivateBeanLifeComponentbeanLifeComponent;TestvoidcontextLoads(){beanLifeComponent.use();}}