剛使用Spring框架時一般都是通過xml配置文件的方式,進而使用注解方式實現,我們再來學習一種使用Java類配置的方式,也稱為Java Config來配置Spring框架。這種方式讓我們告別XML文件,完全通過Java體系內的技術點實現。
好處就在于,在開發過程中不需要在Java類和XML文件中來回切換,而是僅僅編寫Java即可。
SpringBoot中,也都是通過該方式實現的配置。從Spring框架的發展歷史來漸漸深入吧!
一、Spring的發展
這些版本其實無需記憶,了解版本之間的大概變化即可
1.1 Spring 1.X時代
在Spring1.x時代,都是通過xml文件配置bean,隨著項目的不斷擴大,需要將xml配置分放到不同的配置文件中,需要頻繁的在java類和xml配置文件中切換。
1.2 Spring2.X時代
隨著JDK 1.5帶來的注解支持,Spring2.x可以使用注解對Bean進行聲明和注入,大大的減少了xml配置文 件,同時也大大簡化了項目的開發。
那么,問題來了,究竟是應該使用xml還是注解呢?
最佳實踐:
- 應用的基本配置用xml,比如:數據源、資源文件等;
- 業務開發用注解,比如:Service中注入bean等;
1.3 Spring3.X和Spring4.X時代
從Spring3.x開始提供了Java配置方式,使用Java配置方式可以更好的幫助你配置的Bean,并且Spring4.x和Spring boot都推薦使用Java配置的方式
目前我們公司在使用Spring5版本,就在本月【2022年11月】Spring 6也發布了,不過要求使用Java 17及以上版本,后續企業可能會慢慢迭代吧!企業中暫時不會使用這么新的技術
二、Spring的Java配置方式
說明:Java配置方式也是Spring4.X推薦使用的方式,作用呢是可以完全替代XML配置,我們就不需要在XML文件和Java類中頻繁的切換開發,我們可以完全面向Java語言做開發。
在實戰之前我們需要知道這么幾個注解
2.1、@Configuration 和 @Bean
看到這兩個標簽相信有些朋友就已經知道這兩個標簽的作用了。
說明:Spring的Java配置是通過@Configuration和@Bean兩個注解實現
@Configuration:作用在類上,說明該類相當于一個xml文件
@Bean:作用在方法上,返回對象,將對象存放在Spring容器中,相當于xml文件中的<bean>標簽
接下來我們通過一個案例使用Java配置的方式實現Spring框架的配置和使用
三、案例1
首先貼出我們的最終的項目結構

3.1 案例描述
通過使用Java配置的方式實現Spring的bean管理,簡單的說使用使用Java類替代xml配置文件實現用戶的查詢,我們這里將數據封裝到List集合中遍歷集合打印輸出。
3.2 實現
1)創建項目,創建普通項目導入jar包或者創建maven項目都行,這里創建maven項目,貼出項目結構和pom.xml配置
版本可以隨意切換
<!-- 定義jar包版本 --><properties><!-- 單元測試 --><junit.version>4.12</junit.version><!-- spring版本 --><spring.version>5.1.2.RELEASE</spring.version>
</properties><!-- 引入spring依賴 --><dependencies><!-- 單元測試 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>${junit.version}</version><scope>test</scope></dependency><!-- Spring --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>${spring.version}</version></dependency></dependencies>
2)編寫User類
public class User {
private String userName;
private String userPass;
private Integer userId;
public User(){
super();
}
public User(String userName, String userPass, Integer userId){
super();
this.userName = userName;
this.userPass = userPass;
this.userId = userId;
}
public String getUserName(){
return userName;
}
public void setUserName(String userName){
this.userName = userName;
}
public String getUserPass(){
return userPass;
}
public void setUserPass(String userPass){
this.userPass = userPass;
}
public Integer getUserId(){
return userId;
}
public void setUserId(Integer userId){
this.userId = userId;
}
@Overridepublic String toString(){
return "User [userName=" + userName + ", userPass=" + userPass + ", userId=" + userId + "]";
}
}
3)編寫Dao層,使用List集合模擬數據庫,實現數據交互
public class UserDao {
public List<User> queryAll(){
List<User> users = new ArrayList<User>();
//添加用戶,模擬數據庫for(int i = 1;i < 11;i++) {
User user = new User("張三"+i, "123456", i);
users.add(user);
}
//返回用戶return users;
}
}
4)編寫Service層,實現用戶業務邏輯
public class UserService {
//注入Dao層對象@Resourceprivate UserDao userDao;
public List<User> queryAll(){
return userDao.queryAll();
}
}
小貼士:我們這里的dao層和service層沒有寫接口
5)編寫Spring配置類,替代XML文件,用于實例化Spring容器
//說明該類是一個配置類,相當于一個xml文件
@Configuration
//掃描包
@ComponentScan(basePackages="com.stt")
public class SpringConfig {
//創建dao層對象@Beanpublic UserDao userDao(){
return new UserDao();
}
//創建Service對象@Beanpublic UserService userService(){
return new UserService();
}
}
小貼士:這個類就是我們的配置類,可以看出我們這里使用了三個注解,這幾個注解我們在上邊說過了,這里就不在贅述。
6)編寫測試類,啟動Spring容器,并完成測試
public class SpringApplication {
public static void main(String[] args){
//獲取SpringConfig類中的所有配置
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
//獲取Service對象
UserService userService = context.getBean(UserService.class);
//調用方法
List<User> list = userService.queryAll();
for (User user : list) {
System.out.println(user);
}
//銷毀容器
context.close();
}
}
通過以上示例我們簡單完成使用Java配置方式實現bean管理。其中重點在于配置類和其中的三個注解。
四、案例2
4.1 案例描述
我們在開發項目中會連接數據庫,而且數據的配置寫在db.properties文件中,我們需要讀取該文件并且配置數據源,我們這個案例就來實現連接數據庫,并且使用dbcp數據庫連接池。
4.2 問題
1)使用Java配置怎么讀取db.properties文件
2)讀取出來之后怎么給dbcp連接池中的driver,url等屬性賦值
那么我們帶著問題看以下代碼配置,在原先配置類的基礎上進行修改
配置類:
//說明該類是一個配置類,相當于一個xml文件
@Configuration
//掃描包
@ComponentScan(basePackages="com.stt")
//讀取外部配置文件
@PropertySource(value="classpath:resource/db.properties")
public class SpringConfig {
//創建dao層對象@Beanpublic UserDao userDao() {
return new UserDao();
}
//創建Service對象@Beanpublic UserService userService() {
return new UserService();
}
//獲取文件中的值,使用Value注解賦值給變量保存起來//注意:我們使用${}表達式獲取值,參數與配置文件中的鍵一致@Value("${driver}")private String driver;
@Value("${url}")private String url;
@Value("${user}")private String user;
@Value("${pass}")private String pass;
//配置數據庫連接池@Beanpublic DataSource dataSource() {
//創建DBCP連接池對象
BasicDataSource dataSource = new BasicDataSource();
//設置屬性
dataSource.setDriverClassName(driver);
dataSource.setUrl(url);
dataSource.setUsername(user);
dataSource.setPassword(pass);
return dataSource;
}
}
測試類:
public class SpringApplication {
public static void main(String[] args){
//獲取SpringConfig類中的所有配置
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
//獲取Service對象
UserService userService = context.getBean(UserService.class);
//獲取數據源對象
BasicDataSource dataSource = (BasicDataSource)context.getBean("dataSource");
System.out.println(dataSource);
//調用方法/*List<User> list = userService.queryAll();
for (User user : list) {
System.out.println(user);
}*///銷毀容器
context.close();
}
}
小貼士:
1)@PropertySource:我們可以使用該注解讀取外部配置文件
如何引入多個配置文件?
@PropertySource(value = {"classpath:db.properties","其他文件路徑"})
如果文件不存在怎么辦?
添加ignoreResourceNotFound屬性改為true,文件不存在時也不會報錯
@PropertySource(value = {"classpath:db.properties","xxx"},ignoreResourceNotFound = true)
2)@Value:我們使用該注解給變量注入固定的值
五、總結
至此我們使用Java配置方式完成spring的bean管理可以簡單使用了,其中我們使用了一個配置類和多個注解一起完成,希望可以幫助到讀者。
文章出自:??添甄??,如有轉載本文請聯系【添甄】今日頭條號。