框架学习02-Spring 七大核心模块所实现的功能
Spring框架的七大核心模块及其功能如下:
1. Spring Core(核心容器)
- 功能概述:
- 这是Spring框架最基础的部分,提供了依赖注入(Dependency Injection,DI)和控制反转(Inversion of Control,IOC)的功能。IOC容器负责创建、配置和管理Bean(在Spring中,Bean是一个被Spring容器管理的对象)。通过将对象的创建和依赖关系的管理交给容器,使得代码的耦合度降低,易于维护和测试。
- 它还提供了资源访问、类型转换等基础功能。例如,可以方便地从类路径、文件系统等位置加载资源,并且能够在不同的数据类型之间进行转换,如将字符串转换为数字等。
- 举例说明:
- 假设我们有一个
UserService
类,它依赖于一个UserRepository
类来实现数据访问。在传统方式下,UserService
需要自己创建UserRepository
的实例。但在Spring Core中,可以将UserRepository
定义为一个Bean,然后通过依赖注入的方式将其注入到UserService
中。在配置文件(如XML配置)或者使用Java配置类时,可以这样定义: - XML配置:
<bean id="userRepository" class="com.example.UserRepository"/> <bean id="userService" class="com.example.UserService"> <property name="userRepository" ref="userRepository"/> </bean>
- Java配置:
@Configuration public class AppConfig { @Bean public UserRepository userRepository() { return new UserRepository(); } @Bean public UserService userService(UserRepository userRepository) { UserService userService = new UserService(); userService.setUserRepository(userRepository); return userService; } }
- 假设我们有一个
2. Spring AOP(面向切面编程)
- 功能概述:
- AOP主要用于将横切关注点(如日志记录、事务管理、安全检查等)从业务逻辑中分离出来。它允许开发者定义切面(Aspect),切面是一个跨越多个对象和方法的关注点的模块化表示。通过在合适的点(切点,Pointcut)织入(Weaving)这些切面代码,可以在不修改原有业务逻辑代码的基础上增强其功能。
- Spring AOP是基于代理(Proxy)模式实现的。对于接口的实现类,默认使用JDK动态代理;对于没有实现接口的类,则使用CGLIB代理。
- 举例说明:
- 以日志记录为例,假设我们有多个业务方法,如
addUser()
、updateUser()
等,我们希望在每个方法执行前后记录日志。可以定义一个切面来实现这个功能。 - 首先定义一个日志切面类:
@Aspect public class LoggingAspect { @Before("execution(* com.example.UserService.*(..))") public void beforeMethod(JoinPoint joinPoint) { System.out.println("Before method: " + joinPoint.getSignature().getName()); } }
- 然后在配置类中启用AOP:
@Configuration @EnableAspectJAutoProxy public class AppConfig { // 其他Bean定义... @Bean public LoggingAspect loggingAspect() { return new LoggingAspect(); } }
- 这样,当
UserService
中的方法被调用时,beforeMethod
中的日志记录代码就会在方法执行前被执行。
- 以日志记录为例,假设我们有多个业务方法,如
3. Spring DAO(数据访问对象)
- 功能概述:
- Spring DAO模块提供了一种抽象层,用于简化数据库访问操作。它提供了统一的异常体系,使得开发者可以从繁琐的底层数据库异常处理中解脱出来。并且支持多种数据库访问技术,如JDBC、Hibernate、MyBatis等。
- 可以方便地配置数据源(DataSource),管理数据库连接,进行数据库事务处理等。例如,通过Spring的
JdbcTemplate
,可以用更简洁的方式执行SQL语句,而不必编写大量的JDBC样板代码。
- 举例说明:
- 假设我们要使用JDBC访问数据库来查询用户信息。首先配置数据源:
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mydb"/> <property name="username" value="root"/> <property name="password" value="password"/> </bean>
- 然后使用
JdbcTemplate
进行查询:@Repository public class UserDaoImpl implements UserDao { private JdbcTemplate jdbcTemplate; public UserDaoImpl(DataSource dataSource) { this.jdbcTemplate = new JdbcTemplate(dataSource); } @Override public User getUserById(int id) { String sql = "SELECT * FROM users WHERE id =?"; return jdbcTemplate.queryForObject(sql, new Object[]{id}, new BeanPropertyRowMapper<>(User.class)); } }
- 假设我们要使用JDBC访问数据库来查询用户信息。首先配置数据源:
4. Spring ORM(对象关系映射)
- 功能概述:
- Spring ORM模块对流行的对象关系映射框架(如Hibernate、JPA等)提供了集成支持。它使得在Spring应用中使用这些ORM框架更加方便,并且可以与Spring的其他功能(如事务管理、依赖注入等)无缝结合。
- 例如,当使用Hibernate时,Spring可以管理Hibernate的
SessionFactory
,提供事务管理,将Hibernate的持久化对象(POJO)方便地注入到其他业务组件中。
- 举例说明:
- 以使用JPA为例,首先配置实体管理器工厂(EntityManagerFactory):
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="packagesToScan" value="com.example.entities"/> <property name="jpaVendorAdapter"> <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> <property name="database" value="MYSQL"/> <property name="showSql" value="true"/> </bean> </property> </bean>
- 然后可以在服务层使用JPA进行数据持久化操作,如保存用户对象:
@Service public class UserService { @PersistenceContext private EntityManager entityManager; public void saveUser(User user) { entityManager.persist(user); } }
- 以使用JPA为例,首先配置实体管理器工厂(EntityManagerFactory):
5. Spring Context(应用上下文)
- 功能概述:
- Spring Context模块建立在Spring Core基础之上,它提供了一种更高级的配置和访问容器的方式。它能够加载和管理各种配置资源,包括XML配置文件、Java配置类等。并且提供了国际化(i18n)支持、事件发布 - 订阅机制等功能。
- 例如,通过应用上下文,可以方便地获取Bean,实现Bean之间的消息传递(通过事件机制),以及根据不同的语言环境加载相应的文本资源。
- 举例说明:
- 在一个Web应用中,通常会在
web.xml
文件中配置Spring的上下文加载器监听器(ContextLoaderListener)来加载应用上下文。<context - param> <param - name>contextConfigLocation</param - name> <param - value>/WEB - INF/applicationContext.xml</param - value> </context - param> <listener> <listener - class>org.springframework.web.context.ContextLoaderListener</listener - class> </listener>
- 然后在应用代码中可以获取应用上下文并获取Bean。例如,在一个Servlet中:
public class MyServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ServletContext servletContext = getServletContext(); ApplicationContext applicationContext = WebApplicationContextUtils.getWebApplicationContext(servletContext); UserService userService = applicationContext.getBean(UserService.class); userService.doSomething(); } }
- 对于国际化,在配置文件中可以定义资源束(Resource Bundle):
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> <property name="basename" value="messages"/> </bean>
- 然后在代码中可以根据不同的语言环境获取消息:
@Autowired private MessageSource messageSource; public String getWelcomeMessage(Locale locale) { return messageSource.getMessage("welcome.message", null, locale); }
- 在一个Web应用中,通常会在
6. Spring Web(Web模块)
- 功能概述:
- Spring Web模块提供了基础的Web开发功能,包括对Servlet API的集成。它可以用于构建Web应用程序,支持文件上传功能,并且可以方便地将请求映射到处理方法。
- 例如,通过
DispatcherServlet
(这是Spring Web MVC的核心组件)来分发请求,将请求发送到合适的控制器(Controller)进行处理。同时,它也提供了一些工具类用于处理Web相关的任务,如处理HTTP请求头、请求参数等。
- 举例说明:
- 定义一个简单的Spring MVC控制器:
@Controller public class HelloController { @RequestMapping("/hello") public String hello(Model model) { model.addAttribute("message", "Hello, World!"); return "hello"; } }
- 这里,
@RequestMapping
注解用于将/hello
这个URL路径映射到hello
方法。当用户访问/hello
路径时,hello
方法会被调用,它将一个消息添加到模型(Model)中,然后返回一个视图名称(这里假设hello
是一个视图名称,对应的视图可能是一个JSP页面或者其他模板引擎的模板)。 - 为了使这个控制器能够工作,需要在配置文件中配置
DispatcherServlet
:<servlet> <servlet - name>dispatcherServlet</servlet - name> <servlet - class>org.springframework.web.servlet.DispatcherServlet</servlet - class> <init - param> <param - name>contextConfigLocation</param - name> <param - value>/WEB - INF/spring - mvc.xml</param - value> </init - param> <load - on - startup>1</load - on - startup> </servlet> <servlet - mapping> <servlet - name>dispatcherServlet</servlet - name> <url - pattern>/</url - pattern> </servlet - mapping>
- 定义一个简单的Spring MVC控制器:
7. Spring Web MVC(Model - View - Controller)
- 功能概述:
- Spring Web MVC是一个用于构建Web应用的MVC(Model - View - Controller)框架。它提供了一套完整的机制来处理Web请求,包括请求处理流程的控制、视图的渲染和模型数据的传递。
- 它支持多种视图技术,如JSP、Thymeleaf、FreeMarker等。通过控制器(Controller)接收请求,处理业务逻辑,将结果数据封装到模型(Model)中,然后由视图解析器(View Resolver)根据视图名称找到对应的视图并进行渲染。
- 举例说明:
- 假设我们使用Thymeleaf作为视图技术。首先配置Thymeleaf视图解析器:
<bean id="templateResolver" class="org.thymeleaf.templateresolver.ServletContextTemplateResolver"> <property name="prefix" value="/WEB - INF/templates/"/> <property name="suffix" value=".html"/> <property name="templateMode" value="HTML5"/> </bean> <bean id="templateEngine" class="org.thymeleaf.spring5.SpringTemplateEngine"> <property name="templateResolver" ref="templateResolver"/> </bean> <bean id="viewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver"> <property name="templateEngine" ref="templateEngine"/> </bean>
- 然后在控制器中返回模型和视图名称,Thymeleaf会根据视图名称和模型数据进行页面渲染。例如:
@Controller public class UserController { @Autowired private UserService userService; @RequestMapping("/users") public String listUsers(Model model) { List<User> users = userService.getAllUsers(); model.addAttribute("users", users); return "users/list"; } }
- 这里,
listUsers
方法从服务层获取用户列表,将其添加到模型中,然后返回视图名称users/list
。Thymeleaf会根据这个视图名称找到对应的HTML模板文件(如/WEB - INF/templates/users/list.html
),并将用户列表数据渲染到页面中。
- 假设我们使用Thymeleaf作为视图技术。首先配置Thymeleaf视图解析器:
原文地址:https://blog.csdn.net/m0_68274160/article/details/143692520
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!