1. 程式人生 > >spring框架之

spring框架之

spring框架

用途

  1. 整合其他框架,讓他們協同工作
  2. 提供了宣告式的事務管理 – 通過配置(xml, 註解)來管理事務

兩大核心思想:IOC,AOP

1. IOC簡介(控制反轉)

在web專案,一個servlet class servlet extends HttpServlet{ init() service() destroy() }

建立不是程式設計師來管的 --> tomcat容器 類中的某些方法也不需要我們自己呼叫 --> 由tomcat來呼叫 控制反轉(Inversion of controll):把物件的建立以及某些方法的呼叫交由容器來管理 spring容器,類似於tomcat容器,但它能容納的物件型別更為豐富:dao,service,controller

class UserDao { … }

UserDao dao = new UserDao(); // 原來我們需要自己建立物件 UserDao dao; // spring會建立好

2. 使用步驟

  1. 在pom.xml檔案中加入spring依賴
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>4.3.18.RELEASE</version>
</
dependency
>
  1. 編寫spring.xml的配置檔案, 並定義要控制反轉的類
<?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"
>
<!--受spring容器管理類, 使用<bean>標籤管理 id="唯一標識" --> <bean id="userDao" class="com.westos.dao.UserDao"> </bean> </beans>
  1. 使用spring容器
// 1. 建立spring容器
// 根據xml檔案路徑生成應用程式Context容器(上下文)
// classpath指配置檔案的位置, 起點有java, resources. 寫路徑時相對這個起點去寫
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");

// 2. 使用容器內的物件
//        UserDao dao = (UserDao)context.getBean("userDao"); // 根據id獲取

UserDao dao = context.getBean(UserDao.class);// 根據型別獲取, 找一個型別為UserDao的物件
dao.insert();

注意:

  • bean id是嚴格區分大小寫的 如果id不存在會報 NoSuchBeanDefinitionException
  • 如果容器中同一個型別的bean有多個,再根據型別獲取的話會報NoUniqueBeanDefinitionExceptions
  1. bean一般需要無參構造,spring會呼叫它來建立物件 如果沒有無參構造,需要給構造方法的引數賦值:
<constructor-arg index="引數下標,從0開始" value=""/>
  1. 控制物件個數 a.預設情況下,每個型別的bean在容器中只有一個物件(單例) b.多例,每用一次,建立一個新的物件 如果配置多例<bean scope="prototype">

  2. 初始化以及銷燬方法 在bean標籤中新增屬性: <bean init-method="初始化方法名" destroy-method="銷燬方法名"> 單例物件既會呼叫初始化,也會呼叫銷燬方法 多例物件,每使用一個多例物件,會呼叫初始化方法,但所有多例物件都不會呼叫銷燬方法

  3. 依賴注入(看做控制反轉的一個補充) tomcat和spring容器都實現了控制反轉, 但spring容器有依賴注入的功能,而tomcat沒有 DI (dependency injection)

給bean的屬性賦值的過程,稱為依賴注入,是由spring來管理bean與bean之間的依賴關係 在bean標籤中新增子標籤:

<property name="要注入的屬性名" ref="要依賴的bean 的id值"/>
  1. 依賴注入的三種方式 方式1: set注入,在類中為屬性新增set方法 private UserDao userDao; public void setUserDao(UserDao userDao) { this.userDao = userDao; } 在spring.xml配置檔案本類對應的bean裡面新增property標籤
<property name="要注入的屬性名" ref="要依賴的bean 的id值"/>

方法2: 構造注入 類中提供有參構造 public UserService(UserDao userDao) { this.userDao = userDao; } 在bean標籤中新增以下標籤:

<constructor-arg index="0" ref="userDao"/>

方法3: 註解注入 @Autowired(spring提供的) 利用這個註解完成屬性的賦值,把它加在需要注入的屬性上, 或set方法上,或構造方法上

要啟用該註解:在spring.xml檔案加入

<context:annotation-config/>

@Resource (java官方的註解) 用法與@Autowired類似

  1. 可以支援將*.properties 注入到spring.xml中
<!--讀取properties 檔案 location="檔案位置"  placeholder 佔位符-->
<context:property-placeholder location="classpath:jdbc.properties"/>

<!-- 可以利用 ${key} 獲取 *.properties 檔案中的值-->
<bean id="productDao" class="com.westos.dao.ProductDao">
    <property name="username" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
</bean>

註解方式 @Value 可以完成這種值注入 @Value("${properties中的key}")

要保證spring.xml的配置檔案不要修改,要修改的內容可以配置到*.properties檔案中

  1. 整合mybatis 步驟1:在pom.xml加入依賴 mybatis, mysql, spring-context, logback, druid, junit, spring-jdbc, mybatis-spring

步驟2:把關鍵物件spring控制反轉 連線池物件, sqlSessionFactory, sqlSession

<context:property-placeholder location="classpath:jdbc.properties"/>

<!-- 1) 把資料來源物件交給spring容器管理 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
    <property name="driverClassName" value="${jdbc.driver}"/>
    <property name="url" value="${jdbc.url}"/>
    <property name="username" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
    <property name="maxActive" value="${jdbc.max}"/>
    <property name="minIdle" value="${jdbc.min}"/>
</bean>
<!-- 2) sqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <!-- 注入連線池 -->
    <property name="dataSource" ref="aaa"/>
    <!-- 注入mapper.xml檔案的位置-->
    <property name="mapperLocations" value="classpath:com/westos/mapper/*.xml"/>
</bean>
<!-- 3) sqlSession, 用SqlSessionTemplate得到的SqlSession可以不用我們自己操心事務的管理,以及關閉操作 -->
<bean id="sql" class="org.mybatis.spring.SqlSessionTemplate">        
    <constructor-arg index="0" ref="sqlSessionFactory"/>
</bean>

步驟3: 使用SqlSession工廠

ClassPathXmlApplicationContext context =
            new ClassPathXmlApplicationContext("abc/spring-mybatis.xml");
SqlSession sqlSession = context.getBean(SqlSession.class);
Map<String, Object> map = new HashMap<String,Object>();
map.put("m", "0");
map.put("n", 5);
List<Product> list = sqlSession.selectList("com.westos.mapper.ProductMapper.selectByPage", map);
for (Product product : list) {
    System.out.println(product);
}