<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          BeanFactory動(dòng)態(tài)注入到Interface

          共 3673字,需瀏覽 8分鐘

           ·

          2022-04-10 20:02

          有時(shí)候代碼需要靈活的返回需要的一些對(duì)象,這時(shí)候我們往往用接口去承載返回的對(duì)象。尤其像spring這種框架,可以用@Resource的name屬性進(jìn)行區(qū)別。但是這種需要開(kāi)發(fā)者在注入ioc中就提前申明name屬性,在針對(duì)多個(gè)實(shí)現(xiàn)的情況下。作者今天看到另外一種姿勢(shì),主要是通過(guò)BeanFactory接口以及ApplicationContextInitializer、BeanDefinitionRegistryPostProcessor等接口去實(shí)現(xiàn)的。通過(guò)這些接口我們可以做更多的擴(kuò)展,從而避免寫(xiě)name去標(biāo)記的問(wèn)題,其次更深化我們對(duì)spring的應(yīng)用吧。

          1、首先定義承載對(duì)象的接口

          public interface Bean {}


          2、定義BeanFactory,實(shí)現(xiàn)getObject方法。

          public class MyBeanFactoryimplements FactoryBean{

          private String name;

          private String age;

          public String getName() { return name; }

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

          public String getAge() { return age; }

          public void setAge(String age) { this.age = age; }

          public static final Mapmap=new HashMap<>();

          @Override public T getObject() throws Exception { if (CollectionUtils.isEmpty(map)||!map.containsKey("lele")){ synchronized (map){ return (T) execute(); } }else{ return (T) map.get("lele"); } }

          private Object execute() { Mybean mybean = new Mybean(name,age); map.put("lele",mybean); return mybean; }

          @Override public Class getObjectType() { return null; }

          @Override public boolean isSingleton() { return FactoryBean.super.isSingleton(); }}

          3、將BeanFactory注入到ioc容器。


          public class MyBeanFactoryBean extends MyBeanFactory{
          }


          Spring注入bean裝配廠工具類

          public class MySpringContentUtils {

          public static ConfigurableApplicationContext context;

          public static ConfigurableApplicationContext getContext() { return context; }

          public static void setContext(ConfigurableApplicationContext context) { MySpringContentUtils.context = context; }

          public static void registerBean(String name, Class factoryClazz, Class beanClazz, MutablePropertyValues mpv) throws BeanDefinitionStoreException { BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(beanClazz); GenericBeanDefinition beanDefinition = (GenericBeanDefinition)beanDefinitionBuilder.getRawBeanDefinition(); beanDefinition.setBeanClass(factoryClazz == null ? beanClazz : factoryClazz); beanDefinition.setPropertyValues(mpv); BeanDefinitionRegistry beanFactory = (BeanDefinitionRegistry)context.getBeanFactory(); beanFactory.registerBeanDefinition(name, beanDefinition); }

          public staticT getBean(String name) throws BeansException { return (T) context.getBean(name); }}

          將MyBeanFactory注入到beanDefianition中

          @Configurationpublic class MyConfig implements BeanDefinitionRegistryPostProcessor {
          @Override public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException { MutablePropertyValues mv=new MutablePropertyValues(); mv.add("name","jasldf"); mv.add("age","123"); MySpringContentUtils.registerBean("jk",MyBeanFactoryBean.class,Mybean.class,mv); }
          @Override????public?void?postProcessBeanFactory(ConfigurableListableBeanFactory?configurableListableBeanFactory)?throws?BeansException?{ }}
          上述中我們要想將MyBeanFactoryBean注入到IOC中,首先我們需要讓MySpringContentUtils 拿到ioc,并用靜態(tài)變量去引用其地址。這時(shí)候我們可以采用ApplicationContextInitializer的能力。

          public?class?MyTianApplicationInitlize?implements?ApplicationContextInitializer?{    @Override    public void initialize(ConfigurableApplicationContext configurableApplicationContext) {        MySpringContentUtils.setContext(configurableApplicationContext);    }}
          寫(xiě)完代碼,我們?cè)趓esources目錄下創(chuàng)建META-INF文件夾,并創(chuàng)建spring.fatories文件,并填入我們的初始化類的路徑。具體如圖所示。



          至此,我們需要的功能就已經(jīng)寫(xiě)完了。這里我們測(cè)試一下。

          測(cè)試如下;


          當(dāng)然實(shí)現(xiàn)上述功能,其實(shí)還有其他的方法,這塊將spring的多個(gè)接口算是整合起來(lái)學(xué)習(xí)一下,換句話說(shuō)就是寫(xiě)個(gè)筆記,用的時(shí)候好查一些。





          瀏覽 32
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  黄色A片免费视屏观看 | 国产视频高清 | 操逼做爱视 | www.91蝌蚪 | 最近最新MV字幕观看 |