1. 程式人生 > 實用技巧 >spring的基於註解的IOC

spring的基於註解的IOC

1、spring中ioc的常用註解

1.1建立maven工程加入對應的依賴

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.ximu</groupId>
    <artifactId>javaframe_spring02</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.0.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>5.0.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jcl</artifactId>
            <version>5.0.2.RELEASE</version>
        </dependency>
    </dependencies>

</project>

1.2.增加一系列的配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">
<!--告知spring需要掃描的包-->
    <context:component-scan base-package="com.ximu"/>
<!--    配置QueryRunner-->
    <bean id="runner" class="org.apache.commons.dbutils.QueryRunner" scope="prototype">
        <constructor-arg name="ds" ref="dataSource"></constructor-arg>
    </bean>
<!--    配置資料來源-->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
        <property name="jdbcUrl" value="jdbc:mysql://192.168.92.131:3306/mydb2"></property>
        <property name="user" value="root"></property>
        <property name="password" value="root"></property>
    </bean>

</beans>

1.3.一些常用的註解

  • 1.3.1 @Component

作用:把資源讓 spring 來管理。相當於在 xml 中配置一個 bean。

屬性:value:指定 bean 的 id。如果不指定 value 屬性,預設 bean 的 id 是當前類的類名。首字母小寫。

以及@Controller @Service @Repository這三個註解與它的作用是一樣的,只是用來區分三層架構的

  • 1.3.2 @Autowired:用於注入資料的

作用:自動按照型別注入。當使用註解注入屬性時,set 方法可以省略。它只能注入其他 bean 型別。當有多個

型別匹配時,使用要注入的物件變數名稱作為 bean 的 id,在 spring 容器查詢,找到了也可以注入成功。找不到

就報錯。

  • 1.3.3@Qualifier

作用:在自動按照型別注入的基礎之上,再按照 Bean 的 id 注入。它在給欄位注入時不能獨立使用,必須和

@Autowire 一起使用;但是給方法引數注入時,可以獨立使用。

屬性:value:指定 bean 的 id

  • 1.3.4@Resource

作用:直接按照 Bean 的 id 注入。它也只能注入其他 bean 型別。

屬性:name:指定 bean 的 id

  • 1.3.5@Value

作用:注入基本資料型別和 String 型別資料的

屬性:value:用於指定值

  • 1.3.6@Scope

作用:指定 bean 的作用範圍。

屬性:value:指定範圍的值。

取值:singleton prototype request session globalsession

2.1和生命週期相關的:(瞭解)

相當於:<bean id="" class="" init-method="" destroy-method="" />

2.1.1 @PostConstruct

作用:用於指定初始化方法

2.1.2@PreDestroy

作用:用於指定銷燬方法

3.1新註解說明:@Configuration

作用:用於指定當前類是一個 spring 配置類,當建立容器時會從該類上載入註解。獲取容器時需要使用

AnnotationApplicationContext(有@Configuration 註解的類.class)。

屬性:value:用於指定配置類的位元組碼

3.1.1@Configuration

作用:用於指定當前類是一個 spring 配置類,當建立容器時會從該類上載入註解。獲取容器時需要使用

AnnotationApplicationContext(有@Configuration 註解的類.class)。

屬性:value:用於指定配置類的位元組碼

3.1.2@ComponentScan

作用:用於指定 spring 在初始化容器時要掃描的包。作用和在 spring 的 xml 配置檔案中的:

<context:component-scan base-package="com.itheima"/>是一樣的。

屬性:basePackages:用於指定要掃描的包。和該註解中的 value 屬性作用一樣。

3.1.3: @Bean

作用:該註解只能寫在方法上,表明使用此方法建立一個物件,並且放入 spring 容器。

屬性:name:給當前@Bean 註解方法建立的物件指定一個名稱(即 bean 的 id)

3.1.4:@PropertySource

作用:用於載入.properties 檔案中的配置。例如我們配置資料來源時,可以把連線資料庫的資訊寫到

properties 配置檔案中,就可以使用此註解指定 properties 配置檔案的位置。

屬性:value[]:用於指定 properties 檔案位置。如果是在類路徑下,需要寫上 classpath:

2、案例使用xml方式和註解方式實現單表的CRUD操作

1.實現crud操作:

1.1 建立實體類

package com.ximu.domain;

/**
 * @author 惜木
 * @version 1.0
 * @date 2020/12/25 20:34
 */
public class Account {
    private Integer id;
    private String name;
    private Float money;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Float getMoney() {
        return money;
    }

    public void setMoney(Float money) {
        this.money = money;
    }

    @Override
    public String toString() {
        return "Account{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", money=" + money +
                '}';
    }
}

1.2 建立Dao介面以及實現類

package com.ximu.dao;

import com.ximu.domain.Account;

import java.util.List;

/**
 * @author 惜木
 * @version 1.0
 * @date 2020/12/25 20:32
 */
public interface AccountDao {
    /**
     * 查詢所有
     * @return
     */
    List<Account> findAll();

    /**
     * 儲存賬戶
     * @param account
     */
    void saveAccount(Account account);

    /**
     * 刪除賬戶
     * @param id
     */
    void deleteAccount(Integer id);
}

package com.ximu.dao.impl;

import com.ximu.dao.AccountDao;
import com.ximu.domain.Account;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * @author 惜木
 * @version 1.0
 * @date 2020/12/25 20:41
 */
@Repository("accountDao")
public class AccountDaoImpl implements AccountDao {

    @Autowired
    private QueryRunner runner;

    @Override
    public List<Account> findAll() {
        try {
            return runner.query("select * from account",new BeanListHandler<Account>(Account.class));
        }catch (Exception e){
           throw new RuntimeException(e);
        }

    }

    @Override
    public void saveAccount(Account account) {
        try{
            runner.update("insert into account(name,money)values(?,?)",account.getName(),account.getMoney());
        }catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public void deleteAccount(Integer id) {
        try{
            runner.update("delete from account where id=?",id);
        }catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

1.3.建立service介面以及實現類物件

package com.ximu.service;

import com.ximu.domain.Account;

import java.util.List;

/**
 * @author 惜木
 * @version 1.0
 * @date 2020/12/25 20:40
 */
public interface AccountService {
    /**
     * 查詢所有
     * @return
     */
    List<Account> findAll();

    /**
     * 儲存賬戶
     * @param account
     */
    void saveAccount(Account account);

    /**
     * 刪除賬戶
     * @param id
     */
    void deleteAccount(Integer id);
}

package com.ximu.service.impl;

import com.ximu.dao.AccountDao;
import com.ximu.domain.Account;
import com.ximu.service.AccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @author 惜木
 * @version 1.0
 * @date 2020/12/25 20:41
 */
@Service("accountService")
public class AccountServiceImpl implements AccountService {

    @Autowired
    private AccountDao accountDao;

    @Override
    public List<Account> findAll() {
        return accountDao.findAll();
    }

    @Override
    public void saveAccount(Account account) {
        accountDao.saveAccount(account);
    }

    @Override
    public void deleteAccount(Integer id) {
        accountDao.deleteAccount(id);
    }
}

package com.ximu.test;

import com.ximu.domain.Account;
import com.ximu.service.AccountService;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.util.List;

/**
 * @author 惜木
 * @version 1.0
 * @date 2020/12/25 21:08
 */
public class MainTest {

    @Test
    public void findAllTest(){
        ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
        AccountService as = (AccountService) ac.getBean("accountService");
        List<Account> all = as.findAll();
        for (Account account : all) {
            System.out.println(account);
        }

    }

    @Test
    public void saveAccount(){
        ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
        AccountService as = (AccountService) ac.getBean("accountService");
        Account account = new Account();
        account.setName("張三");
        account.setMoney(125f);
        as.saveAccount(account);

    }
}

3、改造基於註解的ioc案例,使用純註解的方式實現

3.spring的一些新註解使用

4、spring和Junit整合

1、應用程式的入口
main方法
2、junit單元測試中,沒有main方法也能執行
junit集成了一個main方法
該方法就會判斷當前測試類中哪些方法有 @Test註解
junit就讓有Test註解的方法執行
3、junit不會管我們是否採用spring框架
在執行測試方法時,junit根本不知道我們是不是使用了spring框架
所以也就不會為我們讀取配置檔案/配置類建立spring核心容器
4、由以上三點可知
當測試方法執行時,沒有Ioc容器,就算寫了Autowired註解,也無法實現注入