Spring表达式语言(SPEL)(04)

获取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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值