Spring表达式和自动装配

Spring表达式和自动装配

【重要】spring表达式

作用

  • 通过spring表达式可以在配置Y节点时,如果Y的某些属性需要注入值,可以是已经配置的好的X类的节点中的值
  • 直接使用#{id.属性名}

前提

  • 必须为每个属性都要设置set方法

实现

  • 新建两个类
  • Message
public class Message {
    private String name;
    private List<String> cities;   //城市 。List集合
    private Set<String> friend;   //Set集合
    private Map<Integer,String> bookes;  //Map集合
    private Properties properties;   //Properties集合
    private String[] names;
​
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String[] getNames() {
        return names;
    }
    public void setNames(String[] names) {
        this.names = names;
    }
    public List<String> getCities() {
        return cities;
    }
    public void setCities(List<String> cities) {
        this.cities = cities;
    }
    public Set<String> getFriend() {
        return friend;
    }
    public void setFriend(Set<String> friend) {
        this.friend = friend;
    }
    public Map<Integer, String> getBookes() {
        return bookes;
    }
    public void setBookes(Map<Integer, String> bookes) {
        this.bookes = bookes;
    }
    public Properties getProperties() {
        return properties;
    }
    public void setProperties(Properties properties) {
        this.properties = properties;
    }
}
  • ValueBean的类
public class ValueBean {
    private String username;
​
    public String getUsername() {
        return username;
    }
​
    public void setUsername(String username) {
        this.username = username;
    }
​
}
​

获取不是集合类型的值

  • 在sprig的配置文件中配置如下:
    <util:list id="cities">
        <value>徐州</value>
        <value>无锡</value>
        <value>常州</value>
    </util:list>
​
    <util:set id="friends">
        <value>Jack</value>
        <value>Tom</value>
        <value>陈加兵</value>
    </util:set>
​
​
    <util:map id="bookes">
        <entry key="1001" value="java编程基础"></entry>
        <entry key="1002" value="java编程思想"></entry>
    </util:map>
​
    <!-- 引入外部的Properties文件,location指定的就是位置 -->
    <util:properties id="properties" location="classpath:jdbc.properties"></util:properties>
​
    <bean id="message" class="cn.tedu.spring.beans.Message">
        <property name="name" value="陈加兵"></property>
        <!-- List集合的注入 ref指定的上面定义的List的id -->
        <property name="cities" ref="cities"></property>
​
        <!-- Set集合的注入 -->
        <property name="friend" ref="friends"></property>
​
        <!-- Map集合的注入 -->
        <property name="bookes" ref="bookes"></property>
​
        <!-- properties的集合的注入 -->
        <property name="properties" ref="properties"></property>
​
        <!-- 为数组赋值 -->
        <property name="names">
            <array>
                <value>Alex</value>
                <value>Billy</value>
            </array>
        </property>
    </bean>
​
    <!-- 配置ValueBean -->
    <bean id="valueBean" class="cn.tedu.spring.beans.ValueBean">
        <!-- value的值是使用spring表达式获取的,形式为:#{前面定义好的id.属性名} -->
        <property name="username" value="#{message.name}"></property>
    </bean>

引用数组集合或者List的值

  • 直接使用 #{bean的id.数组名[index]}
    <!-- 配置ValueBean -->
    <bean id="valueBean" class="cn.tedu.spring.beans.ValueBean">
        <!-- value的值是使用spring表达式获取的,形式为:#{前面定义好的id.属性名} -->
        <property name="username" value="#{message.names[0]}"></property>
    </bean>

ValueBean的name属性设置为Person中的Address对象的city值

  • #{person.address.city}
  • Person类中有一个成员变量是Address类的对象
  • 这里不再写这三个类了,直接在spring中配置
<!-- 创建一个Address的实例 -->
    <bean id="address" class="cn.tedu.spring.beans.Address">
        <property name="city" value="无锡"></property>
        <property name="pro" value="江苏"></property>
    </bean>
​
    <bean id="person" class="cn.tedu.spring.beans.Person">
        <property name="name" value="陈加兵"></property>
        <property name="age" value="22"></property>
        <!-- 引用上面address -->
        <property name="address" ref="address"></property>
    </bean>
​
    <!-- 配置ValueBean -->
    <bean id="valueBean" class="cn.tedu.spring.beans.ValueBean">
        <!-- value的值是使用spring表达式获取的,形式为:#{前面定义好的id.属性名} -->
        <property name="username" value="#{person.address.city}"></property>
    </bean>

引用Map集合中的某个value

  1. #{id.Map名称.key名称}
  2. #{id.Map名称['key名称']}

【了解】spring表达式支持方法的调用

【了解】 自动装装配(autowire)

  • <bean id="" class="" autowire="">
  • 自动装配表现为不需要配置<property>节点来注入,spring会自动的为属性注入值
  • bean节点中添加autowire属性以配置自动装配,当值为byName,表示根据名称自动装配,即spring会检查这个bean的所有属性名称,然后在搜平日那个管理的所有Bean中查找bean-id一致的Bean对象,如果找到,则自动赋值
  • 当取值为byType时,表示根据类型自动装配,及自动化赋值的标准是找数据类型匹配的Bean对象,需要注意的是:如果根据类型装配,必须保证可以匹配上的,由spring自动管理的Bean只有一个,如果有2个或者更多,会导致异常

实例

  • UserDao
public class UserDao(){
    public void reg(){
​
}
}
  • UserService
public class UserService{
    private UserDao userDao;
    private void reg(){
        userDao.reg();
}
}
​
  • spring 的配置文件
<bean id="userDao" class="cn.tedu.spring.UserDao"/>
​
<!--这里不需要配置property节点来ref上面定义的bean,只需要使用自动装配即可-->
<bean id="userService" class="cn.tedu.spring.UserService" autowire="byName">

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java达人

jsp中的JSTL与EL表达式用法及区别(一)

对于JSTL和EL之间的关系,这个问题对于初学JSP的朋友来说,估计是个问题,下面来详细介绍一下JSTL和EL表达式他们之间的关系,以及JSTL和EL一些相关概...

2295
来自专栏java一日一条

50个常见的 Java 错误及避免方法(第二部分)

System.out.println("Whatdo you want to do?");

1143
来自专栏程序员互动联盟

【编程基础】C语言常见宏定义

我们在使用C语言编写程序的时候,常常会使用到宏定义以及宏编译指令,有的可能比较常用,有的可能并不是很常用,是不是所有的C语言宏定义以及宏指令你都清楚呢? 指令 ...

3738
来自专栏互联网杂技

前端异步代码解决方案实践(二)

早前有针对 Promise 的语法写过博文,不过仅限入门级别,浅尝辄止食而无味。后面一直想写 Promise 实现,碍于理解程度有限,多次下笔未能满意。一拖再拖...

2236
来自专栏Java学习之路

05 Spring框架 依赖注入(二)

上一节我们讲了三种信息的注入,满足一个类的属性信息的注入,但是如果我们需要向一个实例中注入另一个实例呢?就像我们创建一个学生类,里边有:姓名,性别,年龄,成绩等...

2845
来自专栏java工会

Spring中的9种设计模式汇总

又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一。

1051
来自专栏小狼的世界

Linux下不同文件编码的转换

字符编码(Character Encoding)可以说就是让某一字符序列匹配一个指定集合中的某一东西,常见的例子包括长短电键组合起来表示的摩斯电码(Morse ...

922
来自专栏IMWeb前端团队

还在纠结用不用ES6,不如来试试TypeScript

The only limits in our life are those we impose on ourselves. 弱爆的 ES6 in bro...

2300
来自专栏大内老A

yield在WCF中的错误使用——99%的开发人员都有可能犯的错误[上篇]

在定义API的时候,对于一些返回集合对象的方法,很多人喜欢将返回类型定义成IEnumerable<T>,这本没有什么问题。这里要说的是另一个问题:对于返回类型为...

1818
来自专栏QQ会员技术团队的专栏

有没有人告诉你—写时拷贝的真相

作者简介:梁少华,QQ动漫后台开发,腾讯高级工程师。从事后台开发4年多,参与过QQ秀、手Q红点系统、手Q游戏公会、QQ动漫等项目,有丰富的后台架构经验,擅长海...

27610

扫码关注云+社区

领取腾讯云代金券