spring属性赋值和自动装配

Posted programmlover

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring属性赋值和自动装配相关的知识,希望对你有一定的参考价值。

一  @Value赋值和@propertySource加载外部配置文件

1、@Value 一般用在属性和setter方法上,当该类注册成bean时,会自动为其属性或方法的参数赋值。注意:一定不能用在静态方法上,否则会失效

2、用法:

  @Value("placeholder")    //赋予指定值

  @Value("${placeholder}")  //赋予配置文件中指定key为placeholder的值

3、@PropertySource("classpath:application.properties")  //导入指定的配置文件,一般写在主配置类上

4、示例:

 

public class Desk{
    
    private String name;
    
    @Value("1")
    private int hight;
    
    private String owner;
    

    public  Desk() {
        
    }
    
    public  Desk(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    @Value("${name}")
    public void setName(String name) {this.name = name;
    }

    public int getHight() {
        return hight;
    }

    public void setHight(int hight) {
        this.hight = hight;
    }

    public String getOwner() {
        return owner;
    }

    @Value("${owner}")
    public void setOwner(String owner) {
        this.owner = owner;
    }
    
}

 

5、创建bean示例:

@PropertySource({"classpath:application.properties"})
@Configuration
@ComponentScan(value="com.dj")
public class MainConfig {
    
    @Bean
    public Desk getDesk() {
        return new Desk();
    }
}

 

二 @Autowired和@Qualifier和@Primary

1、@Autowired(required=boolean)  // 默认byType注入,如果找到多个相同类型的组件,再将属性的名称byName去注入,required设置是否必须注入,默认true,可用于属性、方法、构造器、参数

2、@Qualifier("name")  //与@Autowired搭配使用让@Autowired变成byName去注入

3、@Primary  //当多个bean是同一个类型时,@Autowired会首选@Primary 的bean去装配

 

三  @Resource和@Inject

1、@Resource(name="name") //可以和@Autowired一样实现自动注入功能,默认byName进行装配;但不能支持 @Primary 和 @Autowired(required=false)

2、@Inject //需要导入javax.inject包才有这个注解,和@Autowired功能一样,但是没有 @Autowired(required=false) 功能

3、一般spring自动注入推荐@Autowired注入

 

四、Aware注入,spring底层注入原理:

1、实现了Aware家族接口的bean可以获取到当前bean的一些属性,比如:

  ApplicationContextAware  //获取到当前bean的ApplicationContext

  BeanNameAware  //获取到当前bean的name

  EmbeddedValueResolverAware  //获取到@Value的解析器

  。。。

利用这种方法也能对bean进行属性赋值,注入

2、示例:

@Component
public class User implements ApplicationContextAware,BeanNameAware,EmbeddedValueResolverAware{
    
    private String name;
    
    private Dog myDog;
    
    private int age;
    
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Dog getMyDog() {
        return myDog;
    }

    public void setMyDog(Dog myDog) {
        this.myDog = myDog;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        
        System.out.println("传入的ioc:"+applicationContext);
        this.myDog = applicationContext.getBean(Dog.class);
    }
    
    @Override
    public void setBeanName(String name) {
        this.name = name;
        System.out.println("beanName="+name);
    }

    @Override
    public void setEmbeddedValueResolver(StringValueResolver resolver) {
        
        this.age = Integer.parseInt(resolver.resolveStringValue("#{20-10}"));
        System.out.println(this.age);
    }

}

3、创建测试类

    public static void main(String[] args) {
        ApplicationContext application = new AnnotationConfigApplicationContext(MainConfig.class);
        User user = application.getBean(User.class);
        System.out.println(JSON.toJSONString(user));
    }

这样就能打印出创建的bean

4、原理:每一个Aware都有一个对应的Processor来处理他,xxxAware 对应 xxxProcessor

 

四、@Profile环境搭建

1、@Profile("profileName")  //spring在启动时,标注了@Profile的bean如果其profileName与启动时设置的profileName不一样,那么就不会注册该bean,@Profile默认为@Profile("default"),没有标注@Profile的bean任何时候都会被加载

2、设置命令行参数选择 profileName:

  选择 Run As --> Run Configurations --> Arguments,在VM Arguments框中输入:Dspring.profiles.active=profileName ,选择 Apply-->Run 即可指定运行环境

3、使用无参的 AnnotationConfigApplicationContext 自定义 spring 的启动方式来选择 profileName:

  示例:

    public static void main(String[] args) {
        //1.启动一个无参的applicationContext
        AnnotationConfigApplicationContext application = new AnnotationConfigApplicationContext();
        //2.设置的applicationContext的运行环境
        application.getEnvironment().setActiveProfiles("test");
        //3.注册主配置类
        application.register(MainConfig.class);
        //4.启动刷新容器
        application.refresh();
    }

这样也可以选择运行时环境。

 

  

 

以上是关于spring属性赋值和自动装配的主要内容,如果未能解决你的问题,请参考以下文章

spring注解(属性赋值自动装配)

Spring注解驱动开发 属性赋值与自动装配

Spring笔记04(DI(给属性赋值),自动装配(autowire))

Spring中基于XML的自动装配(自动赋值)

Spring注解 - 生命周期属性赋值自动装配

spring的自动装配