springboot实战(汪云飞)学习-1-2

java EE开发的颠覆者 spring boot 实战 随书学习-1

接上一篇,Java配置的学习(还是上一篇的项目中,添加新的包和代码):

java配置是spring4.x推荐的配置方式,可以完全替代xml配置,也是springboot推荐的配置方式。Java 配置是通过@Configuration和@Bean来实现的。
@Configuration 声明当前类是一个配置类 ,通过@ComponentScan 注解自动扫描指定包下的所有使用@Service @Component @Repository 和@Controller的类,将它们注册为spring的Bean

@Bean注解使用在方法上,声明当前方法的返回值是一个bean,bean的名字为方法名。

何时使用Java配置呢?主要原则是,全局配置使用Java配置(如数据库相关配置,MVC相关配置),业务bean的配置使用 注解配置(@Service @Component @Repository @Controller )。下面演示一个最简单的java配置的内容

1. 编写功能类的bean

 1 package com.wisely.highlight_spring4.ch1.javaconfig;
 2 
 3 /**
 4  * 1.定义功能类的bean 不再使用@Service注解声明当前FunctionService类是spring管理的一个bean
 5  * @author Administrator
 6  */
 7  //和上一个示例中的区别,此处没有用@Service声明bean
 8 public class FunctionService {
 9     
10     public String sayHello(String word) {
11         return "hello " + word + " !";
12     }
13 
14 }

2. 使用功能类的bean

 1 package com.wisely.highlight_spring4.ch1.javaconfig;
 2 
 3 /**
 4  * 2.使用功能类FunctionService的bean
 5  * 
 6  * @author Administrator
 7  *
 8  */
 9 //不再使用@Service声明bean
10 public class UseFunctionService {
11     //不再使用@Autowired自动注入bean,改为set方法设置functionService
12     private FunctionService functionService;
13     
14     //去掉@Service 和@Autowired注解,添加set方法
15     public void setFunctionService(FunctionService functionService) {
16         this.functionService = functionService;
17     }
18 
19     public String sayHello(String word) {
20         return functionService.sayHello(word);
21     }
22 
23 }

3.Java配置类编写(重点)

 1 package com.wisely.highlight_spring4.ch1.javaconfig;
 2 
 3 import org.springframework.context.annotation.Bean;
 4 import org.springframework.context.annotation.ComponentScan;
 5 import org.springframework.context.annotation.Configuration;
 6 /**
 7  * 3.spring配置类
 8  * spring4.x推荐使用java配置替代xml配置,通过 @Configuration和 @Bean 两个注解来实现
 9  * @Configuration 声明当前类是一个配置类,相当于一个spring配置的xml文件
10  * @Bean 注解用在方法上,声明当前方法的返回值为一个Bean
11  * 何时使用Java配置?:全局配置使用Java配置(如数据库相关配置,MVC相关配置),业务bean的配置使用
12  * 注解配置(@Service @Component @Repository @Controller)
13  * @author Administrator
14  *
15  */
16 @Configuration
17 public class JavaConfig {
18 
19     //Bean注解声明当前方法返回值是一个bean,bean的名称是方法名functionService
20     @Bean
21     public FunctionService functionService() {
22         return new FunctionService();
23     }
24     
25     @Bean
26     public UseFunctionService useFunctionService() {
27         UseFunctionService useFunctionService = new UseFunctionService();
28         //直接调用functionService() 注入FunctionService的Bean
29         useFunctionService.setFunctionService(functionService());//
30         return useFunctionService;
31     }
32     
33 //    @Bean
34     //另外一种注入方式:直接将FunctionService作为参数给useFunctionService1().
35     //spring容器中,只要容器中存在某个Bean,就可以在另外一个Bean的声明方法的参数中注入!!!
36     /*public UseFunctionService useFunctionService1(FunctionService functionService) {//此处不能也叫useFunctionService,会报错
37  UseFunctionService useFunctionService = new UseFunctionService(); 38  //直接调用functionService() 注入FunctionService的Bean 39  useFunctionService.setFunctionService(functionService);// 40  return useFunctionService; 41  }*/ 42 43 }

说明:

(1).@Configuration注解表明当前类是一个配置类,这意味着这个类里面可能有0个或多个@Bean注解,此处没有使用@ComponentScan注解扫描包,是因为所有的bean都在此类中定义了
(2).使用@Bean注解声明当前方法,如:public FunctionService functionService() { return new FunctionService(); } 的返回值是一个Bean ,Bean的名称是方法名functionService

(3). 注入FunctionService 的Bean的时候直接调用functionService()
(4).另外一种注入的方式,直接将FunctionService 作为参数给useFunctionService(),这也是spring容器提供的一个功能。在spring容器中,只要容器中存在某个bean,就可以在另外一个Bean的声明方法的参数中注入。

4.测试

 1 package com.wisely.highlight_spring4.ch1.javaconfig;
 2 
 3 import org.springframework.context.annotation.AnnotationConfigApplicationContext;
 4 /**
 5  * 4.测试
 6  * @author Administrator
 7  *
 8  */
 9 public class MainTest {
10     
11     public static void main(String[] args) {
12         //1.使用AnnotationConfigApplicationContext最为spring容器,接受一个配置类作为参数
13         AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(JavaConfig.class);
14         //2.获得声明配置的UseFunctionService 的bean
15         UseFunctionService useFunctionService = context.getBean(UseFunctionService.class);
16         //3.调用bean的方法
17         System.out.println(useFunctionService.sayHello("java config"));
18         context.close();
19         
20     
21     }
22 
23 }

 

 

 



posted @ 2018-05-30 23:01  清风拂来  阅读(744)  评论(0编辑  收藏  举报