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>