获取Bean对象
BeanResolver获取Bean
在SPEL表达式里面也可以直接访问bean对象,前提是指定了一个BeanResolver,BeanResolver是一个接口,其只定义了一个方法resolver,用以通过beanName解析为对应的bean对象并返回
如果要在SPEL表达式中访问bean对象,需要通过StandardEvaluationContext来设置对应的BeanResolver,同时我们需要在SPEL表达式以@beanName的方法来访问对应的bean对象
@Component
public class MyBeanResolver implements BeanResolver, ApplicationContextAware {
private static ApplicationContext applicationContext;
public Object resolve(EvaluationContext context, String beanName) throws AccessException {
return applicationContext.getBean(beanName);
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
}
@Configuration
public class BeanConfig {
@Bean
public Student student() {
return new Student("张三", 20);
}
}
public class Student {
private String name;
private Integer age;
public Student(String name, Integer age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
@Test
public void test() {
ExpressionParser parser = new SpelExpressionParser();
StandardEvaluationContext context = new StandardEvaluationContext();
context.setBeanResolver(new MyBeanResolver());
//访问bean名称为student的bean对象的getName()方法。
Object obj = parser.parseExpression("@student.name").getValue(context);
System.out.println(obj);
}
BeanFactoryResolver获取Bean
SPEL支持使用@符号来引用Bean,在引用Bean时需要使用BeanResolver接口实现来查找Bean,Spring提供BeanFactoryResolver实现
@Test
public void test7() {
Student student = new Student("张三", 20);
DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
factory.registerSingleton("student", student);
StandardEvaluationContext context = new StandardEvaluationContext();
context.setBeanResolver(new BeanFactoryResolver(factory));
ExpressionParser parser = new SpelExpressionParser();
Student userBean = parser.parseExpression("@student").getValue(context, Student.class);
System.out.println(userBean);
System.out.println(userBean == factory.getBean("student"));
}
使用属性访问器获取Bean
@Resource
private BeanFactory beanFactory;
@Test
public void test04() {
ExpressionParser parser = new SpelExpressionParser();
StandardEvaluationContext context = new StandardEvaluationContext(beanFactory);
// 使用属性访问器获取Bean
context.addPropertyAccessor(new BeanFactoryAccessor());
Expression expression = parser.parseExpression("student");
Student value = expression.getValue(context, Student.class);
System.out.println(value);
System.out.println(value.getName());
}
@Value指定SPEL表达式
@Component
public class SpelBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
BeanExpressionResolver beanExpressionResolver = beanFactory.getBeanExpressionResolver();
if (beanExpressionResolver instanceof StandardBeanExpressionResolver) {
StandardBeanExpressionResolver resolver = (StandardBeanExpressionResolver) beanExpressionResolver;
resolver.setExpressionPrefix("%{");
resolver.setExpressionSuffix("}");
}
}
}
@Component
public class LessonModel {
@Value("你好,%{@name},%{@msg}")
private String desc;
@Override
public String toString() {
return "LessonModel{" +
"desc='" + desc + '\'' +
'}';
}
}
@Configuration
public class MainConfig {
@Bean
public String name() {
return "路粉";
}
@Bean
public String msg() {
return "欢迎和我一起学习java各种技术!";
}
}
@Resource
private BeanFactory beanFactory;
@Test
public void test1() {
LessonModel bean = beanFactory.getBean(LessonModel.class);
System.out.println(bean);
}