使用注解实现异步

RunnableDemo类

package com.boot.enable.bootenable;

import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component; import java.util.concurrent.TimeUnit; @Component
public class RunnableDemo implements Runnable { @Async // 异步方式执行方法
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("----------------"+ (i +1));
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

测试类

package com.boot.enable.bootenable;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.scheduling.annotation.EnableAsync; @SpringBootApplication
@EnableAsync
public class BootEnableApplication { public static void main(String[] args) {
ConfigurableApplicationContext context =
SpringApplication.run(BootEnableApplication.class, args);
Runnable bean = context.getBean(Runnable.class);
System.out.println("-----------start-----------");
bean.run();
System.out.println("-----------end-----------"); context.close();
}
}

运行结果分析:

run方法打印的内容是异步进行的,是独立于主线程外的线程,所以-----------end-----------打印后,run方法依然再进行打印

几种装配方式

1.普通的方式

package com.boot.enable.imp.demo;

public class Book {
}
package com.boot.enable.imp.demo;

import org.springframework.stereotype.Component;

@Component
public class User {
}
package com.boot.enable.imp.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean; /**
* 普通方式装配
*/
@SpringBootApplication
public class ImportApplication { @Bean
public Book book() {
return new Book();
} public static void main(String[] args) {
ConfigurableApplicationContext context =
SpringApplication.run(ImportApplication.class, args);
System.out.println(context.getBean(User.class));
System.out.println(context.getBean(Book.class)); context.close();
}
}

使用@Import装配的第一种方式

package com.boot.enable.imp.demo1;

public class Book {
}
package com.boot.enable.imp.demo1;

public class User {
}
package com.boot.enable.imp.demo1;

import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata; public class BeanImportSelector implements ImportSelector {//不需要注入其他属性时使用
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[]{"com.boot.enable.imp.demo1.Book"
,"com.boot.enable.imp.demo1.User"};
}
}
package com.boot.enable.imp.demo1;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Import; /**
* 使用@Import方式装配
*/
@SpringBootApplication
// @Import({User.class, Book.class})
@Import(BeanImportSelector.class)
public class ImportApplication1 { public static void main(String[] args) {
ConfigurableApplicationContext context =
SpringApplication.run(ImportApplication1.class, args);
System.out.println(context.getBean(User.class));
System.out.println(context.getBean(Book.class)); context.close();
}
}

使用@Import装配 第二种方式

package com.boot.enable.imp.demo2;

import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata; public class MyBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {//有属性注入时使用
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
// 创建构建器对象
BeanDefinitionBuilder bdb = BeanDefinitionBuilder.rootBeanDefinition(User.class);
BeanDefinition beanDefinition = bdb.getBeanDefinition();
registry.registerBeanDefinition("user", beanDefinition); BeanDefinitionBuilder bdb1 = BeanDefinitionBuilder.rootBeanDefinition(Book.class);
BeanDefinition beanDefinition1 = bdb1.getBeanDefinition();
registry.registerBeanDefinition("book", beanDefinition1);
}
}
package com.boot.enable.imp.demo2;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Import; /**
* 使用@Import方式装配
*/
@SpringBootApplication
@Import(MyBeanDefinitionRegistrar.class)
public class ImportApplication1 { public static void main(String[] args) {
ConfigurableApplicationContext context =
SpringApplication.run(ImportApplication1.class, args);
System.out.println(context.getBean("user",User.class));
System.out.println(context.getBean(Book.class)); context.close();
}
}

实例演示:注解注册监控器实现

实体类准备:

package com.boot.enable.sample.bean;

import org.springframework.stereotype.Component;

@Component
public class Person {
}
public class Person1 {
}
package com.boot.enable.sample.bean;

import org.springframework.stereotype.Component;

@Component
public class Person2 {
}
package com.boot.enable.sample.vo;

import org.springframework.stereotype.Component;

@Component
public class UserVO {
}

自定义一个注解(借用@Import机制)

package com.boot.enable.sample;

import org.springframework.context.annotation.Import;

import java.lang.annotation.*;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(ScannerPackageRegistrar.class)
public @interface EnableScanner {
String[] packages();
}
package com.boot.enable.sample;

import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata; import java.util.Arrays;
import java.util.List; public class ScannerPackageRegistrar implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata,
BeanDefinitionRegistry registry) {
String[] attrs = (String[]) importingClassMetadata
.getAnnotationAttributes(EnableScanner.class.getName())
.get("packages");//获取到注解的packages属性
List<String> packages = Arrays.asList(attrs);
System.out.println(packages);
BeanDefinitionBuilder bdb = BeanDefinitionBuilder.rootBeanDefinition(MyBeanDefinitionProcessor.class);
bdb.addPropertyValue("packages", packages);//注入属性 registry.registerBeanDefinition(MyBeanDefinitionProcessor.class.getName(), bdb.getBeanDefinition());//装配到Spring容器中 }
}
package com.boot.enable.sample;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor; import java.util.List; public class MyBeanDefinitionProcessor implements BeanPostProcessor { private List<String> packages; public List<String> getPackages() {
return packages;
} public void setPackages(List<String> packages) {
this.packages = packages;
} @Override//扫描出装配到容器中的类并打印出对应实例
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
for (String pack : packages) { if (bean.getClass().getName().startsWith(pack)) {
System.out.println("instance bean:"+bean.getClass().getName());
}
}
return bean;
}
}

测试类

package com.boot.enable.sample;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext; /**
* 普通方式装配
*/
@SpringBootApplication
@EnableScanner(packages ={"com.boot.enable.sample.bean","com.boot.enable.sample.vo"}) // 启用监控扫描类的注解
public class ScannerPackageApplication { public static void main(String[] args) {
ConfigurableApplicationContext context =
SpringApplication.run(ScannerPackageApplication.class, args);
context.close(); new ScannerPackageApplication().callFunction(new FunctionImpl());//回调演示
} interface Function {
void hello();
} static class FunctionImpl implements Function { @Override
public void hello() {
System.out.println("调用了FunctionImpl->Hello方法");
}
} public void callFunction(Function fun) {
     //处理其他事 
fun.hello(); //回调
     //处理其他事
}
}

打印结果(打印出注入到Spring容器中的实例,Person1未加注解,所以未打印)

监控器流程图解

最新文章

  1. 【repost】JavaScript Scoping and Hoisting
  2. 阿伦学习html5 之Web SQL Database
  3. iOS多线程初见
  4. Android Studio系列教程二--基本设置与运行
  5. 第一篇、Swift_搭建UITabBarController + 4UINavigationController主框架
  6. Eclipse怎样导入github上的项目
  7. U盘量产的作用
  8. HDU 4720 Naive and Silly Muggles (外切圆心)
  9. ASP.NET Web Service中使用Session 及 Session丢失解决方法 续
  10. Android 7.0 Power 按键处理流程
  11. AWS认证权威考经(助理级认证篇)
  12. JaVa第二周学习总结
  13. Spark 用户自定义函数 Java 示例
  14. centos/RHEL 7.6 使用yum安装php7.3(方便wordpress的php7.3需求,并解决了libphp7.so缺失问题)
  15. JDBC 增、改、删 MySQL中的表
  16. 商务通服务器版LR_Data目录下相关配置文件
  17. Java_9 面向对象
  18. 一劳永逸的搞定 FLEX 布局(转)
  19. 关于Kynseed
  20. Linux CentOS7中 设置IP地址、网关DNS

热门文章

  1. VMWare虚拟机的网络类型配置选择详解
  2. Prism for WPF 搭建一个简单的模块化开发框架(三) 给TreeView加样式做成菜单
  3. 下载地图瓦片(包括各种格式的,Openstreetmap,googlemap, bingmap)
  4. 北京Uber优步司机奖励政策(1月1日)
  5. MySQL 存储过程常用SQL语句收集
  6. Java:二进制(原码、反码、补码)与位运算
  7. 编译Chromium出现warning C4819的解决办法
  8. 围绕DOM元素节点的增删改查
  9. GIt学习第一天之安装和版本库创建
  10. 单机部署Fastfds+nginx