1. 程式人生 > >spring註解 @primary

spring註解 @primary

@Primary:意思是在眾多相同的bean中,優先使用用@Primary註解的bean。

1.在多資料來源的時候,使用@Primary註解用於指定其中一個作為主資料來源,即如果資料庫操作沒有指明使用哪個資料來源的時候,預設使用主資料來源,這個時候我們就使用到了@primary這個註解。

在此之前先認識一下@Qualifier、@Bean註解的意思:

@Qualifier:指定某個bean有沒有資格進行注入。

@Bean:用於告訴方法,產生一個Bean物件,然後這個Bean物件交給Spring管理。產生這個Bean物件的方法Spring只會呼叫一次,隨後這個Spring將會將這個Bean物件放在自己的IOC容器中。

在專案中的使用:

@Configuration
@MapperScan(basePackages = "com.dunoinfo.jsqxt.estimate.algorithm.repository.oracle", sqlSessionTemplateRef = "oracleSemiSqlSessionTemplate")
public class DruidConfig {
    private Logger logger = LoggerFactory.getLogger(DruidConfig.class);

    @Bean(name = "oracleSemiDataSource")     //宣告其為Bean例項
    @ConfigurationProperties("spring.datasource.druid")
    @Primary  //在同樣的DataSource中,首先使用被標註的DataSource
    public DataSource dataSource() {
        return DruidDataSourceBuilder.create().build();
    }

    @Bean(name = "oracleSemiSqlSessionFactory")
    @Primary
    public SqlSessionFactory oracleSqlSessionFactory(@Qualifier("oracleSemiDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/oracle/semi/*.xml"));
        return bean.getObject();
    }

    @Bean(name = "oracleSemiSqlSessionTemplate")
    @Primary
    public SqlSessionTemplate oracleSqlSessionTemplate(@Qualifier("oracleSemiSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

2.當對同一個介面可能會有幾種不同的實現類時,預設情況下只會採用其中的一種情況,使用@Primary註解來進行宣告優先選擇哪一個。

如下面的一個小例子:

先定義一個Person介面,有一個Study方法:

public interface Person {
    public void study(String subject);
}

再給此介面定義兩個子類,其中一個加@Component註解進行宣告,將其例項化到spring容器中;另一個子類不加註解:

@Component
public class StudentLi implements Person{
    @Override
    public void study(String subject) {
        System.out.println("I'm Li Lei. I'm learning "+subject);
    }
}
public class StudentHan implements Person{
    @Override
    public void study(String subject) {
        System.out.println("I'm Han Meimei. I'm learning "+subject);
    }
}

注入介面實現類進行測試:

@Controller
@RequestMapping(value = "/primary")
public class TestPrimary {
    @Autowired
    private Person person;

    @RequestMapping(value = "test", method = RequestMethod.GET)
    @ResponseBody
    public void Test(){
        person.study("Chinese");
    }
}

輸出結果:I'm Li Lei. I'm learning Chinese

這個結果毫無疑問,因為StudentHan.java這個實現類沒有加@Component註解,無法被加入到spring容器,下面對該實現類新增@Component註解,再進行測試。執行時程式出現異常,由於我們有兩個實現類,spring無法確定注入哪一個。

在StudentHan.java實現類上新增@Primary註解進行宣告,再進行測試。

@Primary
@Component
public class StudentHan implements Person{
    @Override
    public void study(String subject) {
        System.out.println("I'm Han Meimei. I'm learning "+subject);
    }
}

輸出結果:I'm Han Meimei. I'm learning Chinese

相關推薦

spring註解 @primary

@Primary:意思是在眾多相同的bean中,優先使用用@Primary註解的bean。 1.在多資料來源的時候,使用@Primary註解用於指定其中一個作為主資料來源,即如果資料庫操作沒有指明使用哪個資料來源的時候,預設使用主資料來源,這個時候我們就使用到了@prima

spring 註解@primary解析

spring中少見的註解@primary註解,例子 @Component public class MetalSinger implements Singer{ @Override public String sing(St

關於@Profile、@Conditional、@Primary、@Qualifier及@Scope等實現高階裝配的spring註解

1、關於@Profile註解的介紹 @Profile註解主要用在針對不同環境而條件選擇的注入bean 在開發過程中由於環境的不同,我們可能在針對某些功能,需要開發不同的實現,然而在某種環境中,只能啟用其中一種實現,其他的實現處於不啟用的狀態。這個時候我們在需要建立的bean上新增@Profi

Spring註解解釋(@Primary、@Qualifier)

@Primary/@Qualifier 當你一個介面的實現類有多個的時候,你通過@Component來註冊你的實現類有多個,但是在注入的時候使用@Autowired 這樣問題就來了,Sp

spring中少用的註解@primary解析

這次看下spring中少見的註解@primary註解,例子  Java程式碼   @Component   public class MetalSinger implements Singer{       @Override       public String 

Spring註解驅動開發】使用@Autowired@Qualifier@Primary三大註解自動裝配元件,你會了嗎?

## 寫在前面 > 【Spring專題】停更一個多月,期間在更新其他專題的內容,不少小夥伴紛紛留言說:冰河,你【Spring專題】是不是停更了啊!其實並沒有停更,只是中途有很多小夥伴留言說急需學習一些知識技能,以便於跳槽,哈哈,大家都懂得!所以,中途停更了一段時間,寫了一些其他專題的文章。現在,繼續更

spring註解1

XML itcast autowire spa cast encoding ans 測試 目錄 1. src下目錄結構如下: 2.測試類 public class App { // 創建容器對象 private ApplicationContext ac = ne

spring註解使用介紹

print sqlite 測試 www oca oid pat 不知道 text 註解註入顧名思義就是通過註解來實現註入,Spring和註入相關的常見註解有Autowired、Resource、Qualifier、Service、Controller、Repository、

Spring註解註入

path qualifier tpms @value scope 會話 數據類型 rep person 在使用註解前必須對Spring容器進行頭文件導入和配置上下文環境。 1 <?xml version="1.0" encoding="UTF-8"?>

Spring註解詳細

組件 ostc use stc 註入 pac 管理 類名 初始 [email protected]/* */ 控制器(註入服務) [email protected]/* */ 服務(註入dao) [email protected]/* *

JAVAEE——SSH項目實戰06:統計信息管理、Spring註解開發和EasyUI

disabled path -a ted efault pen ret 發送 tran 作者: kent鵬 轉載請註明出處: http://www.cnblogs.com/xieyupeng/p/7190925.html 一、統計信息管理    二、Spring

spring註解使用

spring一、使用註解前,在配置文件中,引入context命名空間xmlns:context=http://www.springframework.org/schema/context xsi:schemaLocation="http://www.springframework.org/schema/bea

spring註解和增強

value pac bsp spring註解 www. framework spring val 註解 1.添加xsd約束 xmlns:context="http://www.springframework.org/schema/context" http://w

Spring註解Annotion——2017.08.27

pos cnblogs 我們 XML brush not 作用 ice ann 1 Spring中註解起的作用 前提是要在xml配置文件中 <context:compoent-scan base-package="cn.itcast"> &

eclipse-搭建maven的war項目集合spring註解方式

eap 初始化 打印 owin artifact mapping line welcom b- 工具:eclipse 4.4.2 版本號:20150219-0600 jdk:1.7 1.下圖創建maven工程,然後next 下圖選擇工程保存位置(這裏選擇默認),nex

spring註解預覽

number 如果 ada 調用 over ati rri autowired 一個 從Java5.0開始,Java開始支持註解。Spring做為Java生態中的領軍框架,從2.5版本後也開始支持註解。相比起之前使用xml來配置Spring框架,使用註解提供了更多的控制Sp

關於Spring註解

地址 eight 多個 共享 factory wid orm 操作 獲取url 整理自網上: AnnotationPackage Detail/Import statement @Service import org.spring

Spring註解

xml文件 onf ons use j2ee resource ota commons pac 1.@Autowired (這個是Spring自帶的,需要在.xml文件中配上 <context:annotation-config />)不過Spring2.5

Spring Boot 動態數據源(Spring 註解數據源)

sample maximum 多個 prefix password auth 映射 boot 發出 本文實現案例場景:某系統除了需要從自己的主要數據庫上讀取和管理數據外,還有一部分業務涉及到其他多個數據庫,要求可以在任何方法上可以靈活指定具體要操作的

Spring 註解學習筆記

list tty ping mode source sse mage 告訴 profile 聲明Bean的註解: @Component : 組件,沒有明確的角色 @Service : 在業務邏輯層(service層)使用 @Repository : 在數據訪問層(