class作用?
1.作用
Bean標簽是用于配置對象,讓 spring 來創建的。
默認情況下它調用的是類中的無參構造函數。如果沒有無參構造函數則不能創建成功。
2.屬性
id:給對象在容器中提供一個唯一標識,用于獲取對象。
class:指定類的全限定類名,用于反射創建對象。默認情況下調用無參構造函數。
scope:指定對象的作用范圍。
二、Bean標簽的屬性
Bean標簽中的scope屬性,用于描述bean的作用域。取值如下:
singleton:默認值,單例的。代表在Spring Ioc容器中只有一個Bean實例。
prototype:多例的。每一次從Spring容器中獲取時都會返回一個新的實例。
request :WEB 項目中,Spring 創建一個 Bean 的對象,將對象存入到 request 域中。
session :WEB 項目中,Spring 創建一個 Bean 的對象,將對象存入到 session 域中。
global session :WEB 項目中,作用于集群環境(Porlet)的會話范圍(全局會話范圍)。如果沒有集群環境(Portlet)那么globalSession 相當于 session。
init-method:指定類中的初始化方法名稱。
destroy-method:指定類中銷毀方法名稱。
三、Bean標簽的scope屬性
scope屬性 說明
單例singleton 對象只創建一次,容器創建時創建
原型prototype 每調用一次就創建一個新的對象,對象調用時創建
request 每次HTTP請求時創建一個實例
session 針對每個HTPP session創建一個實例
1.測試scope=“singleton”
singleton:默認值,單例的。代表在spring Ioc容器中只有一個Bean實例。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="p" class="com.gql.entity.Person" c></bean>
</beans>
package com.ql.scope;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.gql.entity.Person;
/**
* 類說明:
* 測試Bean標簽的scope屬性
* @guoqianliang1998.
*/
public class Demo {
@Test
public void testScope() {
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
Person p1 = (Person) ac.getBean("p");
Person p2 = (Person) ac.getBean("p");
Person p3 = (Person) ac.getBean("p");
System.out.println(p1);
System.out.println(p2);
System.out.println(p3);
?
2.scope=“prototype”
prototype:多例的。每一次從Spring容器中獲取時都會返回一個新的實例。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="p" class="com.gql.entity.Person" scope="prototype"></bean>
</beans>
package com.ql.scope;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.gql.entity.Person;
/**
* 類說明:
* 測試Bean標簽的scope屬性
* @guoqianliang1998.
*/
public class Demo {
@Test
public void testScope() {
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
Person p1 = (Person) ac.getBean("p");
Person p2 = (Person) ac.getBean("p");
Person p3 = (Person) ac.getBean("p");
System.out.println(p1);
System.out.println(p2);
System.out.println(p3);
四、scope="singleton"帶來的線程安全問題
單例模式下,在對象實體類的成員位置進行增刪改,可能會引發線程安全問題。
而寫在函數內部(局部位置)則不會引發線程安全問題,這是因為對象每一次調用函數,都會在棧空間中開辟空間,函數調用完就退出,生命周期短。
package com.gql.entity;
import java.util.ArrayList;
import java.util.List;
/**
* 類說明:
* 實體類Person
* @guoqianliang1998.
*/
public class Person {
private String name;
//如果對list進行增刪改,可能引發線程安全問題。
public List<String> list = new ArrayList<String>();
//無參構造
public Person() {
}
//有參構造
public Person(String name) {
this.name = name;
}
public void talk(){
System.out.println("talk方法...");
}
}