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

3.1 案例描述
通過使用Java配置的方式實(shí)現(xiàn)Spring的bean管理,簡單的說使用使用Java類替代xml配置文件實(shí)現(xiàn)用戶的查詢,我們這里將數(shù)據(jù)封裝到List集合中遍歷集合打印輸出。
3.2 實(shí)現(xiàn)
1)創(chuàng)建項(xiàng)目,創(chuàng)建普通項(xiàng)目導(dǎo)入jar包或者創(chuàng)建maven項(xiàng)目都行,這里創(chuàng)建maven項(xiàng)目,貼出項(xiàng)目結(jié)構(gòu)和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集合模擬數(shù)據(jù)庫,實(shí)現(xiàn)數(shù)據(jù)交互
public class UserDao {
public List<User> queryAll(){
List<User> users = new ArrayList<User>();
//添加用戶,模擬數(shù)據(jù)庫for(int i = 1;i < 11;i++) {
User user = new User("張三"+i, "123456", i);
users.add(user);
}
//返回用戶return users;
}
}
4)編寫Service層,實(shí)現(xiàn)用戶業(yè)務(wù)邏輯
public class UserService {
//注入Dao層對象@Resourceprivate UserDao userDao;
public List<User> queryAll(){
return userDao.queryAll();
}
}
小貼士:我們這里的dao層和service層沒有寫接口
5)編寫Spring配置類,替代XML文件,用于實(shí)例化Spring容器
//說明該類是一個配置類,相當(dāng)于一個xml文件
@Configuration
//掃描包
@ComponentScan(basePackages="com.stt")
public class SpringConfig {
//創(chuàng)建dao層對象@Beanpublic UserDao userDao(){
return new UserDao();
}
//創(chuàng)建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);
//調(diào)用方法
List<User> list = userService.queryAll();
for (User user : list) {
System.out.println(user);
}
//銷毀容器
context.close();
}
}
通過以上示例我們簡單完成使用Java配置方式實(shí)現(xiàn)bean管理。其中重點(diǎn)在于配置類和其中的三個注解。
四、案例2
4.1 案例描述
我們在開發(fā)項(xiàng)目中會連接數(shù)據(jù)庫,而且數(shù)據(jù)的配置寫在db.properties文件中,我們需要讀取該文件并且配置數(shù)據(jù)源,我們這個案例就來實(shí)現(xiàn)連接數(shù)據(jù)庫,并且使用dbcp數(shù)據(jù)庫連接池。
4.2 問題
1)使用Java配置怎么讀取db.properties文件
2)讀取出來之后怎么給dbcp連接池中的driver,url等屬性賦值
那么我們帶著問題看以下代碼配置,在原先配置類的基礎(chǔ)上進(jìn)行修改
配置類:
//說明該類是一個配置類,相當(dāng)于一個xml文件
@Configuration
//掃描包
@ComponentScan(basePackages="com.stt")
//讀取外部配置文件
@PropertySource(value="classpath:resource/db.properties")
public class SpringConfig {
//創(chuàng)建dao層對象@Beanpublic UserDao userDao() {
return new UserDao();
}
//創(chuàng)建Service對象@Beanpublic UserService userService() {
return new UserService();
}
//獲取文件中的值,使用Value注解賦值給變量保存起來//注意:我們使用${}表達(dá)式獲取值,參數(shù)與配置文件中的鍵一致@Value("${driver}")private String driver;
@Value("${url}")private String url;
@Value("${user}")private String user;
@Value("${pass}")private String pass;
//配置數(shù)據(jù)庫連接池@Beanpublic DataSource dataSource() {
//創(chuàng)建DBCP連接池對象
BasicDataSource dataSource = new BasicDataSource();
//設(shè)置屬性
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);
//獲取數(shù)據(jù)源對象
BasicDataSource dataSource = (BasicDataSource)context.getBean("dataSource");
System.out.println(dataSource);
//調(diào)用方法/*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:我們使用該注解給變量注入固定的值
五、總結(jié)
至此我們使用Java配置方式完成spring的bean管理可以簡單使用了,其中我們使用了一個配置類和多個注解一起完成,希望可以幫助到讀者。
文章出自:??添甄??,如有轉(zhuǎn)載本文請聯(lián)系【添甄】今日頭條號。