1. 程式人生 > 實用技巧 >Spring知識小計1

Spring知識小計1

1. Bean標籤

取值範圍 說明
singleton 這是預設值,單例
prototype 多例
request WEB 專案中,Spring 建立一個 Bean 的物件,將物件存入到 request 域中
session WEB 專案中,Spring 建立一個 Bean 的物件,將物件存入到 session 域中
gloable session WEB 專案中,應用在 Portlet 環境,如果沒有 Portlet 環境那麼globalSession 相當於 session

1.1 當scope的取值是singleton的時候

  • Bean的例項化個數:1

  • Bean的例項化時機:當Spring的核心檔案被載入的時候

    ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
    
  • Bean的生命週期:

    • 建立:應用進行載入,容器建立的時候,物件被建立
    • 執行:只要容器還在,物件就一直存在
    • 銷燬:應用解除安裝,容器銷燬的餓時候,物件就被銷燬了

1.2 當scope的取值是prototype的時候

  • Bean的例項化個數:多個,每次進行呼叫getBean的時候,都會例項化新的物件

  • Bean的例項化時機:呼叫getBean的時候

    Object userService = applicationContext.getBean("userService");
    
  • Bean的生命週期

    • 物件建立:當使用物件時,建立新的物件例項
    • 物件執行:只要物件在使用中,就一直活著
    • 物件銷燬:當物件長時間不用時,被 Java 的垃圾回收器回收了

2. 如何進行Bean的例項化

有三種方式:無參構造方法例項化工廠靜態方法例項化工廠例項方法例項化

2.1 無參構造方法

<bean id="userDao" class="xqp.dao.impl.UserDaoImpl"/>

這樣就可以利用UserDao userDao = (UserDao)applicationContext.getBean(“userDao”);

獲得UserDao的物件了。

2.2 工廠靜態方法

既然是工廠方法,肯定要先構造一個工廠放到spring容器中

public class StaticFactoryBean {
    public static UserDao createUserDao(){    
    	return new UserDaoImpl();
    }
}
<bean id="userDao" class="xqp.factory.StaticFactoryBean" 
      factory-method="createUserDao" />

其中factory-method是用來指向具體的方法的,這裡因為是靜態的,因此通過getBean()方法後會或的對應的class的屬性,進而得到對應的類(不是類的物件),最後在根據factory-method方法來表明這個類應該呼叫那個方法來返回所需要的物件

2.3 工廠例項方法

public class DynamicFactoryBean {  
	public UserDao createUserDao(){        
		return new UserDaoImpl(); 
	}
}
<bean id="factoryBean" class="xqp.factory.DynamicFactoryBean"/>
<bean id="userDao" factory-bean="factoryBean" factory-method="createUserDao"/>

3. Bean的依賴注入

依賴注入式Spring框架核心IOC的具體實現。在編寫程式的時候,由於IOC的存在,物件的建立權被交給了Spring,但是程式碼中不可能出現沒有依賴的情況,IOC的存在也只是降低了耦合而不是消滅了耦合。

3.1 依賴注入的兩種方式

  • 構造方法注入(引用型別資料的注入為例)

    <bean id="userDao" class="xqp.dao.impl.UserDaoImpl"/>
    <bean id="userService" class="xqp.service.impl.UserServiceImpl">
    	<constructor-arg name="userDao" ref="userDao"></constructor-arg>
    </bean>
    
  • set方法注入,引用型別資料的注入為例,如果是用的是xml方式的話set方法不能省略,但是如果使用的是註解方式,那麼set方法可以省略)

    public class UserServiceImpl implements UserService {
        private UserDao userDao;
        public void setUserDao(UserDao userDao) {
            this.userDao = userDao;  
        } 
        @Override    
        public void save() {      
       		 userDao.save();
    	}
    }
    
    <bean id="userDao" class="xqp.dao.impl.UserDaoImpl"/>
    <bean id="userService" class="xqp.service.impl.UserServiceImpl">
    	<property name="userDao" ref="userDao"/>
    </bean>
    
    • 如果使用set方法注入,並且注入資料少的話可以使用p名稱空間注入(就是簡化了而已)。 P名稱空間注入本質也是set方法注入,但比起上述的set方法注入更加方便,主要體現在配置檔案中,如下:

      • 首先,需要引入P名稱空間:

        xmlns:p="http://www.springframework.org/schema/p"
        
      • 其次,需要修改注入方式:

        <bean id="userService" class="xqp.service.impl.UserServiceImpl" p:userDao-ref="userDao"/>
        

3.2 依賴注入的資料型別

  • 普通資料型別

    public class UserDaoImpl implements UserDao {
    	private String company;
        private int age;
        public void setCompany(String company) {
            this.company = company;
        }
        public void setAge(int age) {
            this.age = age;
        }
        @Override   
        public void save() {
            System.out.println(company+"==="+age);
            System.out.println("UserDao save method running....");   
        }
    }
    
    <bean id="userDao" class="xqp.dao.impl.UserDaoImpl">
        <property name="company" value="大疆"></property>
        <property name="age" value="15"></property>
    </bean>
    
  • 引用資料型別

    public class UserServiceImpl implements UserService {
        private UserDao userDao;
        public void setUserDao(UserDao userDao) {
            this.userDao = userDao;  
        } 
        @Override    
        public void save() {      
       		 userDao.save();
    	}
    }
    
    <bean id="userDao" class="xqp.dao.impl.UserDaoImpl"/>
    <bean id="userService" class="xqp.service.impl.UserServiceImpl">
    	<property name="userDao" ref="userDao"/>
    </bean>
    
  • 集合資料型別

    • List<普通資料型別>

      public class UserDaoImpl implements UserDao {
      	private List<String> strList;
      	public void setStrList(List<String> strList) {
      		this.strList = strList;
      	}
          @Override   
      	public void save() {
              System.out.println(strList);
              System.out.println("UserDao save method running....");
      	}
      }
      
      <bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl">
          <property name="strList">
              <list>
                  <value>aaa</value>
                  <value>bbb</value>
                  <value>ccc</value>
              </list>
          </property>
      </bean>
      
    • List<引用資料型別>

      public class UserDaoImpl implements UserDao {
      	private List<User> userList;
      	public void setUserList(List<User> userList) {
      		this.userList = userList;  
       	}
          @Override   
      	public void save() {
      		System.out.println(userList);
      		System.out.println("UserDao save method running....");
      	}
      }
      
      <bean id="userDao" class="xqp.dao.impl.UserDaoImpl">
          <property name="userList">
              <list>
              	<!--進行引用型別的注入-->
                  <bean class="xqp.domain.User" ref="user1"/>
                  <bean class="xqp.domain.User" ref="user2"/>
              </list>
          </property>
      </bean>
      
      <bean id="user1" class="xqp.domain.User">
            <!--User裡面也有屬性,因此也需要一塊進行注入-->
            <property name="name" value="Tom"></property>
            <property name="addr" value="beijing"></property>
      </bean>
      <bean id="user2" class="xqp.domain.User">
            <!--User裡面也有屬性,因此也需要一塊進行注入-->
            <property name="name" value="Lucy"></property>
            <property name="addr" value="tianjing"></property>
      </bean>
      
    • Map

      <bean id="user1" class="xqp.domain.User">
            <!--User裡面也有屬性,因此也需要一塊進行注入-->
            <property name="name" value="Tom"></property>
            <property name="addr" value="beijing"></property>
      </bean>
      <bean id="user2" class="xqp.domain.User">
            <!--User裡面也有屬性,因此也需要一塊進行注入-->
            <property name="name" value="Lucy"></property>
            <property name="addr" value="tianjing"></property>
      </bean>
      
      <property name="userMap">
          <map>
              <!--這個key代表的map的key,叫啥都行,無所謂-->
              <!--ref指向的是要注入的Bean,是要引用容器當中的Bean的id-->
              <entry key="aaaa" value-ref="user1"></entry>
              <entry key="bbbb" value-ref="user2"></entry>
          </map>
      </property>
      
    • Properties

      public class UserDaoImpl implements UserDao {
          private Properties properties;
          public void setProperties(Properties properties) {
              this.properties = properties;
          }
          
          @Override 
      	public void save() {
      		System.out.println(properties);
      		System.out.println("UserDao save method running....");
      	}
      }
      
      <bean id="userDao" class="xqp.dao.impl.UserDaoImpl">
          <property name="properties">
              <props>
                  <prop key="p1">aaa</prop>
                  <prop key="p2">bbb</prop> 
                  <prop key="p3">ccc</prop>
              </props>
          </property>
      </bean>