美文网首页
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