使用场景:jar提供的接口回调,仅Service名字不同,每次需要新写一个实现类,太过累赘,可以通过重复注入同一个实现,仅改变名字,示例如下,支持注入Bean和具体值
package com.yunjin.redis;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Component;
public class Spring {
public static void main(String[] args) throws Exception {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:" + Spring.class.getSimpleName() + ".xml");
Person my;
my = (Person) context.getBean("person1");
my.my();
my = (Person) context.getBean("person2");
my.my();
context.close();
}
}
@Component
class Dept {
public void dept() {
System.out.println("dept");
}
}
@Component
class Salary {
public void salary() {
System.out.println("salary");
}
}
class Person {
private Dept dept;
private Salary salary;
private String name;
public void my() {
System.out.println("my" + "-" + name + "-");
dept.dept();
salary.salary();
}
public Salary getSalary() {
return salary;
}
public void setSalary(Salary salary) {
this.salary = salary;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Dept getDept() {
return dept;
}
public void setDept(Dept dept) {
this.dept = dept;
}
}
@Component
class PersonBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) beanFactory;
BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(Person.class);
String beanName = beanFactory.getBeansOfType(Dept.class).keySet().stream().findFirst().get();
beanDefinitionBuilder.addPropertyReference("dept", beanName);
beanDefinitionBuilder.addPropertyValue("salary", beanFactory.getBean(Salary.class));
beanDefinitionBuilder.addPropertyValue("name", "哈哈哈22");
BeanDefinition personManagerBeanDefinition = beanDefinitionBuilder.getRawBeanDefinition();
defaultListableBeanFactory.registerBeanDefinition("person1", personManagerBeanDefinition);
defaultListableBeanFactory.registerBeanDefinition("person2", personManagerBeanDefinition);
}
}