【仅需 订阅专栏合集,作者所有专栏都能看】
文章目录
导读
纯Java代码配置方式是Spring4.x推荐的配置方式,可以完全替代xml配置。因此注解式开发不是SpringBoot才有的,而是早已有之,只是SpringBoot带动了全注解式开发浪潮。本节追本溯源,温习一下Spring的Java配置方式。下一节正式进入SpringBoot实战技术讲解。
Spring注解驱动的发展
0.1.1、Spring1.x 时代
在Spring1.x时代,都是通过xml文件配置bean,随着项目的不断演进,需要将xml配置拆分到不同的配置文件中,需要频繁的在java类和xml配置文件中切换。
虽然Spring1.2.0已经提供了@ManagedResource
和@Transactional
等注解,但是被注解修饰的Bean的装配仍然采用XML配置方式。
0.1.2、Spring2.x时代
随着JDK 1.5的出炉,业界刮起了使用注解的浪潮,Spring2.x可以使用注解对Bean进行申明和注入,大大的减少了xml配置文件,同时也大大简化了项目的开发。这个时期引入了一些核心的注解。
- 依赖注入
@Autowired
- 依赖查找
@Qualifier
- 组件声明
@Component、@Service
- SpringMVC注解
@Controller、@RequestMapping
尽管这个阶段增加了不少注解,但是仍需XML配置驱动,即<context:annotation-config>
、<context:component-scan>
0.1.3、Spring3.x到Spring4.x
从Spring3.x开始提供了Java配置方式,陆续引入了配置类注解@Configuration
、替代<context:component-scan>
的@ComponentScan
、声明组件的@Bean
等。
Spring4.x开始又提供了更加完善的注解驱动能力,引入了@Conditional
等条件注解,使得自动装配如鱼得水。
0.1.4、Spring5.x时代
我们就处于这个时代,从Spring4.x开始,java配置的方式就开始流行起来,使用Java配置方式可以更好地从代码层面理解应用的上下文关系。
Spring的Java配置方式
0.2.1、核心注解
Spring的Java配置方式是通过 @Configuration
和 @Bean
这两个注解实现:
@Configuration
作用于类上,相当于一个xml配置文件@Bean
作用于方法上,相当于xml配置中的 < bean >
0.2.2、Java配置示例
该示例演示了通过Java配置的方式构建Spring应用,并且实现了Spring IOC功能。注意,本例只是普通maven工程而非SpringBoot应用。
创建传统Maven工程
pom.xml
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
</dependencies>
编写User对象
org.example.model.User
public class User {
private String userName;
private String password;
private Integer age;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
编写UserDAO模拟与数据库交互
org.example.dao.UserDAO
public class UserDAO {
public List<User> queryUserList() {
List<User> result = new ArrayList<User>();
// 模拟数据库的查询
for (int i = 0; i < 10; i++) {
User user = new User();
user.setUserName("userName_" + i);
user.setPassword("password_" + i);
user.setAge(i + 10);
result.add(user);
}
return result;
}
}
编写UserService实现业务逻辑
org.example.service.UserService
@Service
public class UserService {
@Autowired
private UserDAO userDAO;
public List<User> queryUserList() {
return userDAO.queryUserList();
}
}
编写SpringConfig 用于实例化Spring容器
org.example.config.SpringConfig
@Configuration //通过该注解来表明该类是一个Spring的配置,相当于一个xml文件
@ComponentScan(basePackages = "org.example") //配置扫描包
public class SpringConfig {
@Bean // 通过该注解来表明是一个Bean对象,相当于xml中的<bean>
public UserDAO getUserDAO() {
return new UserDAO();
}
}
启动Spring容器测试
org.example.App
public class App {
public static void main(String[] args) {
// 通过Java配置来实例化Spring容器
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
// 在Spring容器中获取Bean对象
UserService userService = context.getBean(UserService.class);
// 调用对象中的方法
List<User> list = userService.queryUserList();
for (User user : list) {
System.out.println(user.getUserName() + ", " + user.getPassword() + ", " + user.getPassword());
}
// 销毁该容器
context.close();
}
}
运行结果
从以上的示例中可以看出,使用纯Java代码就完美地替代了xml配置文件,并且结构更加的清晰。我们没有引入任何SpringBoot相关的依赖,这充分说明了注解驱动开发在SpringBoot之前就有了。
本章小结
本章带领大家回顾了一下spring注解发展史,并结合一个例子展示了Spring的纯Java的配置方式。