Spring的Java配置方式,告别XML配置

开发 前端
在Spring1.x时代,都是通过xml文件配置bean,随着项目的不断扩大,需要将xml配置分放到不同的配置文件中,需要频繁的在java类和xml配置文件中切换。

刚使用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>
  • 1.
  • 2.
  • 3.

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 + "]";
  }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.

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;
  }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

4)编写Service层,实现用户业务逻辑

public class UserService {

  //注入Dao层对象@Resourceprivate UserDao userDao;
  
  public List<User> queryAll(){
    return userDao.queryAll();
  }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

小贴士:我们这里的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();
  }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.

小贴士:这个类就是我们的配置类,可以看出我们这里使用了三个注解,这几个注解我们在上边说过了,这里就不在赘述。

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();
  }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.

通过以上示例我们简单完成使用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;
  }
  
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.

测试类:

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.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.

小贴士:

1)@PropertySource:我们可以使用该注解读取外部配置文件

如何引入多个配置文件?

@PropertySource(value = {"classpath:db.properties","其他文件路径"})
  • 1.

如果文件不存在怎么办?

添加ignoreResourceNotFound属性改为true,文件不存在时也不会报错

@PropertySource(value = {"classpath:db.properties","xxx"},ignoreResourceNotFound = true)
  • 1.

2)@Value:我们使用该注解给变量注入固定的值

五、总结

至此我们使用Java配置方式完成spring的bean管理可以简单使用了,其中我们使用了一个配置类和多个注解一起完成,希望可以帮助到读者。

文章出自:​​添甄​​,如有转载本文请联系【添甄】今日头条号。

责任编辑:武晓燕 来源: 今日头条
相关推荐

2011-02-28 13:51:30

Spring事物配置

2009-06-19 18:26:38

Spring事务配置

2011-11-25 10:25:27

SpringJava

2023-11-01 15:07:51

环境配置方式

2009-06-18 11:15:53

装配beanxml配置Spring

2015-05-06 10:05:22

javajava框架spring aop

2010-08-03 09:20:33

Flex读取XML配置

2009-06-17 14:17:04

SpringXML配置文件

2009-06-17 14:36:10

SpringXML配置文件

2023-08-07 16:14:32

propertiesSpring框架

2010-02-26 14:05:57

WCF通信方式

2018-07-11 15:32:57

KubernetesDNS方式

2010-03-05 15:14:55

Ubuntu网络配置

2013-07-30 11:30:42

Windows PhoWindows Pho

2009-07-14 14:08:35

Tapestry 5.web.xml的配置

2025-01-21 11:46:26

2009-06-18 11:37:16

配置spring

2009-06-26 14:04:15

Quartz配置

2009-07-17 16:49:18

iBATIS XML配

2009-07-07 14:11:07

XML来配置Servl
点赞
收藏

51CTO技术栈公众号