之前学习basic的时候有个疑问就是不知道如何实现bean中引用其他的bean的属性,当时是用ref来实现对其他bean的引用,但是ref必需引用的是一个常量。所以这种方式来实现对其他bean中的属性的引用是不合理的。

当我看到Spring Expression Language时发现原来我想实现的'ref'的效果就是使用Spring EL这种表达式就可以完成了。

而Spring EL有两种配置形式,一种是Spring EL 写在xml中,和zai xml定义bean一样,通过在定义bean的xml标签内使用"#{otherBean.property}" 或#{otherBean}的形式来完成。另一种是基于注解的方式。一下稍作说明:

第一种和第二种都是通过xml来加载spring context的但是xml里的内容不一样

第一种:直接在xml中定义spring 的上下文,并在bean中的属性字段直接使用SpringEL来引用其他bean或其他bean的属性

第二种: 在xml中定义Component的scan-package的包名,这样spring会在这个包中扫描并配置对应的bean,然后我们在对应的类中加上注解就可以了.

第一种:

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="itemBean" class="com.ric.demo.Item">        <property name="name" value="itemA"/>        <property name="qty" value="10"/>    </bean>

    <bean id="customerBean"          class="com.ric.demo.Customer">        <property name="item" value="#{itemBean}" />// 直接在这里使用Spring EL设置值
        <property name="itemName" value="#{itemBean.name}"/>// 直接在这里使用Spring EL设置值    </bean></beans>

第二种

定义xml:

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"       xmlns:context="http://www.springframework.org/schema/context"       xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans.xsd                http://www.springframework.org/schema/context        http://www.springframework.org/schema/context/spring-context.xsd        ">

    <context:component-scan base-package="com.ric.demo" />

</beans>配置对应的bean
@Component("customerBean")public class Customer {

    private Item item;    private String itemName;

    @Override    public String toString() {        return "Customer{" +                "item=" + item +                ", itemName='" + itemName + '\'' +                '}';    }

    public Item getItem() {        return item;    }
// 使用Spring EL 来取到对应的value

    @Value("#{itemBean}")
    public void setItem(Item item) {        this.item = item;    }

    public String getItemName() {        return itemName;    }// 使用Spring EL 来取到对应的value    @Value("#{itemBean.name}")    public void setItemName(String itemName) {        this.itemName = itemName;    }}

需要注意的是如果这里的 Spring EL里面引用的是其他的对象有一下这种效果

ApplicationContext context = new ClassPathXmlApplicationContext("BeansAutoScan.xml");

Item item = (Item)context.getBean("itemBean");System.out.println(item);

Customer customer = (Customer)context.getBean("customerBean");System.out.println(customer);

item.setName("geek");

System.out.println(item);System.out.println(customer);

Item{name='item', qty=10}
Customer{item=Item{name='item', qty=10}, itemName='item'}
Item{name='geek', qty=10}
Customer{item=Item{name='geek', qty=10}, itemName='item'}

Process finished with exit code 0

也就是说如果引用的是item bean 我们的customer的itemBean属性的确是对item这个bean的一个引用。

但是Customer的itemName这个属性的值没有变,因为bean扫描的时候也是为上下文中的bean做一个初始化的工作,初始化完后item虽然对name做了一个更新的操作,但是customer的itemName的指针不会因为item的name做了变化而同步,而是依旧指向item原先name值的那个指针

转载于:https://www.cnblogs.com/codetime/p/6293489.html

spring EL 实现ref的效果相关推荐

  1. Spring 在 xml配置文件 或 annotation 注解中 运用Spring EL表达式

    Spring  EL 一:在Spring xml 配置文件中运用   Spring EL Spring EL 采用 #{Sp Expression  Language} 即 #{spring表达式} ...

  2. Spring EL bean引用实例

    在Spring EL,可以使用点(.)符号嵌套属性参考一个bean.例如,"bean.property_name". public class Customer {@Value(& ...

  3. Spring EL运算符实例

    Spring EL支持大多数标准的数学,逻辑和关系运算符. 例如, 关系运算符 – 等于 (==, eq), 不等于 (!=, ne), 小于 (<, lt), 小于或等于 (<= , l ...

  4. Spring EL方法调用实例

    Spring表达式语言(使用SpEL)允许开发人员使用表达式来执行方法和将返回值以注入的方式到属性,或叫作"使用SpEL方法调用". Spring EL在注解的形式 了解如何实现S ...

  5. Spring EL hello world实例

    Spring EL与OGNL和JSF EL相似,计算评估或在bean创建时执行.此外,所有的Spring表达式都可以通过XML或注解. 在本教程中,我们将学习如何使用Spring表达式语言(SpEL) ...

  6. 【SpringBoot】【Thyemeleaf 】【Spring EL表达式】 SPEL调用静态类、静态方法

    前言 spring 5.0.6.RELEASE Thyemeleaf 3.0 SpringBoot 2.3.4.RELEASE Spring EL表达式 调用静态类.静态方法 参考这里:https:/ ...

  7. spring el 三元表达式

    前言 spring 5.0.6.RELEASE 三元表达式 spring el 的三元表达式提供了一个简便的写法,可以省略true的值,如下: ExpressionParser parser = ne ...

  8. spring el 表达式的上下文关联到 ApplicationContext

    前言 spring 5.0.6.RELEASE 需求:让 spring el 表达式的上下文关联到 ApplicationContext .这样就能在 EL 表达式中调用Bean. 代码 // cre ...

  9. Java访问静态常量_Java如何在Spring EL中访问静态方法或常量?

    在这个例子中,您将学习如何使用Spring Expression Language访问类范围的方法或常量.要访问类范围的方法或常量T(),例如,您将需要使用Spring EL的运算符T(java.la ...

最新文章

  1. 新生选课系统使用指南
  2. 【Python】大数据存储技巧,快出csv文件10000倍!
  3. PCA原理分析和意义(一)
  4. SFP模块光信号强度知识介绍
  5. object的classid收集
  6. js获取dom html元素属性,JS如何通过元素的CLASS属性得到对应的DOM对象?
  7. Ubicomp一些有意思的论文
  8. servlet和JSP页面乱码问题
  9. 中国风古典传统中式花纹边框图案PSD素材
  10. oracle 11g for windows卸载
  11. 机架服务器显示器,机架式显示器排名_欧仕茄物联
  12. http://blog.csdn.net/myy629464/article/list/1
  13. 暴雪-关于坚持的故事(转)
  14. python.exe无法找到入口
  15. java ireport 打印_ireport客户端打印
  16. Unix/Linux编程:POSIX时钟
  17. 视频教程-Spring Boot实战入门视频课程-Java
  18. 小白如何利用短视频做引流推广
  19. r5 5600u和锐龙r5 4500u的区别
  20. GEE|在地图上显示传入的shp数据

热门文章

  1. linux下启动solr命令,如何自动启动Solr?
  2. 图神经网络(一)图信号处理与图卷积神经网络(2)图信号与图的拉普拉斯矩阵
  3. android progressbar icon,android中ProgressDialog与ProgressBar的使用详解
  4. 框架详解_BeetleX框架详解SAEA对象
  5. 数学--数论--HDU 12151七夕节 Plus (因子和线性筛)
  6. linux系统如何使用fork函数创建子进程
  7. 如何在64位的Win10系统下安装.NET Framework 3.0
  8. C/C++拾遗(二)
  9. 【Transformer】Are Transformers More Robust Than CNNs?
  10. 目标检测系列(八)——CenterNet:Objects as points