Spring 是一个开源的 轻量级、非侵入式 的 Java EE(现 Jakarta EE)开发框架,由 Rod Johnson 在 2003 年创建,并于 2004 年发布 1.0 版本。它旨在简化企业级 Java 应用开发。
new
对象。ZB.BAIKEYOU.CN23丨FREE.HNTGNETWORK.COM37丨MOBI.CHUANZHIWANG.CN42丨R.KQW.INFO11
WWW.25MP.CN37丨MOBI.KAIGUIJITUAN.COM31丨JIM.KIN168.CN58丨SWEET.WKSKJX.CN10
24K.HZXXX168.COM75丨FOOTBALL.JPPKIUEDU.COM10丨WWW.BMXXW.NET40丨LANQIU.CBAZHIBO.MOBI96
ZBSJB.SNQCZ.COM50丨ZHIBO.WHDHX.CN43丨SOHU.28BAIKE.COM96丨SOHU.XLSY.CN74
24K.LSLJX.COM97丨SHARE.CDYIBEINENGYUAN.COM32丨SOHU.JXLGDL.COM12丨VIP.CHANGTAI333.COM89
FREE.HZSMC.COM11丨PRETTY.CHRONOPORTAL.CN14丨ZHIHU.JLDXQ.COM38丨CCTV.CLQMW.COM24
ZBSJB.XJQQMAIL.COM37丨FREE.QIRUI4.COM39丨CCTV.QDSKYWGJJNG.COM69丨ZHIBO.WKSKJX.CN99
24K.PENCITY.CN38丨WEIBO.NJZHONGTONG.COM32丨WAP.HNTGNETWORK.COM18丨QQ.XLTS2000.CN38
ZUQIU.HONGDA0536.CN15丨24K.XMJIUSHI.CN58丨JRS.ZHIXINQG.COM73丨SOHU.CYDDW.CN89
YES.ABFYBJ.COM46丨VIP.SZJDZSH.COM12丨ZHIBO.QZSYHB.CN24丨ZHIBO.0518XZW.COM50
24K.DGRYMY.CN83丨PRETTY.BOKEZHI.COM97丨VIP.25MP.CN13丨ZHIBO.PCFANGYUANKOU.COM39
ZB.CHANGTAI120.CN16丨JRS.SDDANTUOJI.CN77丨R.XVU.INFO83丨MAP.NMGZIXUN.ORG.CN83
Spring 框架由多个模块组成,核心模块包括:
模块 | 功能 |
---|---|
Spring Core Container | 核心容器,包含 IoC 和 DI 功能。 |
├── Beans | 定义了 BeanFactory,是 IoC 容器的核心。 |
├── Core | 提供框架基本组成部分,如 IoC 和 DI。 |
├── Context | 构建于 Core 和 Beans 模块之上,提供上下文信息(ApplicationContext)。 |
└── SpEL (Spring Expression Language) | 运行时查询和操作对象图的表达式语言。 |
AOP and Instrumentation | 提供 AOP 支持,用于声明式事务管理、日志等。 |
Messaging | 支持 STOMP 和 WebSocket。 |
Data Access/Integration | JDBC, ORM (JPA, Hibernate, MyBatis), OXM, JMS, Transactions |
Web | Servlet-based Spring MVC 和 WebSocket。 |
Test | 支持使用 JUnit 或 TestNG 对 Spring 组件进行单元测试和集成测试。 |
注意:从 Spring 5.0 开始,引入了 WebFlux 模块,支持响应式编程模型。
new B()
来创建 B 的实例。DI 是 IoC 的一种实现方式。它指的是 Spring 容器将对象所依赖的其他对象(依赖)注入到该对象中。
我们将使用 Maven 作为构建工具,创建一个简单的 Spring 控制台应用。
<!-- pom.xml -->
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>spring-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<spring.version>5.3.21</spring.version> <!-- 或更高版本 -->
</properties>
<dependencies>
<!-- Spring Context (包含 Core, Beans, Context) -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- Spring Core (包含 SpEL) -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- 日志 (Spring 依赖 Commons Logging, 通常桥接到 SLF4J) -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.36</version>
</dependency>
</dependencies>
</project>
// com/example/service/UserService.java
package com.example.service;
public interface UserService {
void saveUser(String username);
}
// com/example/service/impl/UserServiceImpl.java
package com.example.service.impl;
import com.example.service.UserService;
public class UserServiceImpl implements UserService {
private String dataSource; // 模拟依赖
// 构造函数注入
public UserServiceImpl(String dataSource) {
this.dataSource = dataSource;
}
@Override
public void saveUser(String username) {
System.out.println("使用数据源 [" + dataSource + "] 保存用户: " + username);
}
}
<!-- src/main/resources/applicationContext.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 定义一个 Bean -->
<bean id="userService" class="com.example.service.impl.UserServiceImpl">
<!-- 通过构造函数注入参数 -->
<constructor-arg value="MySQL"/>
</bean>
</beans>
java深色版本// com/example/config/AppConfig.java
package com.example.config;
import com.example.service.UserService;
import com.example.service.impl.UserServiceImpl;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration // 标记这是一个配置类
public class AppConfig {
@Bean // 声明一个 Bean
public UserService userService() {
return new UserServiceImpl("PostgreSQL"); // 构造函数注入
}
}
修改 UserServiceImpl
:
// com/example/service/impl/UserServiceImpl.java
package com.example.service.impl;
import com.example.service.UserService;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
@Service // 声明这是一个服务组件,会被 Spring 扫描到
public class UserServiceImpl implements UserService {
@Value("Oracle") // 注入一个简单的值
private String dataSource;
@Override
public void saveUser(String username) {
System.out.println("使用数据源 [" + dataSource + "] 保存用户: " + username);
}
}
java深色版本// com/example/config/AppConfig.java
package com.example.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan(basePackages = "com.example") // 扫描指定包下的所有组件
public class AppConfig {
// 不需要显式声明 Bean,@Service 已经声明了
}
// com/example/App.java
package com.example;
import com.example.config.AppConfig;
import com.example.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
// 如果使用 XML: import org.springframework.context.support.ClassPathXmlApplicationContext;
public class App {
public static void main(String[] args) {
// 方式1: 使用 Java 配置类
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
// 方式2: 使用 XML 配置文件
// ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
// 从容器中获取 Bean
UserService userService = context.getBean(UserService.class);
// 或者通过名称获取: context.getBean("userService", UserService.class)
// 使用 Bean
userService.saveUser("张三");
// 关闭容器 (对于 Web 应用通常不需要手动关闭)
((AnnotationConfigApplicationContext) context).close();
}
}
输出:
使用数据源 [Oracle] 保存用户: 张三
注解 | 用途 | 所在模块 |
---|---|---|
@Component | 通用组件注解 | spring-context |
@Service | 服务层组件 | spring-context |
@Repository | 数据访问层 (DAO) 组件,能捕获持久化异常 | spring-context |
@Controller | 表现层 (Web) 组件 | spring-web |
@RestController | @Controller + @ResponseBody,用于 RESTful API | spring-web |
@Configuration | 声明配置类 | spring-context |
@Bean | 在配置类中声明一个 Bean | spring-context |
@ComponentScan | 启用组件扫描 | spring-context |
@Autowired | 自动装配依赖(构造函数、Setter、字段) | spring-beans |
@Qualifier | 当有多个相同类型的 Bean 时,指定名称进行注入 | spring-beans |
@Value | 注入属性值(字面量、SpEL 表达式) | spring-beans |
@Scope | 定义 Bean 的作用域 (singleton, prototype 等) | spring-beans |
@Primary | 当有多个候选 Bean 时,优先选择此 Bean | spring-beans |
@PostConstruct | 定义初始化方法 | javax.annotation |
@PreDestroy | 定义销毁前方法 | javax.annotation |
AOP 允许你将横切关注点(如日志、事务、安全)从业务逻辑中分离出来,以声明式的方式应用到多个地方。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.7</version>
</dependency>
// com/example/aspect/LoggingAspect.java
package com.example.aspect;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class LoggingAspect {
// 定义切入点:匹配 UserService 中的所有方法
@Pointcut("execution(* com.example.service.UserService.*(..))")
public void userServiceMethods() {}
@Before("userServiceMethods()")
public void logBefore() {
System.out.println("[AOP 日志] 方法执行前...");
}
@After("userServiceMethods()")
public void logAfter() {
System.out.println("[AOP 日志] 方法执行后...");
}
}
在 AppConfig.java
中添加:
@Configuration
@ComponentScan(basePackages = "com.example")
@EnableAspectJAutoProxy // 启用 AspectJ 自动代理
public class AppConfig {
}
再次运行 App
类,输出:
深色版本[AOP 日志] 方法执行前...
使用数据源 [Oracle] 保存用户: 张三
[AOP 日志] 方法执行后...
下一步建议:学习 Spring Boot,它将让你的 Spring 开发体验更上一层楼!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。