Spring中常用接口的简单使用

Spring中常用接口

 

1.Aware接口


1.1BeanNameAware接口

该接口可以对bean的生命周期进行一个回调的作用,例如:在Spring启动后,去回调bean的生命周期从而得到bean对象的beanName。我们开发者可以根据业务场景对beanName进行修改。代码如下:


@Component
public class AService implements BeanNameAware {
    @Autowired
    private BService bService;
    private String beanName;

    public void  test(){}

    @Override
    public void setBeanName(String name) {
        name = "张大仙";
        this.beanName = name;
    }

    public void setbService(BService bService) {
        this.bService = bService;
    }

    public BService getbService() {
        return bService;
    }

    public String getBeanName() {
        return beanName;
    }
}
   public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
        AService aService = applicationContext.getBean("AService", AService.class);
        System.out.println(aService.getBeanName());
    }

1.2BeanFactoryAware接口

该接口同样可以对bean的生命周期进行一个回调的作用,例如:在Spring启动后,去回调bean的生命周期从而得到bean对象是由哪个bean工厂创建的。我们开发者可以根据业务场景对beanFactory进行修改。代码如下:

@Component
public class AService implements BeanFactoryAware {
    @Autowired
    private BService bService;

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        System.out.println(beanFactory);
    }

}

2.初始化相关接口

2.1 InitializingBean接口

在执行Bean的生命周期的时候,Spring会去判断InitializingBean接口有没有被实现,如果有则会去执行InitializingBean.afterPropertiesSet()方法。我们开发者可以根据业务场景对afterPropertiesSet方法进行编写。代码如下:

@Component
public class CService implements InitializingBean {
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("初始化逻辑");
    }
}

    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
    }

3.AOP的使用

在bean的生命周期中,我们开发者可以根据业务场景对bean对象进行切面编写。例如:

@Configuration
@ComponentScan("com.yunhuan")
@EnableAspectJAutoProxy  //开启AOP
public class AppConfig {
}

@Aspect
@Component
public class LubanAspect {

    @Around("execution(* com.yunhuan.service.AService.test())")
    public void invoke(ProceedingJoinPoint point) {
        try {
            System.out.println("aop");
            point.proceed();
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
    }
}
@Component
public class AService {

    public void test() {}
}
public class Test {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
        AService aService = applicationContext.getBean("AService", AService.class);
        aService.test();

    }
}

4.beanDefinition

beanDefinition有属性,包括:constructorArgumentValues、beanClass、parentName、initMethodName、scope、factoryBeanName、dependSon

、propertyValues、destoryMethodName、primary、beanClass、lazyInit,autowireCandidate、FactoryMethodName。

5.BeanFactoryPostProcessor接口

bean生命周期:class---->BeanDefinition---->BeanFactory组建完成---->BeanFactoryPostProcessor---->new 对象(原始对象)---->填充属性---->Aware---->初始化---->AOP---->单例池(Map<beanName,对象>)

BeanFactoryPostProcessor接口是在bean生成BeanFactory组建完成进行之后调用的后置处理器。

BeanFactoryPostProcessor接口与 BeanPostProcessor接口类似,可以对bean的定义(配置元数据)进行处理;也就是spring ioc运行BeanFactoryPostProcessor在容器实例化任何其他的bean之前读取配置元数据,并有可能修改它;如果业务需要,可以配置多个BeanFactoryPostProcessor的实现类,通过”order”控制执行次序(要实现Ordered接口)。  例如:

@Component
public class FService {

    private String  name;

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}
@Component
public class LubanBeanFactory implements BeanFactoryPostProcessor {
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {

        BeanDefinition beanDefinition = beanFactory.getBeanDefinition("FService");
        String beanClassName = beanDefinition.getBeanClassName();
        System.out.println(beanClassName);
        System.out.println("修改属性name值");
        beanDefinition.getPropertyValues().add("name", "liSi");
        System.out.println(beanDefinition.getPropertyValues());}
}
public class Test {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
       // FService fService = (FService) applicationContext.getBean("FService", FService.class);


    }
}

6.BeanPostProcessor接口

bean生命周期:class---->BeanDefinition---->BeanFactory组建完成---->BeanFactoryPostProcessor---->new 对象(原始对象)---->填充属性---->Aware---->初始化---->AOP---->单例池(Map<beanName,对象>)

BeanPostProcessor:bean级别的处理,针对某个具体的bean进行处理。了解bean的生命周期就能知道,BeanPostProcessor接口是在bean生成原始对象之后进行调用的后置处理器。

public interface BeanPostProcessor {

	@Nullable
	default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
		return bean;
	}

	
	@Nullable
	default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
		return bean;
	}

}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值