Spring高级话题(1)

所有代码示例必须配置好Spring Spring项目的快速搭建.

1、Apring Aware

1.1、理论

Spring Aware的目的就是为了让Bean获得Spring容器的服务。

Spring 提供的Aware接口:

  • BeanNameAware:获得容器中的Bean的名称;
  • BeanFactoryAware:获得当前bean factory,这样容易调用容器服务;
  • ApplicationContextAware*:获得当前application context,这样容易调用容器服务;
  • MessageSourceAware: 获得message source,这样可以获得文本信息;
  • ApplicationEventPublisher Aware:应用实践发布器,可以发布事件;
  • ResourceLoaderAware: 获得资源加载器,可以获得外部资源文件;

1.2、示例

1)准备

新建一个text.tex,内容随意,用于测试资源加载

2)演示Bean

package com.wisely.highlight_spring4.ch3.aware;

import java.io.IOException;

import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.context.ResourceLoaderAware;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.stereotype.Service;

@Service
public class AwareService implements BeanNameAware,ResourceLoaderAware{//实现接口,分别获得Bean名称和资源加载的服务

    private String beanName;
    private ResourceLoader loader;

    @Override
    public void setResourceLoader(ResourceLoader resourceLoader) {//重写ResourceLoaderAware的setResourceLoader方法
        this.loader = resourceLoader;
    }

    @Override
    public void setBeanName(String name) {//重写BeanNameAware的setBeanName方法
        this.beanName = name;
    }

    public void outputResult(){
        System.out.println("Bean的名称是:" + beanName);

        Resource resource =
                loader.getResource("classpath:com/wisely/highlight_spring4/ch3/aware/test.txt");
        try{

            System.out.println("ResourceLoader加载的文件的内容为: " + IOUtils.toString(resource.getInputStream()));

           }catch(IOException e){
            e.printStackTrace();
           }

    }

}

3)配置类

package com.wisely.highlight_spring4.ch3.aware;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan("com.wisely.highlight_spring4.ch2.aware")
public class AwareConfig {

}

4)测试

package com.wisely.highlight_spring4.ch3.aware;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Main {
    public static void main(String[] args) {

        AnnotationConfigApplicationContext context =
                new AnnotationConfigApplicationContext(AwareConfig.class);

        AwareService awareService = context.getBean(AwareService.class);
        awareService.outputResult();

        context.close();
    }
}

2、多线程

2.1、理论

Spring通过任务执行器(TaskExecutor)来实现多线程和并发编程。使用TreadPoolTaskExecutor可以实现一个基于线程池的TaskExecutor。而实际开发中任务一般是非常阻碍的,即异步的,所以我们要在配置类中通过@EnableAsync开启对异步任务的支持,并通过在实际执行的Bean方法中使用@Asynv注解来声明其实一个异步任务。

2.2、示例

1)配置类

package com.wisely.highlight_spring4.ch3.taskexecutor;

import java.util.concurrent.Executor;

import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
@Configuration
@ComponentScan("com.wisely.highlight_spring4.ch3.taskexecutor")
@EnableAsync //开启异步任务支持
public class TaskExecutorConfig implements AsyncConfigurer{//实现AsyncConfigurer接口

    @Override
    public Executor getAsyncExecutor() {//重写getAsyncExecutor返回一个ThreadPoolTaskExecutor,这样我们就获得了一个基于线程池的TaskExecutor
         ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
            taskExecutor.setCorePoolSize(5);
            taskExecutor.setMaxPoolSize(10);
            taskExecutor.setQueueCapacity(25);
            taskExecutor.initialize();
            return taskExecutor;
    }

    @Override
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
        return null;
    }

}

2)业务执行类

package com.wisely.highlight_spring4.ch3.taskexecutor;

import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
@Service
public class AsyncTaskService {

    @Async //表明这个方法是个异步方法,如果注解在类级别,则表明该类所有的方法都是异步方法,而这里的方法自动被注入使用ThreadPoolTaskExecutor作为TaskExecutor
    public void executeAsyncTask(Integer i){
        System.out.println("执行异步任务: "+i);
    }

    @Async
    public void executeAsyncTaskPlus(Integer i){
        System.out.println("执行异步任务+1: "+(i+1));
    }

}

4)测试

package com.wisely.highlight_spring4.ch3.taskexecutor;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Main {

    public static void main(String[] args) {
         AnnotationConfigApplicationContext context =
                    new AnnotationConfigApplicationContext(TaskExecutorConfig.class);

         AsyncTaskService asyncTaskService = context.getBean(AsyncTaskService.class);

         for(int i =0 ;i<5;i++){
             asyncTaskService.executeAsyncTask(i);
             asyncTaskService.executeAsyncTaskPlus(i);
            }
            context.close();
    }
}

原文地址:https://www.cnblogs.com/bigfly277/p/9520855.html

时间: 2024-10-09 01:54:46

Spring高级话题(1)的相关文章

Spring高级话题[email&#160;protected]***注解的工作原理

出自:http://blog.csdn.net/qq_26525215 @EnableAspectJAutoProxy @EnableAspectJAutoProxy注解 激活Aspect自动代理 <aop:aspectj-autoproxy/> 开启对AspectJ自动代理的支持. 在用到AOP的自动代理的时候用,如果你理解了Java的动态代理,很容易的就会熟悉AOP的自动代理的. @EnableAsync @EnableAsync注解开启异步方法的支持. 这个相信大家都比较熟悉的.对于异步

【Spring】Spring高级话题-多线程-TaskExecutor

转载请注明出处:http://blog.csdn.net/qq_26525215 本文源自[大学之旅_谙忆的博客] 分析 在Spring中,通过任务执行器,也就是TaskExecutor来实现多线程和并发编程. 使用ThreadPoolTaskExecutor可实现一个基于线程池的TaskExecutor. 而实际开发中任务一般是非阻碍的,也就是非异步的,所以我们要在配置类中通过@EnableAsync开启对异步任务的支持,并通过在实际执行的Bean的方法中使用@Async注解来声明其是一个异步

Spring高级话题

Spring Aware 在实际项目中,你不可避免的要用到spring容器本身的功能资源,这时你的bean要意识到spring容器的存在,才能调用spring提供的资源.spring aware本来就是spring设计用来框架内部使用的.若使用spring aware,你的Bean将会与srping框架耦合. 多线程 配置类 任务执行类 计划任务 条件注解@Conditional 组合注解 测试 拦截器 原文地址:https://www.cnblogs.com/duan2/p/9219157.h

转:如何学习SQL(第四部分:DBMS扩展功能与SQL高级话题)

转自:http://blog.163.com/[email protected]/blog/static/285720652010950102575/ 9. DBMS提供的扩展功能 掌握了基本的关系模型原理和DBMS的数据类型,还需要对DBMS提供的扩展功能有所了解,才能充分运用DBMS进行数据库开发. 9.1. 控制流 SQL是说明式语言,但DBMS面对实际开发的需求,通常在SQL方言中都提供了过程式的扩展,包括(以T-SQL为例):1. 变量定义和赋值[code=sql] DECLARE @

Spring高级事务管理难点剖析

1Spring事务传播行为 所谓事务传播行为就是多个事务方法相互调用时,事务如何在这些方法间传播.Spring支持7种事务传播行为 PROPAGATION_REQUIRED(加入已有事务) 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中.这是最常见也是默认的方式. PROPAGATION_SUPPORTS(跟随环境) 支持当前事务,如果当前没有事务,就以非事务方式执行. PROPAGATION_MANDATORY(需要事务) 使用当前的事务,如果当前没有事务,就抛出异

python类高级话题

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86

C#中的线程(四)高级话题

C#中的线程(四)高级话题 Keywords:C# 线程Source:http://www.albahari.com/threading/Author: Joe AlbahariTranslator: Swanky WuPublished: http://www.cnblogs.com/txw1958/Download:http://www.albahari.info/threading/threading.pdf 第四部分:高级话题 非阻止同步 早些时候,我们讨论了非常简单的赋值和 更新一个字

spring—高级装配

1. 配置profile Bean 在3.1版本中,Spring引入了bean frofile的功能.要使用profile,你首先要将所有不同的bean定义整理到一个或多个profile之中,在将应用部署到每个环境时,要确保对应的profile处于激活(active)状态. @profile("dev") @profile注解应用在类级别上.他会告诉Spring这个配置类中的bean只有在dev profile激活时才会创建.如果dev profile没有激活的话,那么带有@Bean注

Spring实战(四)Spring高级装配中的bean profile

profile的原意为轮廓.剖面等,软件开发中可以译为"配置". 在3.1版本中,Spring引入了bean profile的功能.要使用profile,首先要将所有不同的bean定义整理到一个或多个profile中,在将应用部署到每个环境时,要确保对应的profile处于激活(active)状态. 1.@Profile注解应用在类上 在一个类上使用JavaConfig中的注解@Profile("xxx"),指定这个类中的bean属于某一个profile. 它告诉S