目錄
Bean的作用域:
Bean有六大行為模式
1、singleton:單例模式(默認(rèn))
2、prototype: 原型模式(多例模式)
3、request: 請(qǐng)求作用域(Spring MVC)
4、session: 會(huì)話(huà)作用域(Spring MVC)
5、application: 全局作用域(Spring MVC)
6、websocket: HTTP WebSocket 作用域(Spring WebSocket)
applicationContext和singleton的區(qū)別?
Bean的生命周期?
1、實(shí)例化(給Bean分配內(nèi)存空間)?
2、設(shè)置屬性(對(duì)象注入)
3、Bean的初始化?
4、使用Bean
5、銷(xiāo)毀Bean?
總結(jié):
Bean的作用域:
一般情況下,對(duì)于變量的可用范圍叫做作用域,或者說(shuō)是定義某個(gè)變量的區(qū)域叫做作用域。?
而B(niǎo)ean的作用域指的是Bean在Spring容器中的行為模式。
Bean有六大行為模式
1、singleton:單例模式(默認(rèn))
singleton是Bean在Spring中默認(rèn)的行為,這個(gè)默認(rèn)的行為模式就是說(shuō)一個(gè)類(lèi)只有一個(gè)Bean對(duì)象,所有的用戶(hù)都使用的同一個(gè)對(duì)象,如果有一個(gè)用戶(hù)對(duì)這個(gè)對(duì)象進(jìn)行了修改,那么所有的結(jié)果都會(huì)發(fā)生改變。
如:這樣一個(gè)User類(lèi):
package com.demo.spring.beans;
public class User {
private int Id;
private String name;
public int getId() {
return Id;
}
public void setId(int id) {
Id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
"Id=" + Id +
", name='" + name + '\'' +
'}';
}
}
我們先使用@Bean注解給Spring中注入一個(gè)User對(duì)象?
package com.demo.spring.beans.Controller.Bean;
import com.demo.spring.beans.User;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Controller;
@Controller
public class UserBean {
@Bean(name = "user")
//使用getUser方法返回Bean對(duì)象
public User getUser(){
User user=new User();
user.setId(1);
user.setName("張三");
return user;
}
}
?然后使用@Autowired從Spring中獲取到該Bean對(duì)象并進(jìn)行修改:
package com.demo.spring.beans.Controller;
import com.demo.spring.beans.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
@Controller
public class UserController {
private User user1;
@Autowired
public User getUser1(){
User user=user1;
user.setId(1);
user.setName("李四");
return user;
}
}
然后再使用@Autowired直接從Spring中獲取Bean對(duì)象:
package com.demo.spring.beans.Controller;
import com.demo.spring.beans.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
@Controller
public class UserController2 {
@Autowired
private User user3;
public User getUser3() {
return user3;
}
}
然后我們?cè)贏pp啟動(dòng)類(lèi)中分別獲取一下UserController和UserController2的Bean對(duì)象:
import com.demo.spring.beans.Controller.UserController;
import com.demo.spring.beans.Controller.UserController2;
import com.demo.spring.beans.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class App {
public static void main(String[] args) {
ApplicationContext context=new
ClassPathXmlApplicationContext("spring-config.xml");
UserController userController= context.getBean("userController", UserController.class);
User user=userController.getUser1();
System.out.println("修改后的bean:"+ user);
UserController2 userController2=context.getBean("userController2",UserController2.class);
User user1=userController2.getUser3();
System.out.println("最后獲取的bean:"+user1);
}
}
結(jié)果如圖:
?也就是說(shuō),開(kāi)始的時(shí)候我們的name是張三,經(jīng)過(guò)第一次修改后,變成了李四,最后一個(gè)人在沒(méi)有修改的前提下依然獲得的是李四?。所以我們可以斷定這個(gè)bean是同一個(gè)。也就是說(shuō)Bean的作用域默認(rèn)是Singleton(單例模式)單例可以節(jié)省內(nèi)存開(kāi)銷(xiāo),適合Bean對(duì)象不被隨意更改的場(chǎng)景。
2、prototype: 原型模式(多例模式)
原型模式需要在注入Bean的時(shí)候就進(jìn)行指定,需要在@Bean注解下或者五大類(lèi)注解的下面指定注解:@Scope,并且在注解中指定一個(gè)值為prototype。這樣其他地方獲取Bean的時(shí)候,就不是同一個(gè)了,而是一個(gè)新的Bean實(shí)例。(通常有狀態(tài)的Bean使用該作用域)?
?
Bean的內(nèi)容容易被修改的場(chǎng)景中適合使用該種作用域。
3、request: 請(qǐng)求作用域(Spring MVC)
每次http請(qǐng)求會(huì)創(chuàng)建新的Bean實(shí)例,類(lèi)似于prototype
場(chǎng)景:?次http的請(qǐng)求和響應(yīng)的共享Bean
備注:限定SpringMVC中使?
4、session: 會(huì)話(huà)作用域(Spring MVC)
在?個(gè)http session中,定義?個(gè)Bean實(shí)例
場(chǎng)景:
?戶(hù)回話(huà)的共享Bean, ?如:記錄?個(gè)?戶(hù)的登陸信息
備注:
限定SpringMVC中使?
5、application: 全局作用域(Spring MVC)
在?個(gè)http servlet Context中,定義?個(gè)Bean實(shí)例(這個(gè)Bean也是單例的)
場(chǎng)景:
Web應(yīng)?的上下?信息,?如:記錄?個(gè)應(yīng)?的共享信息
備注:
限定SpringMVC中使?
6、websocket: HTTP WebSocket 作用域(Spring WebSocket)
在?個(gè)HTTP WebSocket的?命周期中,定義?個(gè)Bea實(shí)例
場(chǎng)景:
WebSocket的每次會(huì)話(huà)中,保存了?個(gè)Map結(jié)構(gòu)的頭信息,將?來(lái)包裹客戶(hù)端消息頭。第?次初始化后,直WebSocket結(jié)束都是同?個(gè)Bean。
備注:
限定Spring WebSocket中使?
applicationContext和singleton的區(qū)別?
1、作用域不一樣:singleton是Spring Core的作用域,而application是Spring Web中的作用域。
2、作用的容器不一樣:singleton是作用于Spring IOC的容器,而application是作用于Servlet的容器。
Bean的生命周期?
1、實(shí)例化(給Bean分配內(nèi)存空間)?
2、設(shè)置屬性(對(duì)象注入)
3、Bean的初始化?
①執(zhí)行各種通知(執(zhí)行各種 Aware)
②執(zhí)行初始化的前置方法(BeanPostProcessor)
③ 執(zhí)行構(gòu)造方法,兩種執(zhí)行方式,一種是執(zhí)行 @PostConstruct,另一種實(shí)質(zhì)性 init-method
④ 執(zhí)行初始化的后置方法(BeanPostProcessor)
4、使用Bean
5、銷(xiāo)毀Bean?
執(zhí)行銷(xiāo)毀容器的各種方法,例如@PreDestroy、DisposableBean方法、destroy-method方法。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-431212.html
總結(jié):
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-431212.html
到了這里,關(guān)于Spring Bean作用域與生命周期的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!