在 Config 类中追加 MyBeanFactory 的 Bean:
@Configurationpublic class Config {
@Bean(name = "myCustomBeanName")
public MyBeanName getMyBeanName() {
return new MyBeanName();
}
@Bean
public MyBeanFactory getMyBeanFactory() {
return new MyBeanFactory();
}
}
新建 BeanFactoryMain 类,代码如下:
public class BeanFactoryMain {public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
MyBeanFactory myBeanFactory = context.getBean(MyBeanFactory.class);
myBeanFactory.getMyBeanName();
context.close();
}
}
初始化 MyBeanFactory 后就可以调用 getMyBeanName() 方法了,程序输出的结果如下所示:
myCustomBeanNametrue
true
结果符合我们的预期:MyBeanName 的名字为“myCustomBeanName”,MyBeanName 和 MyBeanFactory 的 scope 都是 singleton。
3)其他几个 Aware 接口就不再举例说明了。通常情况下,不要实现 Aware 接口,因为它会使 Bean 和 Spring 框架耦合。
02、异步编程“二哥,据说 Spring 可以通过 @Async 来实现异步编程,你能给我详细说说吗?”
“没问题啊。”
新建一个 AsyncService 类,内容如下:
public class AsyncService {@Async
public void execute() {
System.out.println(Thread.currentThread().getName());
}
}
@Async 注解用在 public 方法上,表明 execute() 方法是一个异步方法。
新建一个 AsyncConfig 类,内容如下:
@Configuration@EnableAsync
public class AsyncConfig {
@Bean
public AsyncService getAsyncService() {
return new AsyncService();
}
}
在配置类上使用 @EnableAsync 注解用以开启异步编程,否则 @Async 注解不会起作用。
新建一个 AsyncMain 类,内容如下:
public class AsyncMain {public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AsyncConfig.class);
AsyncService service = context.getBean(AsyncService.class);
for (int i = 0; i < 10; i++) {
service.execute();
}
}
程序输出结果如下:
SimpleAsyncTaskExecutor-1SimpleAsyncTaskExecutor-9
SimpleAsyncTaskExecutor-7
SimpleAsyncTaskExecutor-8
SimpleAsyncTaskExecutor-10
SimpleAsyncTaskExecutor-3
SimpleAsyncTaskExecutor-2
SimpleAsyncTaskExecutor-4
SimpleAsyncTaskExecutor-6
SimpleAsyncTaskExecutor-5
OK,结果符合我们的预期,异步编程实现了。就像你看到的那样,Spring 提供了一个默认的 SimpleAsyncTaskExecutor 用来执行线程,我们也可以在方法级别和应用级别上对执行器进行配置。
1)方法级别
新建 AsyncConfig 类,内容如下:
@Configuration@EnableAsync
public class AsyncConfig {
@Bean
public AsyncService getAsyncService() {
return new AsyncService();
}
@Bean(name = "threadPoolTaskExecutor")
public Executor threadPoolTaskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(5);
return executor;
}
}