1. 程式人生 > 其它 >Spring:IOC之二

Spring:IOC之二

Bean的作用域

  • 在Spring裡,可以設定Bean建立的例項是單例項還是多例項
  • 預設情況下是單例項物件。
  • 單例項物件情況下:每次建立的物件的地址都是相同的(類似靜態變數?)
  • 通過scope來設定是單例還是多例
    • 預設:singleton 單例項物件
      • 設定為singleton 的時候,載入Spring配置檔案時就會建立單例項物件。
    • prototype:表示多例項物件
      • 設定為prototype的時候,在呼叫getBean方法的時候建立多例項物件。
    • Request:表示request域物件
    • session:表示session域物件

Bean的生命週期

  • 從物件的建立到物件的銷燬的過程
    1. 執行無參構造建立bean例項
    2. 呼叫set方法設定屬性值
    3. 把Bean例項傳遞給Bean後置處理器的方法
    4. 執行初始化方法
    5. 把Bean例項傳遞給Bean後置處理器的方法
    6. 建立bean例項物件
    7. 執行銷燬方法
  • Bean的後置處理器
    • 建立一個類,實現BeanPostProcessor介面
    • 重寫兩個方法
    • 在配置檔案中建立該類的物件則完成後置處理器的建立。

XML自動裝配

什麼是自動裝配

  • 根據指定裝配規則(屬性名稱或者屬性型別),Spring自動將匹配的屬性進行注入

  • <bean>標籤中設定autowire欄位,可以實現自動裝配

    • byName:通過屬性名稱注入
    • byType:通過屬性型別注入
  • 外部屬性檔案的引入

  • 引入外部德魯伊資料連線池

    • 在xml中配置context

      xmlns:context="http://www.springframework.org/schema/context"
      http://www.springframework.org/schema/context/spring-context.xsd
      
    • 引入外部檔案

      <context:property-placeholder location="classpath:hello.xml"/>
      
    • 建立德魯伊資料連線池物件

      <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
          <property name="driverClassName" value="${pro.driver}"/>
          <property name="url" value="${pro.url}"/>
          <property name="username" value="${pro.username}"/>
          <property name="password" value="${pro.password}"/>
      </bean>
      

XML方式暫告一段落


基於註解方式實現物件建立

什麼是註解

  1. 註解是程式碼的特殊標記,格式:@註解名(屬性名=屬性值,...)
  2. 使用註解:註解可以作用在類上,方法上面或者屬性上面
  3. 使用註解的目的:簡化xml配置

基於註解的物件建立

  1. @Component:一般註解
  2. @Service:一般用在Service層
  3. @Controller:一般用在Controller層
  4. @Repository:一般用在持久層(DAO)
  5. 上面的註解功能是一樣的,都可以建立Bean例項,但是建議在對應的層使用對應的註解。

實現

  1. 引入aop依賴spring-aop-5.2.6.RELEASE
  2. 開啟元件掃描
    1. 先在配置檔案中新增context
    2. 然後開啟元件掃描<context:component-scan base-package="com.boerk"/>
    3. 在類上加上註解@Component(value="user")等價於先前在xml裡配置的內容。也可以不加value,預設的value為類名切首字母小寫
//pojo類
@Component(value="user")
public class User {
    public void add(){
        System.out.println("hello");
    }
}
//test類
@Test
public void test1(){
   ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");
   User user = applicationContext.getBean("user", User.class);
   user.add();
}
//打印出hello