Spring容器中有三种配置方式(链接如下):
①基于Xml的配置
③基于Java源代码的配置
目录
基于注解的配置存在@Bean分散的问题,为了方便集中查看,添加一个配置类来存放@Bean方法就是基于Java源代码的配置。
一、添加配置类
@Configuration注解
定义当前类为配置类,相当于Xml配置文件,包含一个或多个@Bean注解的方法
二、例子
1.MovieFinder接口
public interface MovieFinder {
void findAll();
}
2.CSMovieFinder类
MovieFinder接口的实现类
public class CSMovieFinder implements MovieFinder {
@Override
public void findAll() {
System.out.println("在CSV文件中查找电影作品");
}
}
3.MemMovieFinder类
MovieFinder接口的实现类
public class MemMovieFinder implements MovieFinder {
@Override
public void findAll() {
System.out.println("在内存中查找");
}
}
4.MovieLister类
/*
@RequiredArgsConstructor (lombok注解):构造方法注入
可替代:@Autowired
public MovieLister(@NonNull MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}
*/
@RequiredArgsConstructor
public class MovieLister {
// 依赖(关联)--------
private final MovieFinder movieFinder;
public void directedBy() {
this.movieFinder.findAll();
}
}
6.AppConfiguration配置类
优先级:@Qualifier > @Primary
@Configuration //定义当前类为配置类,包含一个或多个@Bean注解的方法
public class AppConfiguration {
@Bean //@Bean(name = "cS.finder") 可以指定名字,如果未指定,则默认为该方法名
public MovieFinder cSFinder() {
return new CSMovieFinder();
}
@Bean
// @Primary 指定该Bean优先
public MovieFinder memFinder() {
return new MemMovieFinder();
}
// @Qualifier("") 限定符,指定注入哪个Bean
@Bean
public MovieLister movieLister(@Qualifier("cSFinder") MovieFinder movieFinder) {
return new MovieLister(movieFinder);
}
}
5.Main类
public class Main {
public static void main(String[] args) {
//通过配置类找Bean
var container = new AnnotationConfigApplicationContext(AppConfiguration.class);
var movieLister = container.getBean(MovieLister.class);
movieLister.directedBy();
var movie = container.getBean("memFinder",MovieFinder.class);
movie.findAll();
}
}
三、三种配置混合使用
在自定义的配置类中,注解通过@ComponentScan,Xml通过@ImportResource
@ComponentScan:默认会扫描该类所在的包,自动装配到spring的bean容器中。
若要指定扫描的包,则使用valule属性,@ComponentScan(value = " ")
@ImportResource:导入Spring的配置文件,@ImportResource("classpath:配置文件名")。
三种配置的优先级:Xml > Java源代码 > 注解