框架学习03-Spring 七大核心模块
-
核心容器(Core Container)
-
Spring - Core:提供了框架的基本构建块,包括依赖注入(Dependency Injection,DI)和控制反转(Inversion of Control,IOC)功能。这是Spring框架的核心部分,它允许开发者将对象之间的依赖关系从代码中解耦出来。例如,通过使用
ApplicationContext
接口的实现类(如ClassPathXmlApplicationContext
或AnnotationConfigApplicationContext
)来创建和管理应用程序上下文,从而获取和管理Bean。 -
Spring - Beans:负责管理和操作Bean,包括Bean的定义、创建、配置和销毁。它提供了
BeanFactory
接口,这是Spring容器的核心接口,用于加载和管理Bean。在实际应用中,开发者可以通过XML配置文件或Java注解来定义Bean,如使用@Component
、@Service
、@Repository
和@Controller
等注解来标记类为Bean,然后由Spring容器进行管理。 -
Spring - Context:构建在Core和Beans模块之上,提供了一种更高级别的应用程序上下文,用于在应用程序中访问对象。它还提供了国际化(i18n)支持、事件传播机制、资源加载等功能。例如,通过
MessageSource
接口可以实现国际化文本消息的获取和处理,方便开发多语言应用程序。 -
Spring - Expression Language (SpEL):是一种强大的表达式语言,用于在运行时查询和操作对象图。它可以嵌入到Spring配置文件或注解中,用于动态地计算属性值、调用方法等。例如,可以在XML配置文件中使用SpEL来设置Bean的属性值,如这里就通过SpEL获取系统属性
user.name
的值来设置User
对象的name
属性<bean id="user" class="com.example.User"> <property name="name" value="#{systemProperties['user.name']}"/> </bean>`
-
-
数据访问与集成(Data Access/Integration)
-
Spring - JDBC:提供了对JDBC(Java Database Connectivity)的简化操作。它封装了JDBC的样板代码,使得数据库访问更加容易。例如,通过
JdbcTemplate
类,开发者可以用更少的代码实现数据库的查询、插入、更新和删除操作。比如,这里就使用JdbcTemplate
查询了年龄大于18岁的用户信息。JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); String sql = "SELECT * FROM users WHERE age >?"; List<User> users = jdbcTemplate.query(sql, new Object[]{18}, new RowMapper<User>() { public User mapRow(ResultSet rs, int rowNum) throws SQLException { User user = new User(); user.setId(rs.getInt("id")); user.setName(rs.getString("name")); return user; } });`
-
Spring - ORM:支持与各种对象 - 关系映射(ORM)框架的集成,如Hibernate、JPA(Java Persistence API)等。它提供了统一的编程接口,使得在切换不同的ORM框架时更加容易。例如,当使用JPA时,Spring可以管理
EntityManagerFactory
和EntityManager
,并且通过@PersistenceContext
注解可以方便地注入EntityManager
,如@Repository public class UserRepository { @PersistenceContext private EntityManager entityManager; public User findById(Long id) { return entityManager.find(User.class, id); } }`。
-
Spring - OXM:用于对象到XML的映射(Object - XML Mapping),支持多种XML转换技术,如JAXB(Java Architecture for XML Binding)、Castor等。它可以将Java对象转换为XML格式,或者将XML数据转换为Java对象。例如,在与外部系统进行XML数据交换时,使用Spring - OXM可以方便地进行数据转换和处理。
-
Spring - Transactions:提供了一个编程式和声明式事务管理的统一框架。声明式事务管理是Spring的一个重要特性,通过在方法或类上使用
@Transactional
注解,就可以轻松地实现事务管理。例如,这里在transferMoney
方法上使用@Transactional
注解,使得该方法在执行过程中如果出现异常,事务会自动回滚,保证数据的一致性。@Service public class UserService { @Transactional public void transferMoney(User fromUser, User toUser, double amount) { fromUser.setBalance(fromUser.getBalance() - amount); toUser.setBalance(toUser.getBalance() + amount); } }
-
-
Web(Web)
-
Spring - Web:提供了基础的Web开发功能,包括构建Web应用程序的基本组件,如Servlet上下文、HTTP请求和响应处理等。它是Spring MVC(Model - View - Controller)的基础模块。例如,在Servlet环境中,Spring - Web可以帮助处理Servlet初始化、请求分发等基础操作。
-
Spring - WebMVC:是Spring框架用于构建Web应用程序的MVC(Model - View - Controller)框架。它提供了一种清晰的架构来分离应用程序的模型、视图和控制器。例如,通过定义@Controller
注解的类作为控制器,@RequestMapping
注解来映射请求路径,ModelAndView
来传递数据和视图名称,这里HelloController
就是一个简单的MVC控制器,当访问“/hello”路径时,会返回一个包含“Hello, World!”消息的视图。@Controller public class HelloController { @RequestMapping("/hello") public ModelAndView hello() { ModelAndView mav = new ModelAndView("hello"); mav.addObject("message", "Hello, World!"); return mav; } }`
-
-
AOP(Aspect - Oriented Programming)
-
Spring - AOP:提供了面向切面编程的支持。它允许开发者将横切关注点(如日志记录、安全检查、事务管理等)从业务逻辑中分离出来,以切面(Aspect)的形式进行统一管理。例如,可以使用
@Aspect
注解定义一个切面,@Before
、@After
、@Around
等注解来定义在方法执行前后或周围执行的代码。比如,这个切面会在UserService
类的所有方法执行前打印方法名称,用于日志记录。@Aspect public class LoggingAspect { @Before("execution(* com.example.service.UserService.*(..))") public void logBefore(JoinPoint joinPoint) { System.out.println("Before method: " + joinPoint.getSignature().getName()); } }`
-
-
消息(Messaging)
-
Spring - AMQP:用于与高级消息队列协议(Advanced Message Queuing Protocol,AMQP)兼容的消息中间件(如RabbitMQ)进行集成。它提供了一种简单的方式来发送和接收消息。例如,通过
RabbitTemplate
可以发送消息,@RabbitListener
注解可以接收消息。如这里配置了RabbitMQ相关的组件,并在MessageService
中定义了一个消息接收方法。`@Configuration public class RabbitMQConfig { @Bean public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) { return new RabbitTemplate(connectionFactory); } } @Service public class MessageService { @RabbitListener(queues = "myQueue") public void receiveMessage(String message) { System.out.println("Received message: " + message); } }`,
-
Spring - Messaging:提供了一套通用的消息传递抽象,支持多种消息传递方式,包括基于消息队列和基于发布/订阅(Publish/Subscribe)模式。它是构建分布式系统中消息传递机制的重要模块。例如,通过
MessageChannel
和MessageHandler
等概念,可以实现消息的发送和接收。
-
-
测试(Testing)
-
Spring - Test:提供了对Spring应用程序进行单元测试、集成测试和功能测试的支持。它包括对依赖注入、事务管理、MVC等功能的测试支持。例如,通过这里在JUnit测试中加载了Spring应用程序配置
AppConfig
,并对UserService
的transferMoney
方法进行了测试。@RunWith(SpringJUnit4ClassRunner.class)`和`@ContextConfiguration`注解,可以方便地在JUnit测试中加载Spring应用程序上下文,进行各种测试。如`@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = {AppConfig.class}) public class UserServiceTest { @Autowired private UserService userService; @Test public void testTransferMoney() { User fromUser = new User(); fromUser.setBalance(1000.0); User toUser = new User(); toUser.setBalance(0.0); userService.transferMoney(fromUser, toUser, 500.0); assertEquals(fromUser.getBalance(), 500.0); assertEquals(toUser.getBalance(), 500.0); } }`,
-
-
工具(Instrumentation)
- Spring - Instrument:提供了在Java应用程序中添加代理(Agent)的功能,用于在运行时监控和管理应用程序。例如,在应用程序性能分析、故障诊断等场景中,可以通过添加代理来收集信息。不过这个模块相对使用较少,主要用于一些高级的应用场景,如对JVM进行字节码增强等操作。