美文网首页
04-spring源码解析之ioc 自动装配

04-spring源码解析之ioc 自动装配

作者: 刘小刀tina | 来源:发表于2020-01-25 19:56 被阅读0次

    自动装配:
    1.@Autowired ==>spring定义
    (1)默认优先按照类型去容器中找到对象的组件,找到之后直接注入到容器中
    (2)如果找到多个相同类型的组件,再按照属性的名称作为组件的id去容器中查找
    @Qualifier("bookDao2") +@Autowired :
    也可以使用这对注解,不过@Qualifier须指定具体要装配的组件的id而不能是属性名;
    自动装配默认是一定要将属性赋值好,否则就会报错;
    但是也可以通过使用@Autowired(required=false) :找到组件就注入,找不到就不注入也不会报错;
    @Primary:让那个Spring进行自动装配的时候,默认使用首选的bean,一般是用在组件上。

    1. @Resource ==>java规范
      可以和@Autowired一样实现自动装配的功能,默认是按照组件名称进行装配的;没有能支持@Parimary功能没有支持@Autowired(reqiured=true)
    2. @Inject ==>java规范
      需要导入java.inject的包,和Autowired的功能一样;没有required=false的功能
      @Autowired:构造器,参数,方法,属性,都是从容器中获取参数组件的值
      (1)标注在方法位置上:@Bean+方法参数,参数从容器中获取,默认不写@Autowire
      (2)标注在构造器上:如果组件只有一个参数构造器,这个有参构造器的@Autowired可以省略
      (3)放在参数位置
    3. profile :指定组件在哪个环境中才能被注册到容器中;不指定的话则任何环境下都能注册组件
    • Spring 为我们提供的可以根据当前环境,动态的激活和切换一系列组件的功能;
    • (1)加了环境标示注解@Profile的bean,只有这个环境被激活时才能注册到容器中;默认是default环境
    • (2)写在配置类上,只有是指定的环境的时候,整个配置类里面的所有配置才能开始生效
    • (3)没有标注环境的bean,任何环境下都是加载的
    • *指定运行时的环境:
        • 1.使用命令行参数的方式:在虚拟机的位置加载-Dspring.profile.active=test
        • 2.使用代码的方法指定运行环境

    1.@Autowired

    @Repository
    public class Dao {
    
    }
    =========================================================
    @org.springframework.stereotype.Service
    public class Service {
    
        private  Dao dao;
    
    
        //有参构造方法
       // @Autowired
        public Service(@Autowired Dao dao) {
            this.dao = dao;
        }
    
        public Dao getDao() {
            return dao;
        }
    
        //@Autowired
        public void setDao(Dao dao) {
            this.dao = dao;
        }
    }//类的大括号
    
    =========================================================
    
    @org.springframework.stereotype.Service
    public class Service {
    
        private  Dao dao;
    
    
        //有参构造方法
       // @Autowired
        public Service(@Autowired Dao dao) {
            this.dao = dao;
        }
    
        public Dao getDao() {
            return dao;
        }
    
        //@Autowired
        public void setDao(Dao dao) {
            this.dao = dao;
        }
    
    }//类的大括号
    =========================================================
    @Configuration//表明是一个配置类
    @ComponentScan({"com.tina.spring0123.autowired"})
    public class config {
    }
    =========================================================
    @SpringBootTest
    public class IocTestAutowire {
     @Test
        public void test2(){
            //读取配置类获取容器
            AnnotationConfigApplicationContext ioc = new AnnotationConfigApplicationContext(config.class);
            Service service = (Service)ioc.getBean("service");
            System.out.println("service的值为:"+service);
            Dao dao = (Dao)ioc.getBean("dao");
            System.out.println("dao的值为:"+dao);
    
        }
    }
    
    

    4. profile :

    db.properties:
    db.user= root
    db.password= 123456
    #db.url= jdbc:mysql://152.136.27.48:3306/d_tina?characterEncoding=utf8&characterSetResults=utf8&autoReconnect=true&failOverReadOnly=false
    db.driverClass=com.mysql.jdbc.Driver
    =========================================================
    
    **
     * @program: spring-0123
     * @description
     * profile :指定组件在哪个环境中才能被注册到容器中;不指定的话则任何环境下都能注册组件
     * Spring 为我们提供的可以根据当前环境,动态的激活和切换一系列组件的功能;
     * (1)加了环境标示注解@Profile的bean,只有这个环境被激活时才能注册到容器中;默认是default环境
     * (2)写在配置类上,只有是指定的环境的时候,整个配置类里面的所有配置才能开始生效
     * (3)没有标注环境的bean,任何环境下都是加载的
     * @author: tina.liu
     * @create: 2020-01-25 16:49
     **/
    @Profile(value = "test")
    @Configuration //表明是一个配置类
    @PropertySource(value = {"classpath:db.properties"}) //指定读取外部的配置文件中的值保存在IOC容器中
    public class ProfileConfig implements EmbeddedValueResolverAware {
    
        @Value("${db.user}")
        private String user;
    
        private StringValueResolver valueResolver;
        private  String driverClass =null;
    
        @Override
        public void setEmbeddedValueResolver(StringValueResolver stringValueResolver) {
                this.valueResolver=stringValueResolver;
                driverClass = valueResolver.resolveStringValue("${db.driverClass}");
    
        }
    
        @Bean
       // @Profile(value = "test") //添加环境标识
        //@Profile(value = "default") //添加环境标识
        public Red red(){
            return new Red();
        }
    
        //配置数据源test
        //@Profile(value = "default")
        @Profile(value = "test") //添加环境标识
        @Bean(value = "testDatasource")
        public DataSource testDatasource(@Value("${db.password}") String password) throws PropertyVetoException {
            ComboPooledDataSource dataSource= new ComboPooledDataSource();
            dataSource.setUser(user);
            dataSource.setPassword(password);
            dataSource.setJdbcUrl("jdbc:mysql://152.136.27.48:3306/d_tina?characterEncoding=utf8&characterSetResults=utf8&autoReconnect=true&failOverReadOnly=false");
            dataSource.setDriverClass(driverClass);
            return dataSource;
        }
    
    
        //配置数据源dev
        @Profile(value = "dev") //添加环境标识
        @Bean(value = "devDatasource")
        public DataSource devDatasource(@Value("${db.password}") String password) throws PropertyVetoException {
            ComboPooledDataSource dataSource= new ComboPooledDataSource();
            dataSource.setUser(user);
            dataSource.setPassword(password);
            dataSource.setJdbcUrl("jdbc:mysql://152.136.27.48:3306/d_yoyo?characterEncoding=utf8&characterSetResults=utf8&autoReconnect=true&failOverReadOnly=false");
            return dataSource;
        }
    
        //配置数据源prod
        @Profile(value = "prod") //添加环境标识
        @Bean(value = "prodDatasource")
        public DataSource prodDatasource(@Value("${db.password}") String password) throws PropertyVetoException {
            ComboPooledDataSource dataSource= new ComboPooledDataSource();
            dataSource.setUser(user);
            dataSource.setPassword(password);
            dataSource.setJdbcUrl("jdbc:mysql://152.136.27.48:3306/d_xiaokai?characterEncoding=utf8&characterSetResults=utf8&autoReconnect=true&failOverReadOnly=false");
            dataSource.setDriverClass(driverClass);
            return dataSource;
        }
    
    }
    =========================================================
    @SpringBootTest//是SpringBoot自1.4.0版本开始引入的一个用于测试的注解。
    public class IocTestProfile  {
    
        **
         *  *指定运行时的环境:
         *  * 1.使用命令行参数的方式:在虚拟机的位置加载-Dspring.profile.active=test
         *  * 2.使用代码的方法指定运行环境
         *  *
         */
        @Test
        public void test2(){
            //读取配置类获取容器
            AnnotationConfigApplicationContext ioc = new AnnotationConfigApplicationContext();
            //设置需要激活的环境
            //ioc.getEnvironment().setActiveProfiles("test","dev");
            ioc.getEnvironment().setActiveProfiles("dev");
            //注册主配置类
            ioc.register(ProfileConfig.class);
            //刷新容器
            ioc.refresh();
            //获取容器中的所有组件 并打印出来
            String[] names = ioc.getBeanDefinitionNames();
            for (String name:names) {
                System.out.println("容器中的组件为");
                System.out.println(name);
            }
        }
    
        @Test
        public void test(){
            //读取配置类获取容器
            ApplicationContext ioc = new AnnotationConfigApplicationContext(ProfileConfig.class);
            //获取容器中的所有组件 并打印出来
            String[] names = ioc.getBeanDefinitionNames();
            for (String name:names) {
                System.out.println("容器中的组件为");
                System.out.println(name);
            }
        }
    
    }//类的大括号
    
    

    相关文章

      网友评论

          本文标题:04-spring源码解析之ioc 自动装配

          本文链接:https://www.haomeiwen.com/subject/rqyrthtx.html