1. BeanFactory動態(tài)注入到Interface

        共 3673字,需瀏覽 8分鐘

         ·

        2022-04-10 20:02

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

        1、首先定義承載對象的接口;

        public interface Bean {}


        2、定義BeanFactory,實現(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)變量去引用其地址。這時候我們可以采用ApplicationContextInitializer的能力。

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



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

        測試如下;


        當然實現(xiàn)上述功能,其實還有其他的方法,這塊將spring的多個接口算是整合起來學習一下,換句話說就是寫個筆記,用的時候好查一些。





        瀏覽 32
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
          
          

            1. 亚洲日韩一级片 | 山村大伦淫第1部分阅读小说 | 熟妇人妻中文字幕无码老熟妇 | 99激情网 | 精品久久久久免费极品大片 |