SpringInAction--Bean参数的自动注入

前面我已经学过了,将一个bean引用注入到另一个bean的属性或构造器参数中,这边指的是将一个对象与另一个对象进行关联。

我们学过的方法是在创建的时候根据new对象的时候,注入参数,如下:

   @Bean
    public CompactDisc randomCd() {
        int choice = (int) Math.floor(Math.random() * 4);
        switch (choice) {
            case 0:
                return new RandomCd("dangNianQing");
            case 1:
                return new RandomCd("qianNvYouHun");
            case 2:
                return new RandomCd("wo");
            default:
                return new RandomCd("chenMoShiJing");
        }
    }

也可以在xml中配置的时候,注入:

  <bean id="randomCd" class="com.bean.xml.RandomCd">
        <constructor-arg index="0" value="当年情"/>
        <constructor-arg index="1" value="张国荣"/>
    </bean>

这些方法属于的值属于 硬编码值。



有时候硬编码是可以的,但有的时候,我们可能会希望避免硬编码值,而是想让这些值在运行时再确定。为了实现这些功能,Spring提供了两种在运行时求值的方式:

  • 属性占位符(Property placeholder)。
  • Spring表达式语言(SpEL)。

先看第一种的方法,属性占位符,主要是使用@PropertySource注解和Environment

@Configuration
@PropertySource(value = "/com/bean/java/cd.properties")
public class CDPlayerConfig {

    @Autowired
    Environment environment;

    @Bean
    public CompactDisc randomCd() {

        int choice = (int) Math.floor(Math.random() * 4);
        switch (choice) {
            case 0:
                return new RandomCd(environment.getProperty("cd.dnq"));
            case 1:
                return new RandomCd(environment.getProperty("cd.qnyh"));
            case 2:
                return new RandomCd(environment.getProperty("cd.w"));
            default:
                return new RandomCd(environment.getProperty("cd.cmsj"));
        }
    }

}
cd.properties内容为:
cd.dnq= dnq
cd.qnyh = qnyh
cd.w = w
cd.cmsj = cmsj

cd.properties在运行的时候会被加载到Spring的Environment 通过从Environment检索可以得到文件中的属性值,取值的方式有以下四种种:

  • String getProperty(String var1);
  • String getProperty(String var1, String var2);
  • <T> T getProperty(String var1, Class<T> var2);
  • <T> T getProperty(String var1, Class<T> var2, T var3);

第一个就是上面所用的key-value 键值对对于的key

第二个是指当指定key,没有特定的value的时候,后面的值即是为默认值

第三个跟第四种相似,只不过他特定了一个类型,方便你用吗,无需取完之后再去转换

当然了Environment除了这些属性,还有:

  • String[] getActiveProfiles():返回激活profile名称的数组;
  • String[] getDefaultProfiles():返回默认profile名称的数组;
  • boolean acceptsProfiles(String... profiles):如果environment支持给定profile的话,就返回true。

上面的是java配置解析的 ,我们也来看看如何用xml跟自动扫描的方式来解析占位符

  public CompactDisc randomCd(@Value("${cd.dnq}") String str) {
        System.out.println(str);
}

xml方式

<bean id="randomCd" class="com.bean.xml.RandomCd">
        <constructor-arg index="0" value="${cd.dnq}"/>
        <constructor-arg index="1" value="张国荣"/>
</bean>

当然使用这些方法是要有前提的,需要配置PropertySourcesPlaceholderConfigurer,因为它能够基于Spring Environment及其属性源来解析占位符。

    @Bean
    public static PropertySourcesPlaceholderConfigurer placeholderConfigurer(){
         return  new PropertySourcesPlaceholderConfigurer();
    }

xml中需要添加:

  <context:property-placeholder />

让我们再来看下第二种方法:Spring表达式语言进行装配。SpEL表达式要放到“#{ ... }”之中,这与属性占位符有些类似,属性占位符需要放到“${ ... }”之中

SpEL的表达式学问还是很深的,我这里就学习点皮毛:

比如表达式为一个常量

#{3}

为一个小小的函数(T为类型)

#{T(System).currentTimeMillis()}

也可以引起其他bean的属性,这里的dangNianQing为一个bean,可以获得他的title属性和方法

#{dangNianQing.title}
#{dangNianQing.play()}

还可以通过systemProperties对象引用系统属性:

#{SystemProperties[‘cd.dnq‘]}

就先介绍这一点,等学的更多的时候,在贴上来。。。

以上就是Bean自动注入的学习笔记,如有错,欢迎指出,谢谢~

时间: 2024-10-10 04:22:39

SpringInAction--Bean参数的自动注入的相关文章

Spring容器是如何实现 Bean 自动注入(xml)

入口web.xml web.xml 配置文件 <!-- Spring Config --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</par

Spring第八章:Spring自动注入

一.自动注入 1.在 Spring 配置文件中对象名和 ref=”id”id 名相同使用自动注入,可以不配置<property/> 2.两种配置办法 2.1 在<bean>中通过 autowire=”” 配置,只对这个<bean>生效 2.2 在<beans>中通过 default-autowire=””配置,表当当前文件中所有<bean>都是全局配置内容 2.3 自动注入代码 2.3.1测试自动注入的实体类,老师和学生类 package com

spring的两种属性注入方式setter注入和构造器注入或者自动注入

1.这里的属性自动注入,与注解配置bean是两回事.这里的自动注入,指的是bean属性的自动注入. bean属性自动注入,包括byNAme和ByType两码事. 2.所有的applicationContext都实现了resourceLoader接口,通过resourceLoader可以获得resource实例,进而可以访问资源文件. 所以要在类中获得resource实例,必须实现applicationContextAware接口.

小白日记44:kali渗透测试之Web渗透-SqlMap自动注入(二)-sqlmap参数详解REQUEST

Sqlmap自动注入(二) Request ################################################### #inurl:.php?id= 1. 数据段:--data Get/post都使用 [POST方法]Sqlmap -u "http://1.1.1.1/a.php" --data="user=1&pass=2" –f #sqlmap可自动识别"&" [GET方法]Sqlmap –u &

小白日记46:kali渗透测试之Web渗透-SqlMap自动注入(四)-sqlmap参数详解- Enumeration,Brute force,UDF injection,File system,OS,Windows Registry,General,Miscellaneous

sqlmap自动注入 Enumeration[数据枚举] --privileges -U username[CU 当前账号] -D dvwa -T users -C user --columns  [指定数据库,表,列] --exclude-sysdbs [排除系统层的库] ******************************************************************************* #查具体数据 [前提:当前数据库用户有权读取informatio

小白日记45:kali渗透测试之Web渗透-SqlMap自动注入(三)-sqlmap参数详解-Optimization,Injection,Detection,Techniques,Fingerprint

sqlmap自动注入 Optimization [优化性能参数,可提高效率] -o:指定前三个参数(--predict-output.--keep-alive.--null-connection) --predict-output: 根据检测方法,比岁返回值和统计表内容,不断缩小检测范围,提高检测效率 可检测的返回值:版本名.用户名.密码.Privaleges.role.数据库名称.表名.列名 与--threads参数不兼容 统计表:/usr/share/sqlmap/txt/common-ou

spring mvc 3.1的自动注入参数遇到的问题

在网上下载了xheditor作为页面的编辑器,编辑内容后post到后台保存,后台方法用spring mvc的自动注入的方式接收参数. 这种方式在各个浏览器下运行良好,但是在ie11下发现,从word.文本编辑器或者其它编辑器复制内容到xheditor后,这时提交到后台的参数不能被接收到. 仔细排查下发现ie11下复制到xheditor的内容都被默默的加了一段无用的div: <div style="top: 0px;"> </div> 此时用最原始的接收参数的方式

Spring注解自动注入Bean

我们知道采用Spring注解时,配置如下: [html] view plaincopy <context:annotation-config /> <context:component-scan base-package="cn.itkt"></context:component-scan> 这样的话,在com包及其所有子包下的所有类如果含有@Component.@Controller.@Service.@Repository等注解的话都会自动纳入到

Spring 注解Autowired自动注入bean异常解决

错误: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'xx' is defined 错误的一般解决办法: 1.看xxbean是否已经注入,或者得到的bean名字错误. 2.看spring的配置文件<context:component-scan base-package="com.xx"></context:component-scan>是否扫描了 c