天天看點

【Spring IOC容器】Bean管理的操作方式之基于注解

文章目錄

  • ​​Bean管理的操作方式之基于注解方式​​
  • ​​一、 注解概念​​
  • ​​二、 注解方式之建立對象​​
  • ​​@Component​​
  • ​​▶xml配置檔案​​
  • ​​▶UserService類​​
  • ​​▶測試類​​
  • ​​@Service​​
  • ​​@Controller​​
  • ​​@Repository​​
  • ​​三、 開啟元件掃描細節處理​​
  • ​​Ⅰ.配置context空間​​
  • ​​Ⅱ.開啟元件自動掃描​​
  • ​​Ⅲ.開啟元件自定義掃描(include)​​
  • ​​Ⅳ.開啟元件自定義掃描(exclude)​​
  • ​​四、注解方式之注入屬性​​
  • ​​@Autowired:根據屬性類型進行自動裝配​​
  • ​​@Qualifier:根據名稱進行注入​​
  • ​​@Resource:可以根據類型注入,可以根據名稱注入​​
  • ​​@Value:注入普通類型屬性​​
  • ​​五、完全注解開發​​
  • ​​Ⅰ.建立配置類,替代 xml 配置檔案​​
  • ​​Ⅱ.編寫流程類​​
  • ​​Ⅲ.編寫測試類​​

Bean管理的操作方式之基于注解方式

一、 注解概念

  • 1.定義:注解是指代碼特殊标記。
  • 2.格式:​

    ​@注解名稱(屬性名稱=屬性值,屬性名稱=屬性值...)​

  • 3.使用範圍:​

    ​類上面​

    ​、​

    ​方法上面​

    ​、​

    ​屬性上面​

  • 4.使用目的:​

    ​簡化xml配置​

二、 注解方式之建立對象

  • 第一步:引入依賴
  • 【Spring IOC容器】Bean管理的操作方式之基于注解
  • 第二步:開啟元件掃描
通過配置元件掃描,可以使得Spring自動掃描指定的包(package),而不必在Spring的配置檔案中逐一聲明各個​

​<bean>​

  • 如果掃描多個包:

    1.包之間使用逗号隔開:​

    ​base-package="Bean管理_注解方式.a,Bean管理_注解方式.b"​

    ​ 2.掃描包的上層目錄:​

    ​base-package="Bean管理_注解方式"​

  • 【Spring IOC容器】Bean管理的操作方式之基于注解
<?xml version="1.0" encoding="UTF-8"?>
<!--  1.配置context名稱空間  -->
<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">

    <!--  2.開啟元件掃描  -->
    <context:component-scan base-package="Bean管理_注解方式.a,Bean管理_注解方式.b"></context:component-scan>
</beans>      

@Component

▶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"
       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">

    <!--  開啟元件掃描  -->
    <context:component-scan base-package="Bean管理_注解方式"></context:component-scan>
</beans>      

▶UserService類

package Bean管理_注解方式.b;

import org.springframework.stereotype.Component;

// 注解方式建立對象 ---- 等共同于<bean id="" class=""></bean>
// 注解裡value的值可以不寫,預設值就是類名稱首字母小寫
@Component(value = "userService")
public class UserService {

    public void add(){
        System.out.println("UserService add .................");
    }

}      

▶測試類

public class Test {
    @org.junit.Test
    public void test_userService(){
        try {
            ApplicationContext context
                    = new ClassPathXmlApplicationContext("Bean管理_注解方式/bean_注解.xml");
            UserService userService = context.getBean("userService", UserService.class);
            System.out.println(userService);
            userService.add();
        } catch (Exception e){
            e.printStackTrace();
        }
    }
}      
【Spring IOC容器】Bean管理的操作方式之基于注解

​​傳回頂部​​

@Service

UserService類

package Bean管理_注解方式.b;

import org.springframework.stereotype.Component;

// 注解方式建立對象 ---- 等共同于<bean id="" class=""></bean>
// 注解裡value的值可以不寫,預設值就是類名稱首字母小寫
@Service(value = "userService")
public class UserService {

    public void add(){
        System.out.println("UserService add .................");
    }

}      
【Spring IOC容器】Bean管理的操作方式之基于注解

​​傳回頂部​​

@Controller

UserService類

package Bean管理_注解方式.b;

import org.springframework.stereotype.Component;

// 注解方式建立對象 ---- 等共同于<bean id="" class=""></bean>
// 注解裡value的值可以不寫,預設值就是類名稱首字母小寫
@Controller(value = "userService")
public class UserService {

    public void add(){
        System.out.println("UserService add .................");
    }

}      
【Spring IOC容器】Bean管理的操作方式之基于注解

​​傳回頂部​​

@Repository

UserService類

package Bean管理_注解方式.b;

import org.springframework.stereotype.Component;

// 注解方式建立對象 ---- 等共同于<bean id="" class=""></bean>
// 注解裡value的值可以不寫,預設值就是類名稱首字母小寫
@Repository(value = "userService")
public class UserService {

    public void add(){
        System.out.println("UserService add .................");
    }

}      
【Spring IOC容器】Bean管理的操作方式之基于注解

Spring 針對 Bean 管理中建立對象提供注解:

(1)​

​@Component​

​ (2)​

​@Service​

(3)​

​@Controller​

(4)​

​@Repository​

由測試結果可知,上面四個注解功能是一樣的,都可以用來建立 bean 執行個體。

​​傳回頂部​​

三、 開啟元件掃描細節處理

Ⅰ.配置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">      

Ⅱ.開啟元件自動掃描

  • 使用預設的filter,自動掃描base-package下的所有子包及其類
<!--  開啟元件掃描  -->
    <!--  使用預設的filter,自動掃描base-package下的所有子包及其類  -->
    <context:component-scan base-package="Bean管理_注解方式"></context:component-scan>      

Ⅲ.開啟元件自定義掃描(include)

  • ​use-default-filters="false"​

    ​ 表示不使用預設的filter,使用自定義的filter
  • ​ontext:include-filter​

    ​ 表示掃描包含哪些内容
  • ​expression="org.springframework.stereotype.Controller"​

    ​ 表示掃描元件的時候,僅掃描包中用Controller注解方式的類。
<!--  use-default-filters="false" 表示不使用預設的filter,使用自定義的filter  -->
    <context:component-scan base-package="Bean管理_注解方式" use-default-filters="false">
        <!--  context:include-filter 表示掃描包含哪些内容    -->
        <!--  type=“annotation” 表示注解方式    -->
        <!--  expression="org.springframework.stereotype.Controller 表示掃描含有Controller注解方式的類    -->
        <context:include-filter type="annotation"
                                expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>      

Ⅳ.開啟元件自定義掃描(exclude)

  • ​context:exclude-filter​

    ​ 表示掃描不包含哪些内容
<!--  use-default-filters="false" 表示不使用預設的filter,使用自定義的filter  -->
    <context:component-scan base-package="Bean管理_注解方式" use-default-filters="false">
        <!--  context:exclude-filter 表示掃描不包含哪些内容    -->
        <!--  type=“annotation” 表示注解方式    -->
        <!--  expression="org.springframework.stereotype.Controller 表示掃描除了含有Controller注解方式的類    -->
        <context:include-filter type="annotation"
                                expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>
</beans>      

​​傳回頂部​​

四、注解方式之注入屬性

import org.springframework.beans.factory.annotation.​

​Autowired​

​;

import org.springframework.beans.factory.annotation.​

​Qualifier​

​;

import org.springframework.beans.factory.annotation.​

​Value​

​;

import ​

​javax.annotation.Resource​

​;

注意:在以上的屬性注解中Resource是唯一Spring架構外部的包。

@Autowired:根據屬性類型進行自動裝配

  • 在這裡我們定義UserDao接口及其實作類UserDaoImpl,我們要在UserService類中添加UserDao對象屬性,并在其add()方法中去調用UserDao的add()方法。
  • 第一步 把 service 和 dao 對象建立,​

    ​在 service 和 dao 類添加建立對象注解​

    ​。
  • 第二步 在 service 注入 dao 對象,​

    ​在 service 類添加 dao 類型屬性,在屬性上面使用注解@Autowired​

    ​。
public interface UserDao {
    public void add();
}

import org.springframework.stereotype.Repository;

@Repository //  1.添加注解,建立對象
public class UserDaoImpl implements UserDao {
    @Override
    public void add() {
        System.out.println("UserDaoImpl add ............");
    }
}      
import Bean管理_注解方式.a.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

// 1.注解方式建立對象 ---- 等共同于<bean id="" class=""></bean>
//   注解裡value的值可以不寫,預設值就是類名稱首字母小寫
@Component(value = "userService")
public class UserService {

    // 2.定義對象屬性并添加上注解
    @Autowired
    private UserDao userDao;

    public void add(){
        System.out.println("UserService add .................");
        userDao.add();
    }

}      
public class Test {
    @org.junit.Test
    public void test_userService(){
        try {
            ApplicationContext context
                    = new ClassPathXmlApplicationContext("Bean管理_注解方式/bean_注解.xml");
            UserService userService = context.getBean("userService", UserService.class);
            System.out.println(userService);
            userService.add();
        } catch (Exception e){
            e.printStackTrace();
        }
    }
}      
【Spring IOC容器】Bean管理的操作方式之基于注解

​​傳回頂部​​

@Qualifier:根據名稱進行注入

  • @Qualifier 注解的使用,和上面@Autowired 一起使用。
  • 根據名稱進行注入,是為了防止一個接口有多個實作類,根據類型自動注入的時候無法判定是哪一個具體的實作類。這樣我們可以通過在建立類對象的時候對對象注釋的value值進行設定,然後通過​

    ​value值​

    ​進行判斷注入屬性。
import org.springframework.stereotype.Repository;

@Repository(value = "userDaoImpl1")
public class UserDaoImpl implements UserDao {
    @Override
    public void add() {
        System.out.println("UserDaoImpl add ............");
    }
}

// 注解方式建立對象 ---- 等共同于<bean id="" class=""></bean>
// 注解裡value的值可以不寫,預設值就是類名稱首字母小寫
@Component(value = "userService")
public class UserService {

    // 定義對象屬性并添加上注解
    @Autowired
    @Qualifier(value = "userDaoImpl1")
    private UserDao userDao;

    public void add(){
        System.out.println("UserService add .................");
        userDao.add();
    }

}      

​​傳回頂部​​

@Resource:可以根據類型注入,可以根據名稱注入

  • 隻需要更改屬性注入的類型為​

    ​@Resource​

    ​,預設就是根據類型注入,相當于​

    ​@AutoWired​

  • 添加屬性​

    ​name=" "​

    ​,就是根據名稱注入,這裡的name值就相當于value值。
@Resource  // 1.根據類型注入
@Resource(name = "UserDaoImpl1")  // 2.根據名稱注入
private UserDao userDao;      

​​傳回頂部​​

@Value:注入普通類型屬性

  • 上面的幾種屬性的注入方式都是針對對象類型的屬性而言的,而​

    ​@Value是針對于普通類型的屬性,如:String、int等​

    ​。
// 注解方式建立對象 ---- 等共同于<bean id="" class=""></bean>
// 注解裡value的值可以不寫,預設值就是類名稱首字母小寫
@Component(value = "userService")
public class UserService {

    // 普通屬性注入
    @Value(value = "zyx")
    private String name;
    // 定義對象屬性并添加上注解
    @Autowired
    @Qualifier(value = "userDaoImpl1")
    private UserDao userDao;

//    @Resource(name = "UserDaoImpl1")
//    private UserDao userDao;

    public void add(){
        System.out.println("UserService add ................."+name);
        userDao.add();
    }

}      
【Spring IOC容器】Bean管理的操作方式之基于注解
以上就是基本的注解方式進行Bean管理的操作,整個過程簡化了xml檔案配置,隻使用到了一次配置元件掃描!

​​傳回頂部​​

五、完全注解開發

在開發的過程中,為了簡化xml檔案配置,我們還可以做到完全注解開發。就是不需要配置任何的xml檔案,純使用注解的方式進行。

Ⅰ.建立配置類,替代 xml 配置檔案

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration // 添加注解作為配置類,替代xml配置檔案
@ComponentScan(basePackages = {"Bean管理_注解方式"}) // 配置元件掃描
public class SpringConfig {
    
}      

Ⅱ.編寫流程類

UserDao接口:
public interface UserDao {
    public void add();
}

UserDaoImpl實作類:
import org.springframework.stereotype.Repository;

@Repository(value = "userDaoImpl1")
public class UserDaoImpl implements UserDao {
    @Override
    public void add() {
        System.out.println("UserDaoImpl add ............");
    }
}

UserService類:
import Bean管理_注解方式.a.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;

// 注解方式建立對象 ---- 等共同于<bean id="" class=""></bean>
// 注解裡value的值可以不寫,預設值就是類名稱首字母小寫
@Component(value = "userService")
public class UserService {

    // 普通屬性注入
    @Value(value = "zyx")
    private String name;
    // 定義對象屬性并添加上注解
    @Autowired
    @Qualifier(value = "userDaoImpl1")
    private UserDao userDao;

    public void add(){
        System.out.println("UserService add ................."+name);
        userDao.add();
    }

}      

Ⅲ.編寫測試類

  • 由于更改了完全注解方式開發,是以原先的配置注解xml配置檔案的方式就不行了;現在,使用​

    ​AnnotationConfigApplicationContext(SpringConfig.class)​

    ​的方式來進行加載注解配置類,實作與xml配置檔案相同的效果。
@org.junit.Test
public void test_userService() {
    try {
        // 加載注解配置類
        ApplicationContext context
                = new AnnotationConfigApplicationContext(SpringConfig.class);
        UserService userService = context.getBean("userService", UserService.class);
        System.out.println(userService);
        userService.add();
    } catch (Exception e) {
        e.printStackTrace();
    }
}