spring 后处理器
Bean后处理器
新建maven项目并添加spring依赖,目录结构如下
Axe
public interface Axe { public String chop(); }
Person
public interface Person { public void useAxe(); }
SteelAxe

public class SteelAxe implements Axe { public SteelAxe() { System.out.println("Spring实例化依赖bean:SteelAxe实例..."); } public String chop() { return "钢斧砍柴真快"; } }
Chinese

public class Chinese implements Person,InitializingBean { private Axe axe; private String name; public Chinese() { System.out.println("Spring 实例化主调bean:Chinese实例..."); } public void setAxe(Axe axe) { this.axe = axe; } public void setName(String name) { System.out.println("Spring执行setName()方法注入依赖关系..."); this.name = name; } public void useAxe(){ System.out.println(name+axe.chop()); } public void init(){ System.out.println("正在执行初始化方法init..."); } public void afterPropertiesSet() throws Exception { System.out.println("正在执行初始化方法afterPropertiesSet..."); } }
MyBeanPostProcessor

package org.mythsky.springdemo; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.lang.Nullable; public class MyBeanPostProcessor implements BeanPostProcessor { @Nullable public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { System.out.println("Bean后处理器在初始化之前对"+beanName+"进行增强处理..."); return bean; } @Nullable public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { System.out.println("Bean后处理器在初始化之后对"+beanName+"进行增强处理..."); if(bean instanceof Chinese){ Chinese c=(Chinese)bean; c.setName("Hello world!"); } return bean; } }
测试BeanTest

package org.mythsky.springdemo; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class BeanTest { public static void main(String[] args){ ApplicationContext ctx=new ClassPathXmlApplicationContext("services.xml"); Person p=(Person)ctx.getBean("chinese"); p.useAxe(); } }
services.xml

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="steelAxe" class="org.mythsky.springdemo.SteelAxe"></bean> <bean id="chinese" class="org.mythsky.springdemo.Chinese" init-method="init" p:axe-ref="steelAxe" p:name="依赖注入的值"></bean> <bean class="org.mythsky.springdemo.MyBeanPostProcessor"></bean> </beans>
测试结果
容器后处理器
MyBeanFactoryPostProcessor

package org.mythsky.springdemo; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanFactoryPostProcessor; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor { public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException { System.out.println("程序对Spring所做的BeanFactory的初始化没有改变..."); System.out.println("Spring容器是:"+configurableListableBeanFactory); } }
services.xml
<bean class="org.mythsky.springdemo.MyBeanFactoryPostProcessor"></bean>
运行上面的测试
PropertyPlaceholderConfigurer
services.xml

<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" p:driverClass="${jdbc.driverClassName}" p:jdbcUrl="${jdbc.url}" p:user="${jdbc.username}" p:password="${jdbc.password}"></bean>
dbconn.properties
jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://10.200.151.28:3306/spring jdbc.username=root jdbc.password=pass
MysqlTest

package org.mythsky.springdemo; import com.mchange.v2.c3p0.ComboPooledDataSource; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class MysqlTest { public static void main(String[] args){ ApplicationContext ctx=new ClassPathXmlApplicationContext("services.xml"); ComboPooledDataSource dataSource= (ComboPooledDataSource) ctx.getBean("dataSource"); System.out.println(dataSource.getDriverClass()); System.out.println(dataSource.getJdbcUrl()); System.out.println(dataSource.getUser()); System.out.println(dataSource.getPassword()); } }
添加c3p0依赖

<dependency> <groupId>com.mchange</groupId> <artifactId>c3p0</artifactId> <version>0.9.5.2</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.8-dmr</version> </dependency>
运行结果
PropertyOverrideConfigurer
services.xml

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close" p:driverClass="${jdbc.driverClassName}" p:jdbcUrl="${jdbc.url}" p:user="${jdbc.username}" p:password="${jdbc.password}"></bean> <bean class="org.springframework.beans.factory.config.PropertyOverrideConfigurer"> <property name="locations"> <list> <value>db.properties</value> </list> </property> </bean> <bean id="dataSource2" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"></bean>
db.properties

dataSource2.driverClass=com.mysql.jdbc.Driver dataSource2.jdbcUrl=jdbc:mysql://10.200.151.28:3306/spring dataSource2.user=root dataSource2.password=pass
MysqlTest
ComboPooledDataSource dataSource= (ComboPooledDataSource) ctx.getBean("dataSource2");
运行结果同上。
以上两种配置可以简写
<context:property-placeholder location="dbconn.properties"></context:property-placeholder> <context:property-override location="db.properties"></context:property-override>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!