Spring容器中基于注解的配置

Spring容器中有三种配置方式(链接如下):

①基于Xml的配置

②基于注解的配置

基于Java源代码的配置

目录

一、基于注解的配置

@Component

@Autowired

@RequiredArgsConstructor  (lombok注解)

@NonNull

@Primary

@Qualifier

三种指定方法的优先级

AnnotationConfigApplicationContext(包名)

二、例子

1.MovieFinder接口

2.CSMovieFinder类

3.MemMovieFinder类

4.MovieLister类

5.Main类

三、缺点


一、基于注解的配置


@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();
    }
    //松耦合
    // 如果修改,则 -> 编译 -> 打包测试 -> 部署 -> 停止/启动 -> 服务中断
    // 开闭原则:对扩展开放,对修改封闭
}

三、缺点


        不方便查看应用中的对象有多少个,有哪些,无法集中查看。

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值