美文网首页
spring注解驱动开发(3)——属性赋值

spring注解驱动开发(3)——属性赋值

作者: KeHaoo | 来源:发表于2020-03-25 16:11 被阅读0次

1. @Value赋值和@PropertySource加载配置文件

SpEl介绍:https://www.jianshu.com/p/e0b50053b5d3

@Value赋值

public class Person {
   //使用@Value赋值;
   //1、基本数值
   //2、可以写SpEL; #{}
   //3、可以写${};取出配置文件【properties】中的值(在运行环境变量里面的值)
   @Value("张三")
   private String name;
   @Value("#{20-2}")
   private Integer age;
  @Value("${person.nickName}")
  private String nickName;
  .....
}

@PropertySource加载配置文件

@PropertySource(value={"classpath:/person.properties"})
@Configuration
public class MainConfigOfPropertyValues {
    @Bean
    public Person person(){
        return new Person();
    }
}

2. @Autowired和@Qualifier和@Primary

@Autowired:自动注入:

默认优先按照类型去容器中找对应的组件
自动装配默认一定要注册了这个类型的Bean,没有就会报错;
可以使用@Autowired(required=false);
如果找到多个相同类型的组件,再将属性的名称作为组件的id去容器中查找
@Autowired可以标注在构造器,参数,方法,属性上
它们都是从容器中获取参数组件的值

  1. 放在成员变量
@Controller
public class BookController {
   
   @Autowired
   private BookService bookService;
}

自动注入时不要求一定要有这个组件,没有的情况下注入不成功,bookDao为null

@Service
public class BookService {
   
   @Autowired(required=false)
   private BookDao bookDao;
}
  1. 标注在方法位置:
  • @Bean方法参数;参数从容器中获取;默认不写@Autowired效果是一样的;都能自动装配
  • set方法
//@Bean方法
    @Bean
    public Color color(Car car){
       Color color = new Color();
       color.setCar(car);
       return color;
    }
//set方法
     @Autowired 
    public void setCar(Car car) {
       this.car = car;
    }
  1. 标在构造器上:
    如果组件只有一个有参构造器,这个有参构造器的@Autowired可以省略,参数位置的组件还是可以自动从容器中获取
@Autowired 
public Boss(Car car){
   this.car = car;
   System.out.println("Boss...有参构造器");
}
  1. 标志在参数上
//case1
public Boss(@Autowired Car car){
   this.car = car;
   System.out.println("Boss...有参构造器");
}
//case2
public void setCar(@Autowired Car car) {
   this.car = car;
}

@Primary:

对组件进行注册的时候,设定其优先级,再其他类中对该类型主键进行自动注入的时候优先选择带有@Primary的组件
其@Qualifier冲突,即先判断@Qualifier("bookDao"),再判断@Primary

@Configuration
@ComponentScan({"com.atguigu.service","com.atguigu.dao",
    "com.atguigu.controller"})
public class MainConifgOfAutowired {
    
    @Primary//优先级
    @Bean("bookDao2")
    public BookDao bookDao(){
        BookDao bookDao = new BookDao();
        bookDao.setLable("2");
        return bookDao;
    }
}

@Qualifier("bookDao"):

使用@Qualifier指定需要装配的组件的id
要求使用bookDao

@Service
public class BookService {
    
    @Qualifier("bookDao")
    @Autowired(required=false)
    private BookDao bookDao;
}

3. @Resource和@Inject

@Resource和@Inject是java自带的注解,非spring独有,其他ioc工具也能使用
@Resource:

  • 可以和@Autowired一样实现自动装配功能;默认是按照组件名称进行装配的;
  • 不支持@Primary功能且不能实现类似@Autowired(reqiured=false)的效果
@Service
public class BookService {
    @Resource(name="bookDao2")
    private BookDao bookDao;
    
}

@Inject:
需要导入javax.inject的包
Autowired的功能一样,支持@Primary,但不支持required=false的功能;

4. @Profile根据环境注册Bean

@Profile:

指定组件在哪个环境(生产环境、开发环境等)才能被注册到容器中,不指定的情况下,任何环境下都能注册这个组件

  1. 注册在配置类上,则这个配置类只在指定环境下生效,也就是这个配置类所扫描到的和配置的Bean也只会在指定环境下被注册
  2. 注册在@Bean所标注的方法上,该方法注册的Bean将在指定环境下才会被注册
@PropertySource("classpath:/dbconfig.properties")
@Configuration
public class MainConfigOfProfile{
   @Value("${db.user}")
   private String user;
   private StringValueResolver valueResolver;
   private String  driverClass;
   
   @Profile("test")
   @Bean("testDataSource")
   public DataSource dataSourceTest(@Value("${db.password}")String pwd) throws Exception{
      ComboPooledDataSource dataSource = new ComboPooledDataSource();
      dataSource.setUser(user);
      dataSource.setPassword(pwd);
      dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test");
      dataSource.setDriverClass(driverClass);
      return dataSource;
   }
      
   @Profile("dev")
   @Bean("devDataSource")
   public DataSource dataSourceDev(@Value("${db.password}")String pwd) throws Exception{
      ComboPooledDataSource dataSource = new ComboPooledDataSource();
      dataSource.setUser(user);
      dataSource.setPassword(pwd);
      dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/ssm_crud");
      dataSource.setDriverClass(driverClass);
      return dataSource;
   }
   
   @Profile("prod")
   @Bean("prodDataSource")
   public DataSource dataSourceProd(@Value("${db.password}")String pwd) throws Exception{
      ComboPooledDataSource dataSource = new ComboPooledDataSource();
      dataSource.setUser(user);
      dataSource.setPassword(pwd);
      dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/scw_0515");
      dataSource.setDriverClass(driverClass);
      return dataSource;
   }

}

配置环境的方法
方法1. 使用命令行动态参数: 在虚拟机参数位置加载 -Dspring.profiles.active=test



方法2. 代码的方式激活某种环境

@Test
public void test01(){
   AnnotationConfigApplicationContext applicationContext = 
         new AnnotationConfigApplicationContext();//此处使用无参构造器
   //1、创建一个applicationContext
   //2、设置需要激活的环境
   applicationContext.getEnvironment().setActiveProfiles("dev");
   //3、注册主配置类
   applicationContext.register(MainConfigOfProfile.class);
   //4、启动刷新容器
   applicationContext.refresh();
      
   String[] namesForType = applicationContext.getBeanNamesForType(DataSource.class);
   for (String string : namesForType) {
      System.out.println(string);
   }

   applicationContext.close();
}

相关文章

网友评论

      本文标题:spring注解驱动开发(3)——属性赋值

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