[有书共读]JavaWeb高级编程

JavaWeb高级编程 -- 篇12

使用服务和仓库支持控制器

模型-视图-控制器模式

  • 第一步:视图发送命令到控制器
  • 第二步:控制器从模型中读取或操作数据
  • 第三步:模型将数据发送到控制器
  • 第四步:控制器将模型发送到视图

用户界面逻辑是所有只用于支持特定用户界面的逻辑。如果无论用户如何与应用程序交互,都需要某一块相同的代码逻辑,那么该逻辑就是业务逻辑。不过,如果一块代码逻辑只对特定的用户界面有用。
如同将用户界面逻辑和业务逻辑分开一样,也应该将持久逻辑与业务逻辑分隔开。

在控制器-服务-仓库中,仓库是最低的一层,它负责所有的持久化逻辑,将数据保存到数据存储中并从数据存储中读取已保存的数据。使用@Repository注解标记出仓库,表示它的语义目的。启用了组件扫描之后,@Repository类所属的Spring应用上下文将自动实例化、注入和管理这些仓库。通常,每个仓库负责一种持久化对象或实体。
仓库需要实现特定的接口。
服务是仓库之上的下一层。服务封装了应用程序业务逻辑,它将使用其他服务和仓库,但不能使用更高层应用程序的资源。服务被标记上了@Service注解,使它们可以自动实例化和依赖注入。如仓库一样,它也需要实现特定的接口。
如果要为应用程序创建一个RESTful或者SOAP Web服务,那么我们可能需要在应用程序的上下文中创建一个单独的DispatcherServer和@Configuration,并且配置也将变得不同,已反应该上下文中控制器处理请求的不同方式。
不应该在Web应用上下文中管理服务和仓库,而是应该在根应用上下文中,它是所有Web应用上下文的父亲。
在使用@ComponentScan注解时,要使用String[] basePackages特性告诉Spring扫描哪些Java包,查找可用的类。Spring将定义出这些包或子包中的所有类,并针对每个类应用资源过滤器。
对于Spring在基本包中找到的每个类,它都将应用已配置的过滤器。过滤器分为包含过滤器和派出过滤器。如果每个类触发了任意一个包含过滤器,并且未触发任何排除过滤器,那么它将变成Spring bean,这意味着它将被构造、注入、初始化,并执行任何应用在Spring管理bean上的操作。
Spring Framework定义了不同但紧密相关的概念:执行器和调度器。执行器如它的名字所示:它执行任务。调度器负责记住任务应该什么时候执行,然后按时执行。
为了在@Async方法上启用异步方法执行,我们需要在@Configuration类上注解@EnableAsync。同样地,为了在@Scheduled方法上启用计划方法执行,我们需要使用@EnableScheduling注解,你会希望在RootContextConfiguration上添加这些注解,以便在应用程序的所有bean之间共享配置。不过,@EnableAsync@EnableScheduling它们自己可以创建出默认的异步和计划配置。为了自定义该行为,我们需要实现AsyncConfigurer接口返回正确的异步执行器,并通过实现SchedulingConfigurer类将正确的执行器赋给调度器。

@Configuration
@EnableAsync(proxyTargetClass = true)
@EnableScheduling
...
public class RootContextConfiguration implements AsyncConfigurer, SchedulingConfigurer
{
    ....
    @Bean
    public ThreadPoolTaskScheduler taskScheduler(){
        ...
    }
    @Override
    public Executor getAsyncExecutor()
    {
        ...
    }
    @Override
    public void configureTasks(ScheduledTaskRegistrar registrar)
    {
        ...
    }
}

@EnableAsync注解中的proxyTargetClass特性将告诉Spring使用CGLIB库而不是使用Java接口***创建含有异步或计划方法的***类。通过这种方式,我们可以在自己的bean上创建接口未指定的异步和计划方法。如果将该特性设置为假,那么只有接口指定的方法可以通过计划或异步的方法执行。新的@Bean方法将把调度器暴露为任何其他bean都可以使用的bean。方法getAsyncExecutor将告诉Spring为异步方法执行使用相同的调度器,configureTasks方法将告诉Spring为计划方法执行使用相同的调度器。
Spring将***所有对@Bean方法的调用,所以它们永远不会被调用多次。第一次调用@Bean方法的结果将被缓存,并在所有将来的调用中使用。这将允许配置中的多个方法使用其他的@Bean方法。
Spring Framework通过以***的方法封装受影响的bean对@Async方法提供支持。当Spring在其他依赖它的bean中注入使用了@Async方法的bean时,它实际上注入的是***,而不是bean自身。然后这些bean将调用***上的方法。对于普通方法来说,***只是将调用委托给了底层的方法。对于标注了@Async@javax.ejb.Asynchronous的方法,***将指示执行其执行该方法,然后立即返回。这种工作方式回导致一个结果:如果bean调用它自己的一个@Async方法,该方法不会异步执行,因为this不可以被***。因此,如果希望以异步的方式调用一个方法,那么它必须是另一个对象的方法。
创建@Scheduled方法与创建@Async方法并没有太大的区别。所有需要做的就是编写一个完成任务的方法并注解它。关于@Scheduled方法需要注意的重要一点是:它们没有参数。

#Java##读书笔记#
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务