zoukankan      html  css  js  c++  java
  • 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... 
    
    
    作者:starryfeiii
    出处:http://www.cnblogs.com/feiii/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,原文链接否则保留追究法律责任的权利。
  • 相关阅读:
    AD域渗透测试笔记
    ctf之WEB练习一
    CTF之crpto练习三
    ctf之WEB练习二
    ctf之WEB练习三
    [转]Ant学习笔记——自己构建Ant编译环境
    [转]【NoSQL】NoSQL入门级资料整理(CAP原理、最终一致性)
    啥叫异步调用
    C++中虚函数的作用是什么?它应该怎么用呢?
    [转]Thrift连接池实现
  • 原文地址:https://www.cnblogs.com/feiii/p/6343021.html
Copyright © 2011-2022 走看看