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...

最新文章

  1. Windows 搭建 .NET 跨平台环境并运行应用程序
  2. 关于C#中readonly的一点小研究
  3. About SQLite
  4. JAVA课程体系
  5. Windows UDP socket recvfrom返回10054错误的解决办法
  6. JSP将表单提交并在本页中显示
  7. 《C语言入门1.2.3—一个老鸟的C语言学习心得》—清华大学出版社炮制的又一本劣书及伪书
  8. TWaver初学实战——如何在EasyUI中插入TWaver
  9. Ormlite or()的使用
  10. asp.net(C#)利用QRCode生成二维码
  11. iKcamp团队制作|基于Koa2搭建Node.js实战(含视频)☞ 中间件用法
  12. 转载-Linux Shell 数组建立及使用技巧
  13. centos7 firewalld 开放端口
  14. 部署openfaas
  15. Scala_控制结构
  16. POJ 2393
  17. SpringMVC注解@RequestMapping @RequestParam @ResponseBody 和 @RequestBody 解析
  18. httpclient org.apache.http.NoHttpResponseException: host:端口 failed to respond 错误原因和解决方法
  19. (python)leetcode刷题笔记 02 Add Two Numbers
  20. python fabric使用 http://fabric-chs.readthedocs.io/zh_CN/chs/tutorial.html

热门文章

  1. NumPy基础知识:数组和矢量计算
  2. Get Region Information from IP Address with Taobao API
  3. Python之函数总结
  4. rails 增删改查
  5. iOS 绘制漂亮的折线图
  6. SQL 根据IF判断,SET字段值
  7. Linux Shell编程 awk命令
  8. VMWare虚拟机安装步骤
  9. 【leetcode刷题笔记】Surrounded Regions
  10. 跨平台移动开发_PhoneGap 使用Accelerometer 加速器