1. 程式人生 > >D41-Spring(02整合連線池)

D41-Spring(02整合連線池)

一、全xml

  • spring除了管理自己編寫的資源,還可以管理第三方的資源。

步驟:

  1. 匯入連線池和mysql驅動,jdbcTemplate的座標(在pom.xml檔案中)
  2. 將第三方的物件交給spring的ioc容器
 <!--  自己編寫的資源也可以交給ioc容器建立並管理
    accountDao-->
    <bean id="accountDao" class="com.daoimpl.AccountDaoImpl">
        <property name="jdbcTemplate"
ref="jdbcTemplate">
</property> </bean> <!--accountService--> <bean id="accountService" class="com.serviceimpl.AccountServiceImpl"> <property name="accountDao" ref="accountDao"></property> </bean>
  1. 通過spring的依賴注入(DI)設定屬性值。
  • 優化:
    1. 在spring的配置檔案中載入外部的資料庫連線資訊properties 配置檔案,在內部通過el表示式${key}的方式獲取。
<!--讓spring去載入第三方的jdbc.properties配置檔案
        標籤:<context>
        使用:el表示式${key}
    -->
    <context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder
>
  • 連線池
<!-- druid -->
    <bean id="druid" class="com.alibaba.druid.pool.DruidDataSource">
        <!--set 屬性-->
        <property name="driverClassName" value="${jdbc.driver}"></property>
        <property name="url" value="${jdbc.url}"></property>
        <property name="username" value="${jdbc.username}"></property>
        <property name="password" value="${jdbc.password}"></property>
    </bean>

    <!--JdbcTemplet
        new JdbcTemplet();
        new JdbcTemplet("連線池");
    -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <!--通過構造器設定屬性-->
        <constructor-arg name="dataSource" ref="druid"></constructor-arg>
    </bean>
  • 測試類:
DruidDataSource druidDataSource = new DruidDataSource();
        //使用mysql驅動
        druidDataSource.setDriverClassName("com.mysql.jdbc.Driver");
        druidDataSource.setUrl("jdbc:mysql:///day02_spring");
        druidDataSource.setUsername("root");
        druidDataSource.setPassword("root");

        DruidPooledConnection connection = druidDataSource.getConnection();
        System.out.println(connection);

二、半xml半註解方式

2.1 需求:要使用ioc的 半xml半註解 的方式完成資料庫的操作

  • 半xml半註解:自己的資源用註解代替,第三方的資源全部保留xml配置

  • 純註解方式: 自己的資源和第三方資源全部用註解的方式。

  • 半xml半註解的使用條件:

    • spring對註解預設是關閉的,需要配置一個註解掃描器,開啟註解並掃描資源。
    • 註解掃描器的作用: 在指定的包路徑下(包含子路徑)解析新增的註解。使用標籤< context >開啟註解。
<!--開啟掃描器-->
    <context:component-scan base-package="com" ></context:component-scan>
  • 載入第三方資源
<context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder>
  • 建立druid連線池並與JdbcTemplate繫結
<bean id="druid" class="com.alibaba.druid.pool.DruidDataSource">
        <!--set 屬性-->
        <property name="driverClassName" value="${jdbc.driver}"></property>
        <property name="url" value="${jdbc.url}"></property>
        <property name="username" value="${jdbc.username}"></property>
        <property name="password" value="${jdbc.password}"></property>
    </bean>
    <!--JdbcTemplet
        new JdbcTemplet();
        new JdbcTemplet("連線池");
    -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <!--通過構造器設定屬性-->
        <constructor-arg name="dataSource" ref="druid"></constructor-arg>
    </bean>

2.2 註解整理

2.2.1 建立物件的註解

  • @Component
  • @Controller — web層(控制層)
  • @Service —service層(業務邏輯層)
  • @Repository ----dao層(持久層)
  1. 需要配置在類上
  2. 預設該物件在spring容器中的唯一標識(id):就當前類名首字母小寫
  3. 如果使用Value屬性:可以指定唯一標識(id)
  4. 這4個註解可以隨便用,但是建議按照分層方式對應註解。
@Component(value = "accountService")
//<bean id="accountService" class="com.serviceimpl.AccountServiceImpl">
public class AccountServiceImpl implements AccountSerivce {
    //spring解析到這個註解,會自動去自己的ioc容器中找當前這個型別(介面)的物件,並自動賦值
    @Autowired
    @Qualifier(value = "accountDao1")
    private AccountDao accountDao;
    public void delete() {
        //呼叫dao
        accountDao.delete();
    }

2.2Spring提供的物件屬性的依賴注入註解

  • @Autowired:
    • 預設按照型別(介面)從容器中查詢物件並注入。如果該容器中有多個該介面的物件,可以使用下面註解配套
    • @Qualifier:
      • 按照指定的唯一標識從容器中查詢物件並注入。value: 指定唯一標識(id)
@Repository(value = "accountDao1")
public class AccountDaoImpl implements AccountDao {
    @Autowired //依賴註解
    private JdbcTemplate jdbcTemplate;
    public void delete() {
        String sql="delete  from account";
        jdbcTemplate.update(sql);
    }

在這裡插入圖片描述

2.3 JDK提供的依賴注入註解(@[email protected](value=id唯一標識名))

  • @Resource: 按照唯一標識從容器中查詢物件並注入。
  • · Name: 指定唯一標識

2.4 簡單屬性的依賴註解

  • @Value:
    • 注入基本資料型別
    • 注入被spring容器管理的properties檔案中的內容
      • 將properties交給spring容器管理
      • 使用spring-el表示式獲取,@Value="${properties檔案中的key}"
  • AccountDaoImpl2類下
@Repository(value = "accountDao2")
@Scope(value = "singleton") // 預設為單例
public class AccountDaoImpl2 implements AccountDao {
   // @Value(value = "com.mysql.jdbc.Driver")  直接賦值
    @Value(value = "${jdbc.driver}") //條件:spring必須載入過第三方的jdbc.properties檔案
    private String driver;
    //@Value(value = "jdbc:mysql:///day02_spring")
    @Value(value = "${jdbc.url}")
    private String url;
    //@Value(value = "root")
    @Value(value = "${jdbc.username}")
    private String username;
    //@Value(value = "root")
    @Value(value = "${jdbc.password}")
    private String password;
  }

2.5 spring提供的生命週期的註解

xml方式:

  • Scope: 物件的作用域
  • Destory-method :銷燬方法
  • Init-method :初始化方法

註解的方式:

  • @Scope:物件的作用, 配置在類上

    • Value屬性:(singleton | prototype)
  • @POSTConstruct:配置到方法上

    • 配置初始化方式
  • @PreDestory:配置到方法上

    • 配置銷燬方法
  • AccountDaoImpl2類下

//初始化的方法
    @PostConstruct
    public void start(){
        System.out.println("這是初始化的方法");
    }
    //銷燬的方法
    @PreDestroy
    public void end(){
        System.out.println("這是銷燬的方法");
    }

三、spring的註解程式設計

純註解: 替換xml配置檔案。

  • 條件:使用配置類替換xml配置檔案。
    • 程式碼前端不在載入配置檔案, 而是載入配置類。

3.1 註解

  • @Configuration: 宣告配置類
  • @ComponentScan: 開啟包掃描
  • PropertySource: 將properties零配置檔案交給spring容器管理。

3.2 步驟

3.2.1 測試類

  • 載入配置類
  • 獲取accountService物件,並放入容器中
 public static void main(String[] args){
        // 載入配置檔案---沒有---不能再用ClassPathXmlApplicationContext
        // 配置類代替配置檔案---不在載入配置檔案了,要載入配置類---AnnotationConfigApplicationContext
        //AnnotationConfigApplicationContext作用:載入配置類
        ApplicationContext applicationContext=new AnnotationConfigApplicationContext(SpringConfig.class);
        //問容器要service物件
        AccountService accountService=(AccountService)applicationContext.getBean("accountService");
        accountService.delete();
    }

3.3 SpringConfig配置類

@Configuration //聲明當前類是一個配置類,還會自動呼叫類中所有方法
@ComponentScan(basePackages ="com")
 //要把自己的資源用註解代替---開啟一個掃描器
 //<context:component-scan base-package="cn.itcast"></context:component-scan>

//載入外部的第三方配置檔案 <context:property-placeholder location="classpath:jdbc.properties">
@PropertySource(value = "classpath:jdbc.properties")
@Import(value = JdbcConfig.class)//整合別的配置類
public class SpringConfig {

}

3.4 AccountServiceImpl類

  • 根據配置類中開啟的掃描器,定位到此類
@Service(value = "accountService")
public class AccountServiceImpl implements AccountService {
    @Autowired
    private AccountDao accountDao;
    public void delete() {
        //呼叫dao
        accountDao.delete();
    }
 }   

3.5 AccountDaoImpl 層

@Repository(value = "accountDao")
public class AccountDaoImpl implements AccountDao {
    @Autowired   //依賴注入
    private JdbcTemplate jdbcTemplate;
    public void delete() {
        String sql= "delete from account ";
        jdbcTemplate.update(sql);
    }

3.3 @Bean

  • @Bean : 配置到方法上,表明此方法的返回值交給spring容器管理
    • 將第三方物件交給spring容器管理的時候使用@Bean
* @Bean
 *      使用:需要配置到方法上,此方法需要返回值
 *      含義:將此方法的返回值交給spring容器管理
 *      流程:當程式啟動的時候(建立spring容器),掃描所有配置了@bean註解的方法,
 *              執行相關方法得到返回值,將返回值存入spring容器
 *  name:唯一標識
 */

/**
 * 建立dataSource
 */
@Bean(name="dataSource")
public DataSource getDataSource() {
    DruidDataSource ds = new DruidDataSource();
    ds.setUsername("root");
    ds.setPassword("111111");
    ds.setUrl("jdbc:mysql:///springdb");
    ds.setDriverClassName("com.mysql.jdbc.Driver");
    return ds;
}

四、 spring整合junit(單元測試的註解)

4.1 環境搭建的步驟

  1. 匯入SpringJunit的座標
  2. 通過註解指定誰去載入配置檔案
  3. 通過註解指定配置檔案的位置
  4. 記載成功,可以注入並測試

4.2 SpringJunit

  • 匯入座標

    • Junit:單元測試
    • Spring-test:spring整合junit的支援包
  • @Runwith(SpringJunit4ClassRunner.class) : 宣告spring提供的單元測試環境

  • @ContextConfiguration : 宣告spring的配置資訊

    • Locations:xml配置檔案
    • Classes:配置類的位元組碼
// 載入配置檔案或者配置類  ioc容器中才會有個個物件
@RunWith(value = SpringJUnit4ClassRunner.class) //載入配置檔案或者是配置類
//@ContextConfiguration(locations = "classpath:bean.xml") //指向配置檔案的位置
@ContextConfiguration(classes = SpringConfig.class) //指向配置類
public class Demo2_springJunit {

    @Autowired  // ioc容器有物件
    private AccountService accountService;

    @Test  //做刪除
    public void t1(){

        accountService.delete();
    }
}