Spring的Java配置方式

Spring的Java配置

Java配置是Spring.4.x推荐的配置方式,可以完全替代xml配置;Java配置也是spring boot推荐的配置方式。

Java配置是通过@Configuration和@Bean来实现的:

  • @Configuration声明当前类是一个配置类,相当于一个Spring配置的xml文件。
  • @Bean注解在方法上,声明当前方法的返回值是一个Bean,Bean的名称是方法名。

这里有个问题是,当配置类中只有部分Bean在配置类中配置时,使用@ComponentScan仍然不能扫描那些使用了注解配置的Bean,报错显示找不到对应的Bean。

 

 1 package service;
 2 
 3 import org.springframework.stereotype.Service;
 4 
 5 //注意:这里没有使用@Service注解
 6 public class FunctionService {
 7 
 8     public String sayHello(String word){
 9         return "hello"+word;
10     }
11 }

 

package service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;


public class UseFunctionService {

    private FunctionService functionService;

    public void setFunctionService(FunctionService functionService) {
        this.functionService = functionService;
    }

    public String sayHello(String word){
        return functionService.sayHello(word);
    }
}

  以上两个Service类都没有使用@Service注解,而是在配置类里面使用@Bean的方式注册Bean

 1 package config;
 2 
 3 import org.springframework.context.annotation.Bean;
 4 import org.springframework.context.annotation.ComponentScan;
 5 import org.springframework.context.annotation.Configuration;
 6 import repository.dao.UserDAO;
 7 import service.FunctionService;
 8 import service.UseFunctionService;
 9 
10 
11 @Configuration
12 //@ComponentScan(basePackages = "example.demo.service")
13 public class SpringConfig {
14     
15     @Bean // 通过该注解来表明是一个Bean对象,相当于xml中的<bean>
16     public UseFunctionService getUseFuntionService(){
17         UseFunctionService useFunctionService=new UseFunctionService();
18         useFunctionService.setFunctionService(getFunctionService());
19         return useFunctionService; // 直接new对象做演示
20     }
21 
22     @Bean // 通过该注解来表明是一个Bean对象,相当于xml中的<bean>
23     public FunctionService getFunctionService(){
24         return new FunctionService(); // 直接new对象做演示
25     }
26 }

 

使用@Bean注解声明当前方法FunctionService的返回值是一个Bean,Bean的名称是方法名,在配置类里面的配置方式注册了名为getUseFunctionService和

getFunctionService的Bean,我的方法的名字起得不太恰当。

当所有的Bean都通过此类方式在类中定义的时候,可以不再使用@ComponetScan包扫描。

注意 useFunctionService的的注册方式,直接将FunctionService作为参数给useFunctionService,在Spring容器中,只要容器中存在某个Bean,就可以在另一个Bean的声明方法中注入。

 

测试类

 1 import config.SpringConfig;
 2 import org.springframework.context.annotation.AnnotationConfigApplicationContext;
 3 import repository.entity.User;
 4 import service.UseFunctionService;
 5 import service.UserService;
 6 
 7 import java.util.List;
 8 
 9 public class Main {
10     
11     public static void main(String[] args) {
12         // 通过Java配置来实例化Spring容器
13         AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
14 
15         // 在Spring容器中获取Bean对象
16 17         UseFunctionService useFunctionService=context.getBean(UseFunctionService.class);
18        
19         System.out.println(""+useFunctionService.sayHello(" spring boot"));
20         // 销毁该容器
21         context.destroy();
22     }
23 }

 

 

package service;

import org.springframework.stereotype.Service;


public class FunctionService {

public String sayHello(String word){
return "hello"+word;
}
}
posted @ 2017-12-07 09:49  Garcia11  阅读(327)  评论(0)    收藏  举报