1. 程式人生 > 其它 >Spring學習筆記(五)--基於註解的Bean操作管理

Spring學習筆記(五)--基於註解的Bean操作管理

接下來來學習註解

什麼是註解

  • 註解是程式碼特殊標記,格式:@註解名稱(屬性名稱=屬性值)

  • 註解作用在類,方法,屬性上

  • 使用註解目的:簡化xml配置

Spring針對Bean管理建立物件提供的註解種類

  • @Component

  • @Service

  • @Controller

  • @Repository
    註解的實現需要引入spring-aop-5.2.6.RELEASE

實現步驟

  1. 開啟元件掃描(引入context名稱空間)
<?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"
>

    <!--
        開啟元件掃描
           1 如果掃描多個包,多個包用逗號隔開
           2 寫上需要掃描包的上層目錄
             掃描 com.day6 包下所有的類
    -->
    <context:component-scan base-package="com.day6"></context:component-scan>

</beans>
  1. 建立UserService類和測試類
    UserService類
@Service
public class UserService {
    public void add(){
        System.out.println("service add...");
    }
}

測試類

public class test {
    @Test
    public void test(){
        ClassPathXmlApplicationContext context =
                new ClassPathXmlApplicationContext("com/day6/spring5/zhujie/bean.xml");
        // 這裡getBean的name屬性值,預設是需要建立物件的類的首字母小寫
        UserService userService = context.getBean("userService", UserService.class);
        userService.add();
    }
}

//輸出
service add...

3.開啟元件掃描細節配置

<!--示例1
        use-default-filters="false" 表示現在不適用預設filter,自己配置filter
        context:include-filter , 設定掃描哪些內容
-->
<context:component-scan base-package="com.day6" use-default-filters="false">
    <context:include-filter type="annotation"
                            expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

<!--示例2
        下面配置掃描包的所有內容
        context:exclude-filter , 設定哪些內容不掃描
-->
<context:component-scan base-package="com.day6">
    <context:exclude-filter type="annotation" 
                            expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

基於註解方式實現屬性注入

用到四個註解:@Autowired @Qulifier @Resource @Value

  • @AutoWired:根據屬性型別進行自動注入
    使用到的類: Service類、Dao類

第一步:把Service和Dao物件建立 (在Service類上新增@Service,在Dao類上新增@Repository)

第二步:在Service中注入Dao物件,在Service中新增dao型別屬性,在屬性上添加註解@Autowired

//Service類
public class Service{
  @Autowired
  private Dao dao;
  public void add(){
    System.out.println("service add ...");
    dao.add();
  }
}

//Dao類
public class Dao{
  public void add(){
    System.out.println("dao add ...");
  }
}

xml配置檔案

 <context:component-scan base-package="com.qy"></context:component-scan>

測試類

//測試類
public class test {
    @Test
    public void test(){
        ClassPathXmlApplicationContext context =
                new ClassPathXmlApplicationContext("com/qy/spring5/zhujie/bean.xml");

        // 這裡getBean的name屬性值,預設是需要建立物件的類的首字母小寫
        UserService userService = context.getBean("userService", UserService.class);
        userService.add();
    }
}

//輸出結果
service add...
dao add...

2.@Qualifier:根據屬性名稱進行注入,需要和@Autowired配合使用
它用於何處?
比如說現在有 Service類,Dao介面,DaoImpl1實現類(實現Dao介面),DaoImpl2實現類(實現Dao介面),這時候我們再使用@Autowired根據型別進行注入的話,因為有兩個實現類,那麼就不知道要注入哪個實現類了,所以要使用@Qualifier註解。
演示

//UserService類
@Service(value = "userService")
public class UserService {
    @Autowired
    @Qualifier(value = "userDaoImpl1")
    private UserDao userDaoImpl1;
    @Autowired
    @Qualifier(value = "userDaoImpl2")
    private UserDao userDaoImpl2;

    public void add(){
        System.out.println("service add ...");
        userDaoImpl1.add();
        userDaoImpl2.add();
    }
}

//UserDao介面
public interface UserDao {
    public void add();
}

//UserDaoImpl1實現類
@Repository(value = "userDaoImpl1")
public class UserDaoImpl1 implements UserDao{
    @Override
    public void add() {
        System.out.println("UserDaoImpl1 第一個實現類 add ...");
    }
}

//UserDaoImpl2實現類
@Repository(value = "userDaoImpl2")
public class UserDaoImpl2 implements UserDao{
    @Override
    public void add() {
        System.out.println("UserDaoImpl2 第二個實現類 add ...");
    }
}

//XML配置檔案
<context:component-scan base-package="com.qy"></context:component-scan>

//測試類
public class test {
    @Test
    public void test(){
        ClassPathXmlApplicationContext context =
                new ClassPathXmlApplicationContext("com/qy/spring5/qualifier/bean.xml");
        // 這裡getBean的name值預設是UserService首字母小寫,可以在UserService上通過註解設定 @Service(value = "")
        UserService userService = context.getBean("userService", UserService.class);
        userService.add();
    }
}

//輸出
service add ...
UserDaoImpl1 第一個實現類 add ...
UserDaoImpl2 第二個實現類 add ...

3.@Resource:可以根據型別注入,可以根據名稱注入

  • 根據型別注入
@Resource
private UserDao userDaoImpl;
  • 根據名稱注入
@Resource(name = "userDaoImpl2")
private UserDao userDaoImpl2;

4.@Value:注入普通型別屬性

@Value(value = "abc")
private String name;  // 將abc注入到屬性name中

完全註解開發

1.建立配置類(新增@Configuration註解),替代xml配置檔案

@Configuration // 作為配置類,替代xml配置檔案
@ComponentScan(basePackages = {"com.day6"})
public class SpringConfig {
}

2.測試類中也需要替換

public class test {
    @Test
    public void test(){
        // 載入配置類
        AnnotationConfigApplicationContext context = 
                new AnnotationConfigApplicationContext(SpringConfig.class);
        
        UserService userService = context.getBean("userService", UserService.class);
        userService.add();
    }
}

總結

我個人認為註解是一種作用於類上的注入方式,很大程度上提升了程式設計師對類的管理,通過觀察就可以知道類的主要資訊,但是卻難以整理,和xml方式相比,只能說各有千秋吧.