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

posted @ 2017-01-23 00:34  starryfei  阅读(518)  评论(0编辑  收藏  举报