網站首頁 編程語言 正文
1 什么是注解開發?
在 Spring 中提供了豐富的注解來替代之前的 xml 配置文件。注解開發能極大的提高我們開發的效率。但是其底層使用的其實還是 xml 配置的方式,注解不過是簡化了開發。
2 使用配置類替代配置文件
(1)配置類
/**
* 配置類,代替xml配置文件
* Configuration 聲明這是配置類
* ComponentScan 代替xml中使用標簽配置包掃描的范圍
* PropertySource 添加配置文件,方便寫入參數,最好前面使用 classpath
*
*/
@Configuration
@ComponentScan("cn.edu.njust")
//@PropertySource("jdbc.properties")
@PropertySource("classpath:jdbc.properties")
public class SpringConfig {
}
- 有了這個類,我們就可以直接刪掉
applicationContext.xml
文件; - 之后會使用這個配置類來加載 Spring 的上下文信息;
(2)使用配置類來獲取 IoC 容器
/**
* 使用配置類代替配置文件
*/
public class TestDemo03 {
public static void main(String[] args) {
// 加載配置類獲取IoC容器對象
ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
UserDao userDao1 = ctx.getBean("userDao", UserDao.class);
userDao1.run();
}
}
3 使用注解管理 bean 對象
相比于使用 xml 文件配置 bean 對象,使用注解配置 bean 對象更加的方便;
3.1 將一個類聲明為 bean 對象
(1)@Component
:一個很通用的注解,有這個注解聲明的類,IoC 容器就可以對其 bean 對象進行管理;一般情況下,如果某個類不知道其所屬的層,如持久層、服務層或者控制層,但是又希望將其 bean 對象交給 IoC 容器管理,就可以使用這個注解。
(2)@Repository
:持久層注解,一個類被這個注解聲明,表示這個類是位于持久層,對數據庫進行操作;
(3)@Service
:服務層注解,該聲明表示這個類位于服務處,一般會涉及較為復雜的業務邏輯,同時,這個中通常會使用到持久層的 bean 對象;
(4)@Controller
:控制層注解,該聲明表示這個類是控制層的,在 SpringMVC 中,這個層交給 SpringMVC 的上下文管理,主要是負責接收前端的請求,并且將調用 Service 層的業務,完成處理后將信息返回給前端。這個層中會使用到服務處的 bean 對象;
(5)說明:@Repository、@Service、@Controller 這三個注解都是對@Component 注解的封裝。
3.2 @Component 替換 bean 標簽
直接在相應的實現類上使用 @Component 注解,即可將該類的實現類放松 IoC 容器中進行 bean 管理。
/**
* Component: 就是聲明一個 bean,id為 userDao
*/
@Component("userDao")
public class UserDaoImpl implements UserDao {
@Override
public void run() {
System.out.println("UserDao is running...");
}
}
- 其他的幾個注解使用方式類似
4 依賴注入
4.1 按名稱依賴注入
單獨使用 Autowired,默認是按類型自動配置,但是當 IoC 容器中有多個同類型的 bean 對象的時,會出現問題,解決方法是使用按名稱自動配置的方式,即在多個 bean 對象使用@Component 注解的時候,后面指定名稱,然后使用@Qualifier 指定具體是哪個類。
(1)@Autowired 聲明在變量上
package cn.edu.njust.service.impl;
import cn.edu.njust.dao.UserDao;
import cn.edu.njust.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
@Component("userService")
public class UserServiceImpl implements UserService {
/*
* Autowired 直接作用在成員變量上
* 直接作用在成員變量類型上是因為底層使用的是暴力反射的機制
* */
@Autowired
private UserDao userDao;
@Override
public void run() {
System.out.println("UerService is running...");
userDao.run();
}
}
- 注解直接聲明在變量上,是因為 Spring 底層使用的是暴力反射,所以可以直接獲取變量賦值
- 這樣的方式是屬于按名稱自動配置的;
(2)@Autowired 聲明在 setter 上
package cn.edu.njust.service.impl;
import cn.edu.njust.dao.UserDao;
import cn.edu.njust.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
@Component("userService")
public class UserServiceImpl implements UserService {
/*
* Autowired 直接作用在成員變量上
* 直接作用在成員變量類型上是因為底層使用的是暴力反射的機制
* 可以直接獲取到這個屬性賦值,不需要使用setter
* 當然作用在setter上也是沒有問題的
* */
private UserDao userDao;
@Override
public void run() {
System.out.println("UerService is running...");
userDao.run();
}
/**
* Autowired 注解可以放在setter方法上
* @param userDao
*/
@Autowired
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
}
4.2 按名稱自動配置
同比 xml 配置的方式,也可以使用按名稱自動配置,需要使用@Qualifier
注解配合
package cn.edu.njust.service.impl;
import cn.edu.njust.dao.UserDao;
import cn.edu.njust.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
@Component("userService")
public class UserServiceImpl implements UserService {
/*
* Autowired 直接作用在成員變量上
* 直接作用在成員變量類型上是因為底層使用的是暴力反射的機制
* 可以直接獲取到這個屬性賦值,不需要使用setter
* 當然作用在setter上也是沒有問題的
* */
@Autowired
@Qualifier("userDao2")
private UserDao userDao;
@Override
public void run() {
System.out.println("UerService is running...");
userDao.run();
}
}
- Autowired:指明自動配置
- Qualifier:表明按名稱自動配置,在括號內使指明 bean 對象的名稱;
4.3 簡單數據類型的注入
@Component
public class DataSourceServiceImpl implements DataSourceService {
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
@Override
public void run() {
System.out.println("username = " + username + "&password = " + password);
}
}
@Value(" j d b c . u s e r n a m e " ) 中, {jdbc.username}")中, jdbc.username")中,{}表示引用配置文件中的某數據
4.4 配置第三方 Bean
4.4.1 在 Spring 的配置文件中配置
package cn.edu.njust.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
/**
* 配置類,代替xml配置文件
* Configuration 聲明這是配置類
* ComponentScan 代替xml中使用標簽配置包掃描的范圍
* PropertySource 添加配置文件,方便寫入參數,最好前面使用 classpath
*
*/
@Configuration
@ComponentScan("cn.edu.njust")
// @PropertySource("jdbc.properties")
@PropertySource("classpath:jdbc.properties")
public class SpringConfig {
@Value("${jdbc.driver}")
private String driver;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
@Bean
public DataSource dataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl("jdbc:mysql://localhost:3306/spring_db");
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUsername("root");
dataSource.setPassword("root");
return dataSource;
}
}
這種方式簡單粗暴,但是不推薦,原因是如果需要配置大量的第三方 bean,會照成配置類混亂;
4.4.2 額外聲明配置類
(1)直接聲明為配置類
package cn.edu.njust.config;
import cn.edu.njust.dao.UserDao;
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
/**
* 專門配置數據源的配置類
* 有兩種方式可以讓這個文件正常加載
* 1)Configuration: 直接將其聲明為配置類,在整個項目的配置文件中可以掃描到該類即可
* 2)刪除Configuration: 在配置類中使用 Import 注解引入這個配置類
*/
@Configuration
public class JDBCConfig {
@Value("${jdbc.driver}")
private String driver;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
/**
* 第三方Bean中使用到其他的bean對象,做法是將該bean對象使用注解放在IoC容器中
*
* @param userDao 使用到的bean對象,直接用參數的形式傳遞進入即可
* @return
*/
@Bean
public DataSource dataSource(UserDao userDao) {
System.out.println(userDao);
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl(url);
dataSource.setDriverClassName(driver);
dataSource.setUsername(username);
dataSource.setPassword(password);
return dataSource;
}
}
說明:
1)方法的返回值類型就是所配置的 Bean 對象;
2)new 對象的時候接收變量不能使用 DataSource,因為 DataSource 本身是沒有 setter 的;
3)方法的形參傳入的是需要使用到的 bean,只要這個 bean 已經被 IoC 容器接管了,就不需要做額外的操作,使用形參傳入即可。
(2)不聲明為配置類,在 Spring 的配置文件中導入配置類
package cn.edu.njust.config;
import cn.edu.njust.dao.UserDao;
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
/**
* 專門配置數據源的配置類
* 有兩種方式可以讓這個文件正常加載
* 1)Configuration: 直接將其聲明為配置類,在整個項目的配置文件中可以掃描到該類即可
* 2)刪除Configuration: 在配置類中使用 Import 注解引入這個配置類
*/
public class JDBCConfig {
@Value("${jdbc.driver}")
private String driver;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
/**
* 第三方Bean中使用到其他的bean對象,做法是將該bean對象使用注解放在IoC容器中
*
* @param userDao 使用到的bean對象,直接用參數的形式傳遞進入即可
* @return
*/
@Bean
public DataSource dataSource(UserDao userDao) {
System.out.println(userDao);
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl(url);
dataSource.setDriverClassName(driver);
dataSource.setUsername(username);
dataSource.setPassword(password);
return dataSource;
}
}
package cn.edu.njust.config;
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.context.annotation.*;
import javax.sql.DataSource;
@Configuration
@ComponentScan("cn.edu.njust")
@PropertySource("classpath:jdbc.properties")
@Import({JDBCConfig.class})
public class SpringConfig {
}
- 在配置類中導入
@Import({JDBCConfig.class})
;
4.5 和第三方整合相關
1)測試要導入
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
2)MyBatis 需要導入
<!--Spring操作數據庫需要該jar包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
<dependency>
<!--
Spring與Mybatis整合的jar包
這個jar包mybatis在前面,是Mybatis提供的
-->
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
6 注解匯總
**注解 ** | 作用說明 |
---|---|
@Component | 將該類交給 IoC 容器管理,即可得到 bean 對象 |
@Controller | 控制層注解,作用和@Component 相同,不過是專用于控制層 |
@Service | 業務層注解,作用和@Component 相同,不過是專用于業務層 |
@Repository | 持久層注解,作用和@Component 相同,不過是專用于持久層 |
@Configuration | 配置類,配置文件專用 |
@ComponentScan | 配置類掃描路徑,效果等同于 xml 中的 context:component-scan |
@PropertySource | 添加在配置類中,指明配置文件,加載配置文件 |
@Scope | 設置 bean 是否是單例,賦值 single 為單例,賦值 prototype 為非單例 |
@PostConstruct | 在構造方法執行后執行的方法 |
@PreDestroy | 標識在銷毀之前執行的方法 |
@Autowired | 聲明在一個為賦值的成員變量上,意為自動配置,默認是按類型配置,如果同一類型的 bean 有多個,將會出錯。 |
@Qualifier | 當同一類型的 bean 有多個時,可以使用該注解配合@Autowired 實現按名稱配置 |
@Value | 簡單數據類型的配置,直接聲明在變量上方進行賦值 |
@Bean | 用于管理第三方 bean,聲明在一個方法上,可以將該 bean 交給 IoC 管理 |
@Import | 聲明在配置類中,可以引入多個配置類 |
@RunWith | 設置類運行器 |
@ContextConfiguration | 在測試類中,設置Spring環境對應的配置類 |
@Test | 聲明該方法是一個測試方法 |
原文鏈接:https://blog.csdn.net/m0_52078336/article/details/134732989
- 上一篇:沒有了
- 下一篇:沒有了
相關推薦
- 2022-06-12 .Net?Core?3.1?Web?API基礎知識詳解(收藏)_實用技巧
- 2022-11-27 VsCode運行html界面的實戰步驟_其它綜合
- 2022-04-08 python?selenium保存圖片最好的兩種方法_python
- 2022-07-13 Linux OS 運行python腳本中smtplib has no attribute SMTP_
- 2022-06-22 Android實現注冊界面_Android
- 2023-07-04 Guava 之 EventBus
- 2022-09-05 python使用pip成功導入庫后還是報錯的解決方法(針對vscode)_python
- 2022-07-15 go學習筆記讀取consul配置文件詳解_Golang
- 欄目分類
-
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支