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();
    }

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

  

原文地址:https://www.cnblogs.com/programmlover/p/10146343.html

时间: 2024-10-13 11:24:20

spring属性赋值和自动装配的相关文章

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

一.Bean的生命周期 流程 Bean创建 -- 初始化 -- 销毁 创建: 单实例:在容器启动时创建对象 多实例:每次调用时创建对象 初始化: 都是在对象创建完成后,调用初始化方法 销毁: 单实例:容器关闭时,调用销毁方法 多实例:容器不会管理这个bean,只能手动调用销毁方法 实现方式 在 @Bean 注解上指定初始化(initMethod).销毁方法(destroyMethod) @Bean(initMethod = "init", destroyMethod = "d

Spring4-自动装配Beans-按属性的数据类型自动装配Bean

1.创建Maven项目,项目名称springdemo16,如图所示 2.配置Maven,修改项目中的pom.xml文件,修改内容如下 <project xmlns="http://maven.apache.org/POM/4.0.0"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0

创建spring自定义注解进行自动装配

1.创建自定义注解 1 import org.springframework.beans.factory.annotation.Qualifier; 2 import java.lang.annotation.ElementType; 3 import java.lang.annotation.Retention; 4 import java.lang.annotation.RetentionPolicy; 5 import java.lang.annotation.Target; 6 7 8

Spring @Autowired注解与自动装配

1   配置文件的方法 一般编写spring 框架的代码时候.一直遵循是这样一个规则:所有在spring中注入的bean 都建议定义成私有的域变量.并且要配套写上 get 和 set方法. Boss 拥有 Office 和 Car 类型的两个属性 1 public class Boss { 2 private Car car; 3 private Office office; 4 5 // 省略 get/setter 没写 6 7 @Override 8 public String toStri

【Spring实战】—— 8 自动装配

本篇介绍一下自动装配的知识,Spring为了简化配置文件的编写.采用自动装配方式,自动的装载需要的bean. 自动装配 有以下几种方式: 1 byName 通过id的名字与属性的名字进行判断,要保证Bean实例中属性名字与该装配的id名字相同. 2 byType 通过类型确定装配的bean,但是当存在多个类型符合的bean时,会报错. 3 contructor 在构造注入时,使用该装配方式,效果如同byType. 4 autodetect 自动装配,这个测试了,3.0.5版本不可用了,不知道是不

Spring学习总结(2)-自动装配

上面说过,IOC的注入有两个地方需要提供依赖关系,一是类的定义中,二是在spring的配置中需要去描述.自动装配则把第二个取消了,即我们仅仅需要在类中提供依赖,继而把对象交给容器管理即可完成注入.在实际开发中,描述类之间的依赖关系通常是大篇幅的,如果使用自动装配则省去了很多配置,并且如果对象的依赖发生更新我们可以不需要去更新配置,但是也带来了一定的缺点. 说白了就是只需要声明bean,至于对象间的相互引用关系由Spring自己搞定.. 使用方式:no(不启用),byName(根据名称),byTy

8 -- 深入使用Spring -- 7...4 使用自动装配

8.7.4 使用自动装配 在自动装配策略下,Action还是由Spring插件创建,Spring 插件在创建Action实例时,利用Spring的自动装配策略,将对应的业务逻辑组件注入Action实例中.这种整合策略的配置文件简单,但控制器和业务逻辑组件耦合又提升到了代码层次,耦合较高. 如果不指定自动装配,则系统默认使用按byName自动装配.前面的整合策略并没有指定任何自动装配策略. 所谓自动装配,即让Spring自动管理Bean与Bean之间的依赖关系,无须使用ref显示指定依赖Bean.

在Spring中通过构造自动装配--constructor

在Spring中,可以使用"通过构造自动装配",实际上是按构造函数的参数类型自动装配. 这意味着,如果一个bean的数据类型与其他bean的构造器参数的数据类型是相同的,那么将自动装配. package auto_constructor; /** * Created by luozhitao on 2017/8/9. */ public class student { public String getName() { return name; } public void setNam

Spring基于的注解自动装配和依赖注入(***)

#自动装配的小Demo: package com.gyf.annotation; public interface UserDao { public void save(); } package com.gyf.annotation; import org.springframework.stereotype.Repository; @Repository("userDao") public class UserDaoImpl implements UserDao { @Overrid