自学内容网 自学内容网

框架学习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));
          }
      }
      

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);
          }
      }
      

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);
      }
      

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>
      

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),并将用户列表数据渲染到页面中。

原文地址:https://blog.csdn.net/m0_68274160/article/details/143692520

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!