Spring的表达式语言 SpEL,使用方法是#{}

SpEL的特性如下

  • 使用Bean 的ID 来引用Bean ;
  • 调用方法和访问对象的属性;
  • 对值进行算术、关系和逻辑运算;
  • 正则表达式匹配;
  • 集合操作。

目前能知道的SpEL的作用就是在运行期赋值,正常情况下我们在配置bean的xml档的时候就会赋值,而使用SpEL能达成动态的效果???

具体详细应用请查看http://blog.csdn.net/sunnyyoona/article/details/50638957

简单代码应用

<bean id="car" class="com.test2.Car" >
<property name="factory" value="#{'china'}"></property>
<property name="price" value="#{600}"></property>
<property name="year" value="#{5}"></property>
<property name="city" value="#{'shanghai'}"></property>
</bean> <bean id="person" class="com.test2.Person">
<property name="name" value="xiaozhi"></property>
<property name="age" value="23"></property>
<property name="car" value="#{car}"></property>
<property name="city" value="#{car.city}"></property>
<property name="info" value="#{car.price>800?'gold':'white'}"></property>
</bean> 在原先的Person类多city ,原先的Car类多city。测试类不再赘述。

Bean的生命周期

1实例化bean

2给bean属性赋值和其他bean的引用

3bean的初始构造方法

4bean的使用

5bean的销毁

用 init-method 和destroy-mothod指定bean的构造方法和销毁方法

具体生命周期          http://www.cnblogs.com/zrtqsk/p/3735273.html

二、各种接口方法分类

Bean的完整生命周期经历了各种方法调用,这些方法可以划分为以下几类:

1、Bean自身的方法  :  这个包括了Bean本身调用的方法和通过配置文件中<bean>的init-method和destroy-method指定的方法

2、Bean级生命周期接口方法  :  这个包括了BeanNameAware、BeanFactoryAware、InitializingBean和DiposableBean这些接口的方法

3、容器级生命周期接口方法  :  这个包括了InstantiationAwareBeanPostProcessor 和 BeanPostProcessor 这两个接口实现,一般称它们的实现类为“后处理器”。

4、工厂后处理器接口方法  :  这个包括了AspectJWeavingEnabler, ConfigurationClassPostProcessor, CustomAutowireConfigurer等等非常有用的工厂后处理器  接口的方法。工厂后处理器也是容器级的。在应用上下文装配配置文件之后立即调用。

以下代码实现。

package com.test2;

public class Address {//新写的类
private String city;
private String name;
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void init (){//名字可以自己取,不用init也行,在后面的init-method里面写对应的名字就是
System.out.println("我init()啦");
}
public void destory(){
System.out.println("我destory()啦");
}
@Override
public String toString() {
return "Address [city=" + city + ", name=" + name + "]";
} }

接口类! 很重要

package com.test2;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor; public class MyPostProfessor implements BeanPostProcessor{//这个有很多类似的接口,可以自己取看。另外这是Bean级别的,意思是每个Bean都享用这个。 public Object postProcessAfterInitialization(Object bean, String beanname)
throws BeansException {
System.out.println("after name:"+beanname+" object:"+bean); return bean;
} public Object postProcessBeforeInitialization(Object bean, String beanname)
throws BeansException {
System.out.println("before name:"+beanname+" object:"+bean);
if (beanname.equals("address")){//这里是判断bean文档写的bean 加载id 判断之后进行修改。
Address address =(Address)bean;
address.setCity("上海");
return address;
}
return bean;
} }

bean 文件

<bean id="address" class="com.test2.Address" init-method="init"   destroy-method="destory"></bean>
<!-- 后置处理器 填写自己实现的对应接口类 -->
<bean id="beanprocessor" class="com.test2.MyPostProfessor"></bean>

测试代码以及输出、

package com.test2;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; import com.test2.Person; public class Main {
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");//在工程目录下读取bean的配置。
Address address = null;
context.close();
}
}
/*
输出
before name:address object:Address [city=null, name=null]
我init()啦
after name:address object:Address [city=上海, name=null]
九月 12, 2017 11:07:10 上午 org.springframework.context.support.ClassPathXmlApplicationContext doClose
信息: Closing org.springframework.context.support.ClassPathXmlApplicationContext@21b8d17c: startup date [Tue Sep 12 11:07:10 CST 2017]; root of context hierarchy
我destory()啦
*/
这个就可以对应上面的周期来看

注入bean还有一个方法,静态工厂方法和实例工厂方法

工厂方法,就是将创建的bean的过程封装在方法里面,需要的时候就直接使用,而不在意过程。

静态工厂模式则是   在bean中加入 factory-method  构造函数需要输入参数值则用 <constructor-arg value="fute" />

实例工厂方法,则是实例化工厂,之后再注入,java文件也写得很不一样,仔细看。

package com.test2;//静态工厂类

import java.util.HashMap;
import java.util.Map; public class StaticFactory {//静态工厂方法
private static Map<String,Car> hm = new HashMap<String,Car>(); static {
hm.put("fute", new Car("futo",60000));
hm.put("kaite", new Car("kaite",30000));
}
public static Car getCar (String name){//这里要用静态方法,不然会错误。
return hm.get(name);
}
} package com.test2;//实例类 import java.util.HashMap;
import java.util.Map; public class InstanceFactory {
private Map<String,Car> hm = null;
public InstanceFactory(){
hm=new HashMap<String,Car>();
hm.put("fute", new Car("futo",60000));
hm.put("kaite", new Car("kaite",30000));
}
public Car getCar (String name){
return hm.get(name);
}
}

bean文件添加,测试文件类不再写

<!-- 这里不是实例化com.test2.StaticFactory,而是实例化Car,如果有参数这用 constructor-arg来使用 -->
<bean id="car" class="com.test2.StaticFactory" factory-method="getCar">
<constructor-arg value="fute" />
</bean> <!--实例化工厂注入bean,就是先实例化工厂,之后再注入,class文件写的也不一样,要仔细看。 -->
<bean id= "insfactory" class="com.test2.InstanceFactory"></bean>
<bean id="car2" factory-bean="insfactory" factory-method="getCar">
<constructor-arg value="kaite"></constructor-arg>
</bean>

利用FactoryBean 来配置  Bean(据说整合框架很需要用到)

package com.test2;

import org.springframework.beans.factory.FactoryBean;

public class MyFactoryBean implements FactoryBean{//实现这个接口

    private double price;

    public double getPrice() {
return price;
} public void setPrice(double price) {
this.price = price;
} public Object getObject() throws Exception {//这是正常返回的object
Car car = new Car("test",price);
return car;
} public Class getObjectType() {
// TODO Auto-generated method stub
return null;
} public boolean isSingleton() {
// TODO Auto-generated method stub
return false;
} }

bean填写

<!-- 属性设置的是MyFactoryBean的属性,但是它会返回一个Car  -->
<bean id="carf" class="com.test2.MyFactoryBean">
<property name="price" value="5000"></property>
</bean>

Spring学习二的更多相关文章

  1. spring学习(二) ———— AOP之AspectJ框架的使用

    前面讲解了spring的特性之一,IOC(控制反转),因为有了IOC,所以我们都不需要自己new对象了,想要什么,spring就给什么.而今天要学习spring的第二个重点,AOP.一篇讲解不完,所以 ...

  2. spring学习二:jdbc相关回顾以及spring下dao

    目录: Part一:回顾java web部分的jdbc.事务.连接池和dbutils工具等 : Part二:spring的JdbcTemplate使用: Part三:spring的事务处理: Part ...

  3. Spring学习(二)-----eclipse新建spring项目

    一:准本工作(下载需要的jar包) 1.下载准备Spring-framework-4.2.0 链接为: http://repo.springsource.org/libs-release-local/ ...

  4. Spring 学习二-----AOP的原理与简单实践

    一.Spring  AOP的原理 AOP全名Aspect-Oriented Programming,中文直译为面向切面(方面)编程.何为切面,就比如说我们系统中的权限管理,日志,事务等我们都可以将其看 ...

  5. Spring学习(二)--装配Bean

    一.Spring装配机制 Spring提供了三种主要的装配机制: 1.在XML中进行显示配置 2.在Java中进行显示配置 3.隐式的bean发现机制和自动装配--自动化装配bean Spring可以 ...

  6. Spring学习(二):Spring支持的5种Bean Scope

    序言 Scope是定义Spring如何创建bean的实例的.Spring容器最初提供了两种bean的scope类型:singleton和prototype,但发布2.0以后,又引入了另外三种scope ...

  7. spring 学习 二 IOC/DI

    中文名称:控制反转 英文名称:( Inversion of Control ) 1 控制反转作用: 一般在编写java程序时,需要程序员自己创建对象的实例,例如 A a=new A();语句,就是程序 ...

  8. Spring学习二----------IOC及Bean容器

    © 版权声明:本文为博主原创文章,转载请注明出处 接口 用于沟通的中介物的抽象化 实体把自己提供给外界的一种抽象化说明,用以由内部操作分离出外部沟通方法,使其能被修改内部而不影响外界其他实体与其交互的 ...

  9. Spring学习(二)

    IoC 1.Inverse of Control ,控制反转(控制权的翻转) 2.控制:对对象的创建.对对象的属性赋值等一系列操作本来应该是我们做的事情 Java Application : Date ...

随机推荐

  1. HDOJ-1156 Brownie Points II 线段树/树状数组(模板)

    http://acm.hdu.edu.cn/showproblem.php?pid=1156 在一张二位坐标系中,给定n个点的坐标,玩一个划线游戏(线必须穿过点),Stan先手画一条垂直的线,然后Ol ...

  2. android -------- Data Binding的使用 ( 四 )ListView

    今天来说说DataBinding在列表ListView中的使用 主要分为两种,1: 基本的实体类  2:Observable 定义字段 listView布局文件 <?xml version=&q ...

  3. 【洛谷p1926】小书童——蚂蚁大战

    f(今天开学第一天) 小书童——蚂蚁大战[传送门] 洛谷算法标签: 这个题要用排序是真的很神奇: 首先我们来理解一下题意:首先蚂蚁们按血量接受打击[魔鬼操作],血量最少的蚂蚁要走到最前面,所以我们可以 ...

  4. apache2反向代理

    1.安装 Apache2 sudo apt-get install apache2 2.重启服务器 sudo /etc/init.d/apache2 restart 3.虚拟主机配置 启用这几个模块 ...

  5. loj#6062. 「2017 山东一轮集训 Day2」Pair hall定理+线段树

    题意:给出一个长度为 n的数列 a和一个长度为 m 的数列 b,求 a有多少个长度为 m的连续子数列能与 b匹配.两个数列可以匹配,当且仅当存在一种方案,使两个数列中的数可以两两配对,两个数可以配对当 ...

  6. 5月17 AJAX返回类型-------JSON和XML

    ajax返回类型有TEXT,JSON,XML 一.TEXT 查看之前的练习 二.JSON var js = { aa:{code:"p001",name:"张三" ...

  7. html和jsp的区别及优缺点

    ♥ HTML(Hypertext Markup Language)文本标记语言,它是静态页面,和JavaScript一样解释性语言,为什么说是解释性语言呢?因为,只要你有一个浏览器那么它就可以正常显示 ...

  8. mac终端下连接阿里云服务器

    通过ssh连接 ssh 用户名@地址 ssh root@xx.xxx.xxx.xx https://www.jianshu.com/p/f034817a7837 最后还是通过  FileZilla 连 ...

  9. WDA基础十:OVS搜索帮助的使用

    对于WDA来说,常用的搜索帮助有OVS,标准SH,Interface view等.今天来说说两种常用的OVS的使用: 一:普通字段,表字段的搜索帮助(在创建节点的时候指定搜索帮助OVS,或者后面加上去 ...

  10. ORACLE-016:ora-01720 授权选项对于'xxxx'不存在

    报错的情形如下, A用户:视图V_A B用户:视图V_B,并且用到了V_A C用户:需要用V_B, 授权过程, A用户下: grant select on V_A to B B用户下: grant s ...