文章目錄
- Bean管理的操作方式之基于注解方式
- 一、 注解概念
- 二、 注解方式之建立對象
- @Component
- ▶xml配置檔案
- ▶UserService類
- ▶測試類
- @Service
- @Controller
- @Repository
- 三、 開啟元件掃描細節處理
- Ⅰ.配置context空間
- Ⅱ.開啟元件自動掃描
- Ⅲ.開啟元件自定義掃描(include)
- Ⅳ.開啟元件自定義掃描(exclude)
- 四、注解方式之注入屬性
- @Autowired:根據屬性類型進行自動裝配
- @Qualifier:根據名稱進行注入
- @Resource:可以根據類型注入,可以根據名稱注入
- @Value:注入普通類型屬性
- 五、完全注解開發
- Ⅰ.建立配置類,替代 xml 配置檔案
- Ⅱ.編寫流程類
- Ⅲ.編寫測試類
Bean管理的操作方式之基于注解方式
一、 注解概念
- 1.定義:注解是指代碼特殊标記。
- 2.格式:
@注解名稱(屬性名稱=屬性值,屬性名稱=屬性值...)
- 3.使用範圍:
、類上面
、方法上面
屬性上面
- 4.使用目的:
簡化xml配置
二、 注解方式之建立對象
- 第一步:引入依賴
- 第二步:開啟元件掃描

通過配置元件掃描,可以使得Spring自動掃描指定的包(package),而不必在Spring的配置檔案中逐一聲明各個 <bean>
-
如果掃描多個包:
1.包之間使用逗号隔開:
2.掃描包的上層目錄:base-package="Bean管理_注解方式.a,Bean管理_注解方式.b"
base-package="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();
}
}
}
傳回頂部
@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 .................");
}
}
傳回頂部
@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 .................");
}
}
傳回頂部
@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 針對 Bean 管理中建立對象提供注解:
(1)
(2)
@Component
@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)
-
表示不使用預設的filter,使用自定義的filteruse-default-filters="false"
-
表示掃描包含哪些内容ontext:include-filter
-
表示掃描元件的時候,僅掃描包中用Controller注解方式的類。expression="org.springframework.stereotype.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();
}
}
}
傳回頂部
@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值就相當于value值。name=" "
@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();
}
}
以上就是基本的注解方式進行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配置檔案的方式就不行了;現在,使用
的方式來進行加載注解配置類,實作與xml配置檔案相同的效果。AnnotationConfigApplicationContext(SpringConfig.class)
@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();
}
}