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;
}
}

浙公网安备 33010602011771号