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 }