[Spring实战系列](15)使用Spring基于Java的配置

简介: 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SunnyYoona/article/details/50650413 并不是所有的开发人员都喜欢使用XML,所以Spring3.0 为这些人准备了一些特别的东西。
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SunnyYoona/article/details/50650413
并不是所有的开发人员都喜欢使用XML,所以Spring3.0 为这些人准备了一些特别的东西。可以几乎不使用XML而使用纯粹的Java代码来配置Spring应用。并且基于Java的配置拥有一些XML配置所不具有的技巧。

1. 创建基于Java的配置

即使Spring的Java配置可以让我们不使用XML就可以编写大多数的Spring配置,但是我们 仍然需要极少量的XML来启用Java配置
 
   
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.sjf.bean">
</context:component-scan>
 
</beans>
我们已经知道<context:component-scan>是如何自动注册那些使用某种构造型(stereotype)注解所标注的Bean的。但是它也会自动加载使用@Configuration注解所标注的类。在该例子中, base-package属性告知Spring在com.sjf.bean包内查找使用@Configuration注解所标注的所有类

2. 定义一个配置类

在基于Spring的XML配置时,XML配置的根元素是来自Spring Bean命名空间的<beans>元素。而 在基于Java配置里使用@Configuration注解的Java类,来代替XML配置中的<beans>元素
 
   
package com.sjf.bean;
 
import org.springframework.context.annotation.Configuration;
 
/**
* 基于Java的配置
* @author sjf0115
*
*/
@Configuration
public class SpringConfig {
// Bean declaration methods
}

@Configuration注解作为一个标示告知Spring: 这个类将包含一个或者多个Spring Bean的定义。这些 Bean的定义是使用@Bean注解所标注的方法

3. 声明一个简单类

我们使用@Bean注解标注一个方法来定义studentBean Bean:
 
   
package com.sjf.bean;
 
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
 
/**
* 基于Java的配置
* @author sjf0115
*
*/
@Configuration
public class SpringConfig {
// Bean declaration methods
@Bean
public Student studentBean(){
return new Student();
}
}

这个简单方法就是Java配置,它等价与我们之前使用XML所配置的<bean>元素:
 
   
<bean id = "studentBean" class = "com.sjf.bean.Student">
</bean>
@Bean告知Spring这个方法将返回一个对象,该对象应该被注册为Spring应用上下文中的一个Bean。方法名作为该Bean的ID。在该方法中所实现的所有逻辑本质上都是为了创建Bean。上面例子中,该方法创建并返回一个Student的实例对象,该对象被注册为Spring应用上下文中ID为studentBean的Bean。

优点:

在XML配置中,Bean的类型和ID都是由Spring属性来表示的。Spring标识符的缺点是它们无法进行编译器检查。在Spring的基于Java的配置中并没有String属性。Bean的ID和类型都被视为方法签名的一部分Bean的实际创建是在方法体中定义的。因为它们全都是Java代码,所以我们可以进行编译器检查确保Bean的类型是合法类型,并且Bean的ID是唯一的

4. 使用Spring的基于Java的配合进行注入

对于以前使用构造器注入的方式,在使用Java的配置,只需把数字直接传入构造器中即可:
 
   
@Bean
public Student studentBean(){
return new Student("yoona",24);
}

使用Java的配置,定义Bean就像我们使用Java编写类的实例化代码一样。
我们再看看setter注入,在Java的配置中,如何实现?
 
   
@Bean
public Student studentBean(){
Student stu = new Student();
stu.setName("yoona");
stu.setAge(24);
return stu;
}

那么Bean装配另一个Bean的引用?
我们先创建一个待引用的Bean:
 
   
@Bean
public School schoolBean(){
School school = new School();
school.setName("西安电子科技大学");
school.setLocation("西安");
return school;
}
现在来看看怎么引用一个Bean,我们通过构造器为它装配上面那个Bean:
 
   
@Bean
public Student yoonaStudent(){
return new Student(schoolBean());
}

注意:

在Spring的Java配置中,通过声明方法引用一个Bean并不等于等于调用该方法。如果真这样,每次调用schoolBean(),都将得到该Bean的一个新的实例。通过使用@Bean注解标注schoolBean()方法,会告知Spring我们希望该方法定义的Bean要被注册进Spring的应用上下文中。因此,其他Bean的声明方法中运用这个方法时,Spring都会拦截该方法的调用,并尝试在应用上下文中查找该Bean,而不是让方法创建一个新的实例

5. 运行

一旦配置类定义,可以加载和提供他们使用AnnotationConfigApplicationContext 如下:
 
   
package com.sjf.bean;
 
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
 
public class Test {
private static ApplicationContext context;
public static void main(String[] args){
context = new AnnotationConfigApplicationContext(SpringConfig.class);
Student student = (Student)context.getBean("yoonaStudent");
student.setName("yoona");
student.setAge(24);
System.out.println(student.toString());
}
}



参考:《Spring实战》




目录
相关文章
|
11天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
39 2
|
12天前
|
Java 开发者 微服务
手写模拟Spring Boot自动配置功能
【11月更文挑战第19天】随着微服务架构的兴起,Spring Boot作为一种快速开发框架,因其简化了Spring应用的初始搭建和开发过程,受到了广大开发者的青睐。自动配置作为Spring Boot的核心特性之一,大大减少了手动配置的工作量,提高了开发效率。
31 0
|
30天前
|
Java API Spring
在 Spring 配置文件中配置 Filter 的步骤
【10月更文挑战第21天】在 Spring 配置文件中配置 Filter 是实现请求过滤的重要手段。通过合理的配置,可以灵活地对请求进行处理,满足各种应用需求。还可以根据具体的项目要求和实际情况,进一步深入研究和优化 Filter 的配置,以提高应用的性能和安全性。
|
23天前
|
人工智能 前端开发 Java
基于开源框架Spring AI Alibaba快速构建Java应用
本文旨在帮助开发者快速掌握并应用 Spring AI Alibaba,提升基于 Java 的大模型应用开发效率和安全性。
基于开源框架Spring AI Alibaba快速构建Java应用
|
7天前
|
安全 Java 开发者
Java 多线程并发控制:深入理解与实战应用
《Java多线程并发控制:深入理解与实战应用》一书详细解析了Java多线程编程的核心概念、并发控制技术及其实战技巧,适合Java开发者深入学习和实践参考。
|
1月前
|
前端开发 Java 数据库连接
Spring 框架:Java 开发者的春天
Spring 框架是一个功能强大的开源框架,主要用于简化 Java 企业级应用的开发,由被称为“Spring 之父”的 Rod Johnson 于 2002 年提出并创立,并由Pivotal团队维护。
50 1
Spring 框架:Java 开发者的春天
|
22天前
|
Java Spring
[Spring]aop的配置与使用
本文介绍了AOP(面向切面编程)的基本概念和核心思想。AOP是Spring框架的核心功能之一,通过动态代理在不修改原代码的情况下注入新功能。文章详细解释了连接点、切入点、通知、切面等关键概念,并列举了前置通知、后置通知、最终通知、异常通知和环绕通知五种通知类型。
30 1
|
24天前
|
Java 数据库连接 数据库
如何构建高效稳定的Java数据库连接池,涵盖连接池配置、并发控制和异常处理等方面
本文介绍了如何构建高效稳定的Java数据库连接池,涵盖连接池配置、并发控制和异常处理等方面。通过合理配置初始连接数、最大连接数和空闲连接超时时间,确保系统性能和稳定性。文章还探讨了同步阻塞、异步回调和信号量等并发控制策略,并提供了异常处理的最佳实践。最后,给出了一个简单的连接池示例代码,并推荐使用成熟的连接池框架(如HikariCP、C3P0)以简化开发。
46 2
|
1月前
|
Java 数据库连接 开发者
Spring 框架:Java 开发者的春天
【10月更文挑战第27天】Spring 框架由 Rod Johnson 在 2002 年创建,旨在解决 Java 企业级开发中的复杂性问题。它通过控制反转(IOC)和面向切面的编程(AOP)等核心机制,提供了轻量级的容器和丰富的功能,支持 Web 开发、数据访问等领域,显著提高了开发效率和应用的可维护性。Spring 拥有强大的社区支持和丰富的生态系统,是 Java 开发不可或缺的工具。
|
1月前
|
JSON Java Maven
实现Java Spring Boot FCM推送教程
本指南介绍了如何在Spring Boot项目中集成Firebase云消息服务(FCM),包括创建项目、添加依赖、配置服务账户密钥、编写推送服务类以及发送消息等步骤,帮助开发者快速实现推送通知功能。
73 2
下一篇
无影云桌面