[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实战》




目录
相关文章
|
6天前
|
SQL Java 数据库连接
(自用)Spring常用配置
(自用)Spring常用配置
13 0
|
12天前
|
设计模式 安全 Java
Java并发编程实战:使用synchronized关键字实现线程安全
【4月更文挑战第6天】Java中的`synchronized`关键字用于处理多线程并发,确保共享资源的线程安全。它可以修饰方法或代码块,实现互斥访问。当用于方法时,锁定对象实例或类对象;用于代码块时,锁定指定对象。过度使用可能导致性能问题,应注意避免锁持有时间过长、死锁,并考虑使用`java.util.concurrent`包中的高级工具。正确理解和使用`synchronized`是编写线程安全程序的关键。
|
1天前
|
负载均衡 Java 开发者
细解微服务架构实践:如何使用Spring Cloud进行Java微服务治理
【4月更文挑战第17天】Spring Cloud是Java微服务治理的首选框架,整合了Eureka(服务发现)、Ribbon(客户端负载均衡)、Hystrix(熔断器)、Zuul(API网关)和Config Server(配置中心)。通过Eureka实现服务注册与发现,Ribbon提供负载均衡,Hystrix实现熔断保护,Zuul作为API网关,Config Server集中管理配置。理解并运用Spring Cloud进行微服务治理是现代Java开发者的关键技能。
|
2天前
|
安全 Java 数据安全/隐私保护
使用Spring Security进行Java身份验证与授权
【4月更文挑战第16天】Spring Security是Java应用的安全框架,提供认证和授权解决方案。通过添加相关依赖到`pom.xml`,然后配置`SecurityConfig`,如设置用户认证信息和URL访问规则,可以实现应用的安全保护。认证流程包括请求拦截、身份验证、响应生成和访问控制。授权则涉及访问决策管理器,如基于角色的投票。Spring Security为开发者构建安全应用提供了全面且灵活的工具,涵盖OAuth2、CSRF保护等功能。
|
3天前
|
Java 大数据 云计算
Spring框架:Java后台开发的核心
【4月更文挑战第15天】Spring框架在Java后台开发中占据核心位置,因其控制反转(IoC)、面向切面编程(AOP)、事务管理等特性提升效率和质量。Spring提供数据访问集成、RESTful Web服务和WebSocket支持。优势包括高效开发、灵活扩展、强大生态圈和广泛应用。应用于企业级应用、微服务架构及云计算大数据场景。掌握Spring对Java开发者至关重要。
|
6天前
|
JSON Java 数据库连接
属性注入掌握:Spring Boot配置属性的高级技巧与最佳实践
属性注入掌握:Spring Boot配置属性的高级技巧与最佳实践
13 1
|
6天前
|
Java 数据库 Spring
切面编程的艺术:Spring动态代理解析与实战
切面编程的艺术:Spring动态代理解析与实战
19 0
切面编程的艺术:Spring动态代理解析与实战
|
6天前
|
Java 数据库连接 Spring
简化配置,提高灵活性:Spring中的参数化配置技巧
简化配置,提高灵活性:Spring中的参数化配置技巧
15 0
|
6天前
|
Java Shell 测试技术
一次配置,多场景适用:Spring Boot多套配置文件的深度剖析
一次配置,多场景适用:Spring Boot多套配置文件的深度剖析
16 0
一次配置,多场景适用:Spring Boot多套配置文件的深度剖析
|
6天前
|
Java
Java配置大揭秘:读取自定义配置文件的绝佳指南
Java配置大揭秘:读取自定义配置文件的绝佳指南
11 0
Java配置大揭秘:读取自定义配置文件的绝佳指南