Spring容器中有三种配置方式(链接如下):
①基于Xml的配置
②基于注解的配置
目录
@RequiredArgsConstructor (lombok注解)
AnnotationConfigApplicationContext(包名)
一、基于注解的配置
@Component
将此类标记为Bean,该Bean的name默认为:此类名首字母小写
也可以自己设name,例:@Component("csMovie")
@Autowired
自动装配Bean
@RequiredArgsConstructor (lombok注解)
构造方法注入,可替代:
@Autowired
public MovieLister(@NonNull @Qualifier("csMovie") MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}
@NonNull
相当于注入一段代码
if(writer == null) {
throw new RuntimeException("writer不能为空");
}
@Primary
指定该Bean优先
@Qualifier
限定符,指定注入哪个Bean
三种指定方法的优先级
@Qualifier > @Primary > 将MovieLister中依赖改为指定Bean的名字
AnnotationConfigApplicationContext(包名)
会扫描该包下的所有文件
二、例子
1.MovieFinder接口
public interface MovieFinder {
void findAll();
}
2.CSMovieFinder类
MovieFinder接口的实现类
@Component("csMovie")
public class CSMovieFinder implements MovieFinder {
@Override
public void findAll() {
System.out.println("在CSV文件中查找电影作品");
}
}
3.MemMovieFinder类
MovieFinder接口的实现类
@Primary //指定该Bean优先 @Qualifier > @Primary > 将MovieLister中依赖改为指定Bean的名字
@Component("memMovie")
public class MemMovieFinder implements MovieFinder {
@Override
public void findAll() {
System.out.println("在内存中查找");
}
}
4.MovieLister类
@Component
/*
@RequiredArgsConstructor (lombok注解):构造方法注入
可替代:@Autowired
public MovieLister(@NonNull @Qualifier("csMovie") MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}
*/
public class MovieLister {
// 依赖(关联)--------
private final MovieFinder movieFinder; //@Qualifier > @Primary > 将MovieLister中依赖改为指定Bean的名字
// 注入-------
@Autowired // @Autowired 自动装配Bean
public MovieLister(@NonNull @Qualifier("csMovie") MovieFinder movieFinder) {
this.movieFinder = movieFinder;
} // @Qualifier("memMovie")限定符,指定注入哪个Bean @Qualifier > @Primary > 将MovieLister中依赖改为指定Bean的名字
/* @NonNull 相当于注入一段代码: if(writer == null) {
throw new RuntimeException("writer不能为空");
}
*/
public void directedBy() {
this.movieFinder.findAll();
}
}
5.Main类
public class Main {
public static void main(String[] args) {
var container = new AnnotationConfigApplicationContext("tcu.se.ead2023"); //会扫描该包下的所有文件
var movieLister = container.getBean(MovieLister.class);
movieLister.directedBy();
var movie = container.getBean("memMovie",MovieFinder.class);
movie.findAll();
}
//松耦合
// 如果修改,则 -> 编译 -> 打包测试 -> 部署 -> 停止/启动 -> 服务中断
// 开闭原则:对扩展开放,对修改封闭
}
三、缺点
不方便查看应用中的对象有多少个,有哪些,无法集中查看。