spring注解驱动开发-3 Spring bean的属性赋值

Spring Bean的属性赋值

  • 前言
  • Spring bean的属性赋值
    • 1.XML方式
    • 2.@Value方式
  • 补充:Springboot中的自动装配
    • 1.源码讲解
    • 2.如何在我们的项目中使用,给类便捷的配置属性值
  • end...

前言

bean的属性赋值是指给注入到IOC容器中的bean赋值,本文讲解了通过@Value的方式为bean赋值,补充讲解了springboot自动配置中的属性赋值,使用此方式可以非常方便的在yml文件中配置自己的属性值。文章课程链接:尚硅谷spring注解驱动教程(雷神)

Spring bean的属性赋值

1.XML方式

例子:

xml方式是在property 标签中指定value属性。

<bean id="person" class="com.atgugui.bean.Person">
 	<property name="age" value="22"></property>
 	<property name="name" value="zx"></property>
</bean>

2.@Value方式

支持多种方式赋值,包括:
@Value(“zx”)
private String name; // 基本数值
@Value("#{ 12 - 6 }")
private double randomNumber; //注入SpEL表达式结果
@Value("${person.name}")
private String username; // 取出配置文件中的值(在运行环境变量中的值)

例子

首先,创建配置文件,取名 person.properties,并赋值

person.introduction=一个刚刚毕业的小白

实体类,加上@Data lombok注解,自动生成get、set方法

@Data
public class Person {
	@Value("zx")
	private String name;
	
	@Value("#{88-66}")
	private Integer age;
	
	@Value("${person.introduction}")
	private String introduction;
	}	
}

最后加上注解@PropertySource(value={“classpath:/person.properties”})引入配置文件生效

//将配置文件中的key/value保存到运行的环境变量中
@PropertySource(value={"classpath:/person.properties"})
@Configuration
public class MainConfigOfPropertyValues {

	@Bean
	public Person person() {
		return new Person();
	}
}

补充:Springboot中的自动装配

1.源码讲解

相信学习过springboot自动装配原理的同学都都知道一个叫***.***.autoconfigure的包,比如org.mybatis.spring.boot.autoconfigure,如图,其中有一个叫MybatisProperties的类

spring注解驱动开发-3 Spring bean的属性赋值_第1张图片

这里贴出部分源码,发现有一个注解叫@ConfigurationProperties(
prefix = “mybatis”
),就是这个注解,让我们能够在yml配置文件中配置属性值,比如配置typeAliasesPackage、typeHandlersPackage等等。

@ConfigurationProperties(
    prefix = "mybatis"
)
public class MybatisProperties {
    public static final String MYBATIS_PREFIX = "mybatis";
    private static final ResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver();
    private String configLocation;
    private String[] mapperLocations;
    private String typeAliasesPackage;
    private Class<?> typeAliasesSuperType;
    private String typeHandlersPackage;
    private boolean checkConfigLocation = false;
    private ExecutorType executorType;
    private Class<? extends LanguageDriver> defaultScriptingLanguageDriver;
    private Properties configurationProperties;
    @NestedConfigurationProperty
    private Configuration configuration;

    public MybatisProperties() {
    }
}

对应yml配置文件

mybatis:
  mapper-locations: classpath:mybatis/mapper/*.xml
  type-aliases-package: com.zx.mvc.pojo

springboot如何装配,这里只简单的讲讲,有兴趣的同学可学习相关内容。在包下,还有一个叫MybatisAutoConfiguration的类,部分源码如下,其中@EnableConfigurationProperties({MybatisProperties.class})的作用是,让使用了 @ConfigurationProperties 注解的类生效,并且将该类注入到 IOC 容器中,交由 IOC 容器进行管理

@Configuration
@ConditionalOnClass({SqlSessionFactory.class, SqlSessionFactoryBean.class})
@ConditionalOnSingleCandidate(DataSource.class)
@EnableConfigurationProperties({MybatisProperties.class})
@AutoConfigureAfter({DataSourceAutoConfiguration.class, MybatisLanguageDriverAutoConfiguration.class})
public class MybatisAutoConfiguration implements InitializingBean {
    private static final Logger logger = LoggerFactory.getLogger(MybatisAutoConfiguration.class);
    private final MybatisProperties properties;
    private final Interceptor[] interceptors;
    private final TypeHandler[] typeHandlers;
    private final LanguageDriver[] languageDrivers;
    private final ResourceLoader resourceLoader;
    private final DatabaseIdProvider databaseIdProvider;
    private final List<ConfigurationCustomizer> configurationCustomizers;

    public MybatisAutoConfiguration(MybatisProperties properties, ObjectProvider<Interceptor[]> interceptorsProvider, ObjectProvider<TypeHandler[]> typeHandlersProvider, ObjectProvider<LanguageDriver[]> languageDriversProvider, ResourceLoader resourceLoader, ObjectProvider<DatabaseIdProvider> databaseIdProvider, ObjectProvider<List<ConfigurationCustomizer>> configurationCustomizersProvider) {
        this.properties = properties;
        // 属性赋值
    }

    @Bean
    @ConditionalOnMissingBean
    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
        SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
        factory.setDataSource(dataSource);
        factory.setVfs(SpringBootVFS.class);
        ...
        return factory.getObject();
    }
    @Bean
    @ConditionalOnMissingBean
    public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
        ExecutorType executorType = this.properties.getExecutorType();
        return executorType != null ? new SqlSessionTemplate(sqlSessionFactory, executorType) : new SqlSessionTemplate(sqlSessionFactory);
    }

2.如何在我们的项目中使用,给类便捷的配置属性值

1.创建***Properties 类,编写要配置的属性,提供get、set方法,加上注解@ConfigurationProperties(
prefix = “自定义命名,对应yml中的属性名”
),加上@Component或@Configuration(组合注解,包含@Component),加入IOC容器
2.在我们需要使用的地方注入,使用@Autowired 方式注入,如:
@Autowired
private ***Properties properties;

例子,以JWT为例,先创建 JwtProperties ,第二在util中使用该 properties ,获取相应的属性值

@Data
@Configuration
@ConfigurationProperties(
        prefix = "jwt"
)
public class JwtProperties {

    /**
     * 加密秘钥
     */
    private String secret;

    /**
     * 有效时间
     */
    private long expire;
    /**
     * 用户凭证
     */
    private String header;

    /**
     * 发行者
     */
    private String issuer;

    /**
     * token标准前缀
     */
    private String prefix;

}
// 使用
@Slf4j
@Data
@Component
public class TokenUtil {

    @Autowired
    private JwtProperties properties;

    /**
     * 生成Token签名
     * @param id 用户实体  id
     */
    public String generateToken(Long id) {
        ...
    }
# 配置
jwt:
  header: token
  expire: 43200  #单位秒  43200 即12小时
  secret: 2aa617f884abcdefg
  issuer: zx
  prefix: Bea++rer

end…

如果总结的还行,就点个赞呗 @_@ 如有错误,欢迎指点,下一篇spring注解驱动开发-4 Spring 自动装配···

你可能感兴趣的:(spring注解驱动开发,spring,驱动开发,java)