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