`
Luob.
  • 浏览: 1592157 次
  • 来自: 上海
社区版块
存档分类
最新评论

spring 第7天 Bean,BeanFactory处理器,配置器

阅读更多
spring 两种后处理器
第一种,Bean 后处理器
对容器中bean进行处理,对bean的功能进行额外的增强
package cn.sh.processor;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;

import cn.sh.springmvc.applicationContextAware.MyContent;
import cn.sh.springmvc_java.American;

/**
 * Spring Bean的后置处器
 * @author Bin
 *
 */
public class MyBeanPostProcessor implements BeanPostProcessor {
	
	@Override
	public Object postProcessBeforeInitialization(Object bean, String beanName)
			throws BeansException {
		
		System.out.println("Bean后处理器在初始化之前对"+beanName+"进行增强处理....");
		//bean 容器中的Bean
		//返回的Bean 可以和原Bean截然不同
		return bean;
	}

	@Override
	public Object postProcessAfterInitialization(Object bean, String beanName)
			throws BeansException {

		System.out.println("Bean后处理器在初始化之后对"+beanName+"进行增强处理...");
		if(bean instanceof MyContent){
			System.out.println("修改BeanName的名字");
			MyContent a=(MyContent)bean;
			a.setBeanName("Struts2权威指南");
		}
		return bean;
	}

}
  <!--Bean 后置处理器  -->
   <bean id="beanPostProcessor" class="cn.sh.processor.MyBeanPostProcessor"/>

//如果采用ApplicationContext 作为容器,不需要手动注入Bean后处理器
//测试 BeanPostProcessor 
	@Test
	public void test13() {  
		AbstractApplicationContext act=new ClassPathXmlApplicationContext("classpath*:applicationContent.xml");
		MyContent p=act.getBean("ZG",MyContent.class);
		//获取容器
		System.out.println(p.getContext());
		System.out.println(act==p.getContext());

		//获取配置的bean id
		System.out.println("BeanName:"+p.getBeanName());
		//销毁
		act.registerShutdownHook();
	}
//如果采用 BeanFactory 作为spring的容器,需要手动注入bean后处理器
@Test
	public void test18() { 
		ClassPathResource isr=new ClassPathResource("applicationContent.xml");
		XmlBeanFactory beanFactory=new XmlBeanFactory(isr);
		MyBeanPostProcessor proc=beanFactory.getBean("beanPostProcessor", MyBeanPostProcessor.class);
		//如果采用beanfactory, bean后处理器必须显示的注入到 factory中
		beanFactory.addBeanPostProcessor(proc);
		
		MyContent p=beanFactory.getBean("ZG",MyContent.class);
		//获取容器
		System.out.println(p.getContext());
		//获取配置的bean id
		System.out.println("BeanName:"+p.getBeanName());
		
	}



容器后处理器
package cn.sh.processor;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.core.Ordered;

public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor,Ordered {

	@Override
	public void postProcessBeanFactory(
			ConfigurableListableBeanFactory beanFactory) throws BeansException {
		System.out.println("程序对Spring所做的BeanFactory的初始化没有改变..");
		System.out.println("Spring容器是:"+beanFactory);

	}

	@Override
	public int getOrder() {
		System.out.println("采用Ordered 来指定 后处理器的order属性");
		return 0;
	}
	

}

<bean id="beanFactoryProcessor" class="cn.sh.processor.MyBeanFactoryPostProcessor"/>

//如果采用 BeanFactory 作为spring的容器,需要手动注入beanFactory后处理器
	@Test
	public void test19() { 
		ClassPathResource isr=new ClassPathResource("applicationContent.xml");
		XmlBeanFactory beanFactory=new XmlBeanFactory(isr);
		MyBeanFactoryPostProcessor bfprocessor=beanFactory.getBean("beanFactoryProcessor", MyBeanFactoryPostProcessor.class);
		bfprocessor.postProcessBeanFactory(beanFactory);
		
		MyContent p=beanFactory.getBean("ZG",MyContent.class);
		//获取容器
		System.out.println(p.getContext());
		//获取配置的bean id
		System.out.println("BeanName:"+p.getBeanName());
		
	}
	
//如果采用 ApplicationContext作为spring的容器,则不用进行手动注入


spring已经提供了如下几个容器后处理器
PropertyPlaceHolderConfigurer:属性占位符配置器
PropertyOverrideConfigurer:重写占位符配置器
CustomAutowireConfigurer:自定义自动装配的配置器
CustomScopeConfigurer:自定义作用配置器


PropertyPlaceHolderConfigurer 属性占位符配置器

<!--两种配置方式 属性占位符 后处理器  如果导入了context Schema 可以用cotent: -->
   <!--  <context:property-placeholder location="classpath:dbconn.properties"/> -->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    	<property name="locations">
    		<list>
    			<value>dbconn.properties</value>
    		</list>
    	</property>
    </bean>
   <bean id="datasource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
    	<property name="driverClass" value="${jdbc.driverClassName}"/>
    	<property name="jdbcUrl" value="${jdbc.url}"/>
    	<property name="user" value="${jdbc.username}"/>
    	<property name="password" value="${jdbc.password}"/>
    	<property name="maxPoolSize" value="${jdbc.maxPoolSize}"/>
    	<property name="minPoolSize" value="${jdbc.minPoolSize}"/>
    	<property name="initialPoolSize" value="${jdbc.initialPoolSize}"/>
    	<property name="MaxIdleTime" value="${jdbc.MaxIdleTime}"/>
    </bean>

dbconn.properties
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mytest
jdbc.username=root
jdbc.password=123456
jdbc.maxPoolSize=40
jdbc.minPoolSize=1
jdbc.initialPoolSize=1
jdbc.MaxIdleTime=20


PropertyOverrideConfigurer:重写占位符配置器
  <!-- 采用 重写 占位符配置器  
   	发现:  重写 占位符  可以覆盖 属性占位符  中的值
   	两种配置方式
   -->
   <context:property-override location="classpath:db.properties"/>
   
   <!-- <bean class="org.springframework.beans.factory.config.PropertyOverrideConfigurer">
    	<property name="locations">
    		<list>
    			<value>db.properties</value>
    		</list>
    	</property>
    </bean> -->
    
    
    <!--采用 重写 占位符后 就可以不用 指定 属性了 -->
  <bean id="datasource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
   </bean>

db.properties
#beanName.property=value 的命名格式 
datasource.driverClass=com.mysql.jdbc.Driver
datasource.jdbcUrl=jdbc:mysql://localhost:3306/mytest
datasource.user=root
datasource.password=123456
datasource.maxPoolSize=40
datasource.minPoolSize=1
datasource.initialPoolSize=1
datasource.MaxIdleTime=20

分享到:
评论

相关推荐

    Spring in Action(第二版 中文高清版).part2

    第7章 保护Spring 7.1 Spring Security介绍 7.2 验证用户身份 7.2.1 配置Provider Manager 7.2.2 根据数据库验证身份 7.2.3 根据LDAP仓库进行身份验证 7.3 控制访问 7.3.1 访问决策投票 7.3.2 决定如何投票...

    第二十章 Spring 应用上下文生命周期(ApplicationContext Lifecycle)1

    `prepareBeanFactory()`方法中,ApplicationContext与ClassLoader关联,配置Bean表达式处理器,并添加PropertyEditorRegistrar以处理类型转换。同时,注册实现特定Aware接口的BeanPostProcessor,如...

    Spring in Action(第2版)中文版

    第7章保护spring 7.1springsecurity介绍 7.2验证用户身份 7.2.1配置providermanager 7.2.2根据数据库验证身份 7.2.3根据ldap仓库进行身份验证 7.3控制访问 7.3.1访问决策投票 7.3.2决定如何投票 7.3.3处理...

    Spring in Action(第二版 中文高清版).part1

    第7章 保护Spring 7.1 Spring Security介绍 7.2 验证用户身份 7.2.1 配置Provider Manager 7.2.2 根据数据库验证身份 7.2.3 根据LDAP仓库进行身份验证 7.3 控制访问 7.3.1 访问决策投票 7.3.2 决定如何投票...

    Spring的经典面试题

    - **控制反转(Inversion of Control, IoC)**:这是一种设计思想,它的核心在于通过第三方容器(如Spring)来管理对象的创建过程,而不是在代码中直接创建对象。这种方式降低了组件间的耦合度,提高了系统的灵活性...

    《精通Spring2.X企业应用开发详解》

    ### 《精通Spring2.X企业应用开发详解》第五章知识点详解 #### 5.1 Spring容器技术内幕 ##### 5.1.1 内部工作机制 Spring容器作为一款设计精妙且功能强大的框架核心,其内部机制对于理解和掌握Spring的工作原理至...

    Spring技术内幕:深入解析Spring架构与设计原理(第2版)

    - **策略模式**:在Spring MVC中,可以通过配置不同的处理器映射策略来灵活地处理请求。 #### 四、Spring的工作原理 - **Bean的生命周期管理**:Spring容器管理着Bean的整个生命周期,从创建到销毁。 - **依赖注入...

    深入剖析Spring Web源码(含一二版)带目录

    - **Bean的生命周期**:从BeanFactory到ApplicationContext,了解Bean的实例化、初始化、依赖注入、作用域和销毁过程。 - **AOP(面向切面编程)**:理解切点、通知、代理等概念,以及如何在Spring中实现AOP。 - ...

    Spring中文帮助文档

    6.8.3. 使用Spring IoC来配置AspectJ的切面 6.8.4. 在Spring应用中使用AspectJ加载时织入(LTW) 6.9. 更多资源 7. Spring AOP APIs 7.1. 简介 7.2. Spring中的切入点API 7.2.1. 概念 7.2.2. 切入点运算 ...

    小读spring ioc源码(一)——整体介绍

    Spring的扩展性非常强,支持自定义Bean后处理器(BeanPostProcessor)、Bean工厂后处理器(BeanFactoryPostProcessor)等,允许开发者在特定阶段介入Bean的生命周期。 7. **上下文的层次结构** ...

    精通Spring--Java轻量级架构开发实践.pdf

    4. Spring容器:了解ApplicationContext和BeanFactory,它们是Spring管理bean的主要容器。 第十章:Spring MVC——构建Web应用程序 Spring MVC是Spring框架的一个模块,专门用于构建Web应用程序。在这一章中,读者...

    Spring API

    6.8.3. 使用Spring IoC来配置AspectJ的切面 6.8.4. 在Spring应用中使用AspectJ加载时织入(LTW) 6.9. 更多资源 7. Spring AOP APIs 7.1. 简介 7.2. Spring中的切入点API 7.2.1. 概念 7.2.2. 切入点运算 ...

    spring所需jar包

    4. **Spring Beans**:Spring容器(BeanFactory或ApplicationContext)负责创建、配置和管理应用中的对象,即Spring Beans。开发者可以使用XML、注解或者Java配置来定义Bean及其依赖关系。 5. **数据访问/集成**:...

    spring 技术手册

    本书提供了如何创建第一个Spring程序的具体步骤,包括配置文件的编写、Bean的定义以及依赖注入的实现等。 #### 五、构造器注入 构造器注入是指通过类的构造器将依赖注入到对象中。这种方式可以确保对象在创建时就...

    spring in action 第三版(英文)

    - 控制器、视图解析器、处理器映射器等组件的作用机制。 - RESTful API的设计与实现方法。 4. **数据访问与集成**: - JDBC模板、Hibernate集成、MyBatis集成等多种数据访问技术的应用场景及优缺点比较。 - ...

    Spring技术内幕:深入解析Spring架构与设计原理(第2版)

    ### Spring技术内幕:深入解析Spring架构与设计原理(第2版) #### 一、Spring框架简介 Spring框架是由Rod Johnson创建的一个开源项目,它最初是为了简化企业级Java应用程序的开发而设计的。Spring的核心功能包括...

    Spring in Action 3rd

    ### Spring in Action 第三版 关键知识点概览 #### 一、Spring框架简介与核心特性 - **Spring框架概述**:Spring是一个开源的轻量级Java应用开发框架,旨在简化企业级应用程序的开发过程。它提供了全面的支持,包括...

    CGB_面试题_第三阶段.docx

    其处理流程包括:客户端发送请求到 DispatcherServlet,DispatcherServlet 分发请求到处理器映射器找到合适的 Handler,处理器适配器调用 Handler 处理请求,Handler 返回 ModelAndView 对象,视图解析器解析并渲染...

    Spring从入门到精通(珍藏版)5.pdf

    以上是《Spring从入门到精通(珍藏版)》第五部分的主要知识点概览,这些内容不仅覆盖了Spring的基本使用方法,还深入探讨了框架内部的实现原理和技术细节,对于初学者和进阶开发者都非常有帮助。

Global site tag (gtag.js) - Google Analytics