1. 程式人生 > >小慶的Spring學習筆記二

小慶的Spring學習筆記二

包含 解決 byname -a interface 實現類 第三方 inter 整合

Spring基於註解的裝配

一.spring基於註解配置bean

正常情況下我們在xml配置bean,但是我們為了減少xml配置,可以在類上使用一些特定註解向Spring容器表明這是一個需要註冊的bean。常用的註解有@Configure、@Component、@Reposity、@Service、@Controller。

 傳統的在xml中裝配bean的方式 
<bean id="baishi" class="com.yqg.springannotation.BaiShi"></bean>
<bean id="kekou" class="com.yqg.springannotation.KeKou"></bean> <bean id="work" class
="com.yqg.springannotation.Work"></bean>

使用包掃描,基於註解註冊bean的方式,包含子包,註冊的bean名稱為類名首字母小寫,如Student類,註冊的名稱為student
<context:component-scan base-package="com.yqg.springannotation"></context:component-scan>

  

二、使用註解註入依賴的bean

我們使用@Autowried、@resource這兩個註解將bean註入,使用註解的好處是不用在配置文件中使用ref註入bean,不用在需要註入bean的類中使用get和set,代碼簡潔。但是有些類比如整合第三方類,我們不得不使用xml配置bean。

代碼示例

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">
    <bean id="baishi" class="com.yqg.springannotation.BaiShi"></bean>
    <bean id="kekou" class="com.yqg.springannotation.KeKou"></bean>
    <bean id="work" class="com.yqg.springannotation.Work"></bean>
</beans>

一個接口以及兩個實現類

package com.yqg.springannotation;

/**
 * @author yqg
 * @date 2019-02-15 21:31
 */

public interface Drink {
    /**
     * 測試Spring註解
     */

    public void say();
}

  

package com.yqg.springannotation;

/**
 * @author yqg
 * @date 2019-02-15 21:32
 */
public class BaiShi implements Drink{

    public void say() {
        System.out.println("百事可樂");
    }
}

  

package com.yqg.springannotation;

/**
 * @author yqg
 * @date 2019-02-15 21:33
 */
public class KeKou implements Drink{

    public void say() {
        System.out.println("可口可樂");
    }
}

使用註解註入依賴的類Work

package com.yqg.springannotation;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;

import javax.annotation.Resource;

/**
 * @author yqg
 * @date 2019-02-15 21:44
 */
public class Work {

    public void work(){
        baiShi.say();
        keKou.say();
    }

//    public void work(){
//        drink.say();
//    }
    @Autowired(required = false)
    /**
     * 百事可樂
     */
    private BaiShi baiShi;
    @Resource(name = "kekou")
    private KeKou keKou;
//    @Autowired
//    @Qualifier(value = "baishi")
//    private Drink drink;
}

  測試類

package com.yqg.springannotation;

import com.yqg.util.ApplicationContextUtil;
import org.junit.Test;
import org.springframework.context.ApplicationContext;

/**
 * @author yqg
 * @date 2019-02-15 21:38
 */
public class AnnotationTest {
    @Test
    public void test(){
        ApplicationContext applicationContext =  ApplicationContextUtil.getApplicationContext();
        Work work = applicationContext.getBean("work",Work.class);
        work.work();
    }

}

  

@Resource和@AutoWried兩者作用一樣,但是兩者也有差別

1.@Resource默認按照byName註冊bean,如果沒有就按類型,可以@Resource(name="")指定bean的名稱,@Autowired默認按類型註入

2.@Resource是javaEE的註解,@Autowried是spring的註解,盡量使用@Resource,減少第三方代碼耦合

@qualifier註解是解決是實現類不確定問題,比如一個接口多個實現類,我們將該接口註入,那麽spring容器不能確定使用哪個實現類,我們可以使用@qualifier和@Autowried結合使用。

小慶的Spring學習筆記二