一、SpringIOC基于注解的方式进行注入:通过设计模式+反射机制来模拟注入过程
    1、spring的配置文件:beans.xml:开启扫描包的过程,spring会去扫描该包下所有子类,为了检查有没有spring提供的注解。
    2、要在指定的类上加注解,如果spring检查到该类上有注解,就将该类的实例通过反射机制创建出来,装进spring中。
    3、会检查该类中的属性上有没有spring提供的注解,如果有的话,会通过反射的方式去注入实例。

    二、基于注解的方式创建核心容器对象
    spring 5.0版本后支持注解的方式创建核心容器对象,这样我们的程序就可以脱离xml配置文件。

    @Configuration:声明当前类是一个配置类。
    image.png
    @ComponentScan:开启扫描包
    image.png
    @Bean:
    类似于xml中的bean标签,标识可以自定义,用于修饰方法,可以将修饰方法的返回值作为一份实例装载到spring容器中,给属性注入数据时可以直接使用set方法。

    1. @Configuration
    2. public class SpringConfig {
    3. @Bean
    4. public User getUser(Student stu1){
    5. User user = new User();
    6. user.setId(1);
    7. user.setName("zs");
    8. user.setPassword("123123");
    9. return user;
    10. }
    11. @Bean("stu1")
    12. public Student getStu1(){
    13. return new Student();
    14. }
    15. }

    而且修饰方法的参数实例会从容器中去匹配,匹配的规则与@Autowired 一样,都是根据类型匹配,如果同一类型有多个,根据标识即@Bean的参数,默认是类名全小写,也可以自定义,如下面的@Bean(“stu1”)与@Bean(“stu2”),还可以结合@Qualifier。

    1. @Configuration
    2. public class SpringConfig {
    3. @Bean
    4. public User getUser(Student stu1){
    5. User user = new User();
    6. user.setId(1);
    7. user.setName("zs");
    8. user.setPassword("123123");
    9. user.setStudent(student);
    10. return user;
    11. }
    12. /*@Bean
    13. public User getUser(@Qualifier("getStu1") Student student){
    14. return new User();
    15. }*/
    16. @Bean("stu1")
    17. public Student getStu1(){
    18. Student student = new Student();
    19. student.setId(100);
    20. student.setName("张三");
    21. return student;
    22. }
    23. @Bean("stu2")
    24. public Student getStu2(){
    25. Student student = new Student();
    26. student.setId(101);
    27. student.setName("李四");
    28. return student;
    29. }
    30. }

    运行结果:
    image.png
    @PropertySource:引入配置文件
    新建一个配置文件jdbc.properties
    image.png

    1. @Configuration
    2. @PropertySource("classpath:jdbc")
    3. public class JDBCConfig {
    4. @Value("${jdbc_username}")
    5. private String username;
    6. @Value("${jdbc_password}")
    7. private String password;
    8. @Bean("user")
    9. public User getUser(){
    10. User user = new User();
    11. user.setName(username);
    12. user.setPassword(password);
    13. return user;
    14. }
    15. }

    @Import:引入其他核心配置类
    image.png