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. CSS知识点(一)

    一.引入CSS样式(重点掌握) 行内样式 内接样式 外接样式 3.1 链接式 3.1 导入式 css介绍 现在的互联网前端分三层: HTML:超文本标记语言.从语义的角度描述页面结构. CSS:层叠样 ...

  2. div中文字上下居中

    <div class="title">Title</div> 1. 将div高度设成定值 2. 将line-height设成定值 3. 将text-alig ...

  3. 字符序列(characts)

    字符序列(characts) 问题描述: 从三个元素的集合[A,B,C]中选取元素生成一个N 个字符组成的序列,使得没有两个相邻的 子序列(子序列长度=2)相同,例:N=5 时ABCBA 是合格的,而 ...

  4. CURD插件(仿Django-admin版)

    前言 如何提升自己的开发效率? 每个新项目都是自己经做过的项目(经验所致),在项目开发过程中不断总结.封装属于自己的组件, 例如:每个web项目大部分都涉及增删改查,分页显示,搜素,CRM就是这样的组 ...

  5. [LeetCode] 108. Convert Sorted Array to Binary Search Tree ☆(升序数组转换成一个平衡二叉树)

    108. Convert Sorted Array to Binary Search Tree 描述 Given an array where elements are sorted in ascen ...

  6. MySql语句中Union和join的用法

    Union UNION 操作符用于合并两个或多个 SELECT 语句的结果集. 请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列.列也必须拥有相似的数据类型.同时,每条 SELECT ...

  7. 把旧系统迁移到.Net Core 2.0 日记(4) - 使用EF+Mysql

    因为Mac 不能装SqlServer, 所以把数据库迁移到MySql,然后EntityFramework要改成Pomelo.EntityFrameworkCore.MySql 数据库迁移时,nvarc ...

  8. 面向对象的Java实现

    1.面向对象的Java实现--封装 1-1:封装 a.为什么需要封装(封装可以是数据方便维护.增加实用性.方便扩展等等.通过面向对象的思想,模拟现实生活中的事物.) b.什么是封装(封装就是将属性私有 ...

  9. axur axure rp安装

    axure rp安装 1◆ axure rp 文件下载   2◆创建安装目录     3◆ 安装图解 4◆汉化 替换   5◆ 使用   success

  10. 字符串和数组----vector

    vector能容纳绝大多数类型的对象作为其元素,但是因为引用不是对象,所以不存在包含引用的vector. 使用vector需要包含头文件vector. 1.初始化vector对象的方法 1)vecto ...