spring学习-5
spring表达式SpEL
- 语法#{..},为bean的属性进行动态赋值
- 通过bean的id对bean进行引用
- 调用方法以及引用对象中的属性
- 计算表达式的值
- 正则表达式的匹配
修改Address.java、Car.java、Person.java等文件
详情请看starryfei GitHub.
spring的SpEL的xml配置文件
<!-- 使用SpEL表达式#{}进行赋值等同于value="北京" -->
<bean id="address" class="com.test.SpEL.Address">
<property name="city" value="#{'北京'}"></property>
<property name="street" value="#{'长安街'}"></property>
</bean>
<!--使用SpEL引用类的静态属性 -->
<bean id="car" class="com.test.SpEL.Car">
<property name="name" value="#{'现代'}"></property>
<property name="price" value="#{10000}"></property>
<!-- 通过T()调用一个类的静态方法,它将返回一个ClassObject,然后调用相对应的方法 或属性 -->
<property name="tyrePerimeter" value="#{T(java.lang.Math).PI*60}"></property>
</bean>
<!--使用SpEL引用其他的bean -->
<bean id="person" class="com.test.SpEL.Person">
<property name="name" value="#{'张三'}"></property>
<!--使用SpEL引用其他的bean ,等同于ref="car"-->
<property name="car" value="#{car}"></property>
<!--使用SpEL引用其他的bean的属性 -->
<property name="city" value="#{address.city}"></property>
<!-- SpEL使用运算符if.. -->
<property name="info" value="#{car.price >= 20000 ? '金领':'白领'}"></property>
</bean>
运行结果
constructor create....
Address [city=北京, street=长安街]
Car [name=现代, price=10000.0, tyrePerimeter=188.49555921538757]
Person [name=张三, car=Car [name=现代, price=10000.0, tyrePerimeter=188.49555921538757], city=北京, info=白领]
spring管理Bean的生命周期
spring IOC容器可以管理Bean的生命周期管理其过程为:
- 通过构造器或工厂方法创建Bean的实例;
- 为Bean的属性设置值和对其他Bean的引用;
- 调用Bean的初始化方法。初始化:在Bean的声明里设置init-method属性;
- Bean可以使用;
- 当容器关闭时,调用Bean的销毁方法。销毁方法:在Bean的声明里设置
destroy-method属性。
新建User.java
package com.test.cycle;
public class User {
public User() {
System.out.println("User's Constructor...");
}
private String name;
public void setName(String name) {
System.out.println("setName..");
this.name = name;
}
//自定义初始化方法
private void init() {
// TODO Auto-generated method stub
System.out.println("init mothod..");
}
//自定义销毁方法
private void destroy() {
// TODO Auto-generated method stub
System.out.println("destroy method... ");
}
@Override
public String toString() {
return "User [name=" + name + "]";
}
}
配置spring管理Bean的生命周期的xml文件
<!--init-method="初始化方法 destroy-method="销毁方法"" -->
<bean id="user" class="com.test.cycle.User" init-method="init"
destroy-method="destroy">
<property name="name" value="starryfei"></property>
</bean>
测试方法主要代码
public static void main(String[] args) {
//ClassPathXmlApplicationContext
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(
"cycle.xml");
User user = (User) ctx.getBean("user");
System.out.println(user);
// 关闭IOC容器
ctx.close();
}
运行结果
User's Constructor...
setName..
init mothod..
User [name=starryfei]
信息: Closing org.springframework.context.support.ClassPathXmlApplicationContext@c4437c4: startup date [Mon Jan 23 00:21:08 CST 2017]; root of context hierarchy
destroy method...
创建Bean的后置处理器-BeanPostProcessor接口实现
spring IOC容器可以管理Bean的生命周期管理其过程为:
- 通过构造器或工厂方法创建Bean的实例;
- 为Bean的属性设置值和对其他Bean的引用;
- 将Bean的实例传递给Bean的后置处理器的postProcessBeforeInitialization方法;
- 调用Bean的初始化方法;
- 将Bean的实例传递给Bean的后置处理器的postProcessAfterInitialization方法;
- Bean可以使用;
- 当容器关闭时,调用Bean的销毁方法。
实现BeanPostProcessor接口的java文件
public class MyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {
// 添加过滤
if ("user".equals(beanName)) {
System.out.println("postProcessBeforeInitialization: " + bean
+ " , " + beanName);
}
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName)
throws BeansException {
System.out.println("postProcessAfterInitialization: " + bean + " , "
+ beanName);
// 在方法中修改返回的bean
User user = new User();
user.setName("qin");
return user;
}
}
**-配置Bean的后置处理器xml文件 **
<!-- 实现BeanPostProcessor接口,并具体提供以下两个方法: Object postProcessBeforeInitialization(Object
bean, String beanName):init-method之前被调用 Object postProcessAfterInitialization(Object
bean, String beanName):init-method之后被调用 bean:bean实例本身 beanName:IOC 容器配置的bean的名字
返回值:实际上返回给用户的那个Bean,注意:可以在两个方法中修改返回值bean,也可以返回一个新的bean -->
<!--配置Bean的后置处理器 不需要指定id,IOC容器可以自动识别 -->
<bean class="com.test.cycle.MyBeanPostProcessor"></bean>
测试方法同上
运行结果
User's Constructor...
setName..
postProcessBeforeInitialization: User [name=starryfei] , user
init mothod..
postProcessAfterInitialization: User [name=starryfei] , user
User's Constructor...
setName..
User [name=qin]
信息: Closing org.springframework.context.support.ClassPathXmlApplicationContext@c4437c4: startup date [Mon Jan 23 00:32:59 CST 2017]; root of context hierarchy
destroy method...
spring学习-5的更多相关文章
- spring 学习之 bean 的注入方式 property和constructor-arg的使用方式
spring 学习之 bean 的注入方式 property和constructor-arg的使用方式. bean的注入方式: property 注入是: 通过setxx方法注入. construct ...
- Spring学习之AOP总结帖
AOP(面向方面编程),也可称为面向切面编程,是一种编程范式,提供从另一个角度来考虑程序结构从而完善面向对象编程(OOP). 在进行 OOP 开发时,都是基于对组件(比如类)进行开发,然后对组件进行组 ...
- Spring学习之第一个AOP程序
IOC和AOP是Spring的两大基石,AOP(面向方面编程),也可称为面向切面编程,是一种编程范式,提供从另一个角度来考虑程序结构从而完善面向对象编程(OOP). 在进行 OOP 开发时,都是基于对 ...
- MyEclipse Spring 学习总结三 SpringMVC
MyEclipse Spring 学习总结三 SpringMVC 一.SpringMVC原理 1.Springmvc 框架介绍 1)Spring 框架停工了构建Web应用程序的全功能MVC模块.Spr ...
- Spring学习 Ioc篇(一 )
一直以来忙于项目的开发,Spring虽然不用,一直想系统地学习一下,想看看它的源码,都没有时间,这段时间比较充裕,就索性先把Spring学习下,熟悉各个功能再去探究它内部的实现.就从Ioc篇开始学习. ...
- Spring学习(三)——Spring中的依赖注入的方式
[前面的话] Spring对我太重要了,做个关于web相关的项目都要使用Spring,每次去看Spring相关的知识,总是感觉一知半解,没有很好的系统去学习一下,现在抽点时间学习一下Spring.不知 ...
- Spring学习(二)——Spring中的AOP的初步理解[转]
[前面的话] Spring对我太重要了,做个关于web相关的项目都要使用Spring,每次去看Spring相关的知识,总是感觉一知半解,没有很好的系统去学习一下,现在抽点时间学习一下Spring. ...
- 【Spring学习笔记-MVC-3.1】SpringMVC返回Json数据-方式1-扩展
<Spring学习笔记-MVC>系列文章,讲解返回json数据的文章共有3篇,分别为: [Spring学习笔记-MVC-3]SpringMVC返回Json数据-方式1:http://www ...
- Spring学习8-Spring事务管理
http://blog.sina.com.cn/s/blog_7ffb8dd501014e0f.html Spring学习8-Spring事务管理(注解式声明事务管理) 标签: spring注 ...
- Spring学习之Ioc控制反转(1)
开始之前: 1. 本博文为原创,转载请注明出处 2. 作者非计算机科班出身,如有错误,请多指正 ---------------------------------------------------- ...
随机推荐
- form 表单<input type="button" value="登录" onclick="loginSubmit ()"/> 点击提示 Uncaught TypeError: loginSubmit is not a function
在网上搜了一堆东东,仔细看了一下,再加上实验,发现原因出在<form>中. <form method="post"> <button type=&qu ...
- paramiko 模块安装和使用
一.Centos安装Paramiko 1.安装组件 yum install openssl openssl-devel python-dev pycrypto -y yum install zlib- ...
- Objective-C系列总结之基础知识
//第一个程序示例 #import <Foundation/Foundation.h> int main(int argc,const char * argv[]) { @autorele ...
- api token
具体实现如下: 1. api请求客户端想服务器端一次发送用用户认证信息(用户名和密码),服务器端请求到改请求后,验证用户信息是否正确. 如果正确:则返回一个唯一不重复的字符串(一般为UUID),然后在 ...
- Raspberry Pi开发之旅-远程监控
1.安装辅助工具 1 2 sudo apt-get install libjpeg8-dev sudo apt-get install cmake 2.编辑源文件 1 2 sudo git clone ...
- Qt浅谈之二十六图片滑动效果
一.简介 博客中发现有作者写的仿360的代码,觉得其中图片滑动的效果很有意思,特提取其中的代码.并加上类似mac的画面移动的动画效果. 二.详解 1.代码一:界面滑动(QWidget) (1)slid ...
- 初识python---简介,简单的for,while&if
一编程语言:编程语言是程序员与计算机沟通的介质: 编程语言的分类: 1机器语言:是用二进制代码表示的计算机能直接识别和执行的一种机器指令的集合. 优点:灵活,直接执行和速度快 ...
- B-树 C++模板类封装(有图有真相)
定义: 一棵m阶B-树是拥有以下性质的多路查找树: 1.非叶子结点的根结点至少拥有两棵子树: 2.每一个非根且非叶子的结点含有k-1个关键字以及k个子树,其中⌈m/2⌉≤k≤m: 3.每一个叶子结点都 ...
- 一览Swift中的常用关键字
要学习Swift这门语言,就必须先了解Swift的关键字及对应的解释.这里就列一下在Swift中常用到的关键字. 关键字是类似于标识符的保留字符序列,除非用重音符号(`)将其括起来,否则不能用作标识符 ...
- Linux自定义别名alias重启失效问题
Linux上的别名功能非常方便,例如ll可以显示文件列表的长信息,但是却不是以human能读懂的方式显示,所以我尝试直接在命令行中自定义一个别名: alisa lk='ls -lh' 然后lk就能正常 ...