当前位置: 首页 > news >正文

武穴网站建设南京做网站优化价格

武穴网站建设,南京做网站优化价格,竞价网站做招商加盟可以不备案吗,mysql asp网站开发小伙伴们知道#xff0c;当我们使用 Spring 容器的时候#xff0c;如果遇到一些特殊的 Bean#xff0c;一般来说可以通过如下三种方式进行配置#xff1a; 静态工厂方法实例工厂方法FactoryBean 不过从 Spring5 开始#xff0c;在 AbstractBeandefinition 类中多了一个属…小伙伴们知道当我们使用 Spring 容器的时候如果遇到一些特殊的 Bean一般来说可以通过如下三种方式进行配置 静态工厂方法实例工厂方法FactoryBean 不过从 Spring5 开始在 AbstractBeandefinition 类中多了一个属性对于特殊的 Bean 我们有了更多的选择 /*** Specify a callback for creating an instance of the bean,* as an alternative to a declaratively specified factory method.* pIf such a callback is set, it will override any other constructor* or factory method metadata. However, bean property population and* potential annotation-driven injection will still apply as usual.* since 5.0* see #setConstructorArgumentValues(ConstructorArgumentValues)* see #setPropertyValues(MutablePropertyValues)*/ public void setInstanceSupplier(Nullable Supplier? instanceSupplier) {this.instanceSupplier instanceSupplier; }/*** Return a callback for creating an instance of the bean, if any.* since 5.0*/ Nullable public Supplier? getInstanceSupplier() {return this.instanceSupplier; }接下来松哥就来和大家简单聊一聊这个话题。 1. 传统解决方案 1.1 问题 不知道各位小伙伴们有没有用过 OkHttp这是一个专门做网络请求的工具在微服务的 HTTP 调用组件中我们可以配置底层使用 OkHttp 这个工具。 一般来说如果我们想直接使用 OkHttp代码如下 OkHttpClient client new OkHttpClient.Builder().connectTimeout(5, TimeUnit.SECONDS).readTimeout(5, TimeUnit.SECONDS).build(); Request getReq new Request.Builder().get().url(http://www.javaboy.org).build(); Call call client.newCall(getReq); call.enqueue(new Callback() {Overridepublic void onFailure(NotNull Call call, NotNull IOException e) {System.out.println(e.getMessage() e.getMessage());}Overridepublic void onResponse(NotNull Call call, NotNull Response response) throws IOException {System.out.println(response.body().string() response.body().string());} });先通过建造者模式创建出来一个 OkHttpClient 对象然后还是建造者模式创建出来 Request 对象接下来去发送请求就可以了。那么对于这样的代码我们可以将 OkHttpClient 对象交由 Spring 容器统一管理那么该如何将 OkHttpClient 注册到 Spring 容器中呢 1.2 静态工厂方法 首先可以采用静态工厂方法也就是工厂方法是一个静态方法如下 public class OkHttpStaticFactory {private static OkHttpClient okHttpClient;static {okHttpClient new OkHttpClient.Builder().connectTimeout(5, TimeUnit.SECONDS).readTimeout(5, TimeUnit.SECONDS).build();}public static OkHttpClient getOkHttpClient() {return okHttpClient;} }然后在 Spring 配置文件中进行注入 bean classorg.javaboy.bean.OkHttpStaticFactory factory-methodgetOkHttpClient idhttpClient/静态工厂的特点是静态方法可以直接调用并必须要获取到工厂类的实例所以上面配置的时候只需要指定 factory-method 就可以了。 这就可以了将来我们去 Spring 容器中查找一个名为 httpClient 的对象拿到手的就是 OkHttpClient 了。 1.3 实例工厂方法 实例工厂方法意思就是说工厂方法是一个实例方法。如下 public class OkHttpInstanceFactory {private volatile static OkHttpClient okHttpClient;public OkHttpClient getInstance() {if (okHttpClient null) {synchronized (OkHttpInstanceFactory.class) {if (okHttpClient null) {okHttpClient new OkHttpClient.Builder().connectTimeout(5, TimeUnit.SECONDS).readTimeout(5, TimeUnit.SECONDS).build();}}}return okHttpClient;} }这是一个简单的单例模式。但是这里的工厂方法是一个实例方法实例方法的调用必须得先获取到对象然后才能调用实例方法因此配置方式如下 bean classorg.javaboy.bean.OkHttpInstanceFactory idhttpInstanceFactory/ bean factory-beanhttpInstanceFactory factory-methodgetInstance idhttpClient/好啦接下来我们就可以去 Spring 容器中获取一个名为 httpClient 的对象了拿到手的就是 OkHttpClient 实例。 1.4 FactoryBean 当然也可以通过 FactoryBean 来解决上述问题FactoryBean 松哥在之前的文章中刚刚和大家介绍过我们来看下 public class OkHttpClientFactoryBean implements FactoryBeanOkHttpClient {Overridepublic OkHttpClient getObject() throws Exception {return new OkHttpClient.Builder().connectTimeout(5, TimeUnit.SECONDS).readTimeout(5, TimeUnit.SECONDS).build();}Overridepublic Class? getObjectType() {return OkHttpClient.class;}Overridepublic boolean isSingleton() {return true;} }最后在 Spring 中配置即可 bean classorg.javaboy.bean.OkHttpClientFactoryBean idhttpClient/这个就不做过多解释了不熟悉的小伙伴可以翻看前面的文章。 上面这三种方案都是传统方案。 特别是前两种其实我们用的比较少前两种有一个缺陷就是我们配置的的 factory-method 都是通过反射来调用的通过反射调用的话多多少少性能受点影响。 这种 factory-method 在 Spring 中处理的源码执行时序图如下 所以最终反射是在 SimpleInstantiationStrategy#instantiate 方法中执行的就是大家非常熟悉的反射代码了 Override public Object instantiate(RootBeanDefinition bd, Nullable String beanName, BeanFactory owner,Nullable Object factoryBean, final Method factoryMethod, Object... args) {ReflectionUtils.makeAccessible(factoryMethod);Method priorInvokedFactoryMethod currentlyInvokedFactoryMethod.get();try {currentlyInvokedFactoryMethod.set(factoryMethod);Object result factoryMethod.invoke(factoryBean, args);if (result null) {result new NullBean();}return result;}finally {if (priorInvokedFactoryMethod ! null) {currentlyInvokedFactoryMethod.set(priorInvokedFactoryMethod);}else {currentlyInvokedFactoryMethod.remove();}} }好了这是传统的解决方案。 2. Spring5 解决方案 Spring5 中开始提供了 Supplier可以通过接口回调获取到一个 Bean 的实例这种方式显然性能更好一些。 如下 AnnotationConfigApplicationContext ctx new AnnotationConfigApplicationContext(); GenericBeanDefinition definition new GenericBeanDefinition(); definition.setBeanClass(Book.class); definition.setInstanceSupplier((SupplierBook) () - {Book book new Book();book.setName(深入浅出 Spring Security);book.setAuthor(江南一点雨);return book; }); ctx.registerBeanDefinition(b1, definition); ctx.refresh(); Book b ctx.getBean(b1, Book.class); System.out.println(b b);关键就是通过调用 BeanDefinition 的 setInstanceSupplier 方法去设置回调。当然上面这段代码还可以通过 Lambda 进一步简化 public class BookSupplier {public Book getBook() {Book book new Book();book.setName(深入浅出 Spring Security);book.setAuthor(江南一点雨);return book;} }然后调用这个方法即可 AnnotationConfigApplicationContext ctx new AnnotationConfigApplicationContext(); GenericBeanDefinition definition new GenericBeanDefinition(); definition.setBeanClass(Book.class); BookSupplier bookSupplier new BookSupplier(); definition.setInstanceSupplier(bookSupplier::getBook); ctx.registerBeanDefinition(b1, definition); ctx.refresh(); Book b ctx.getBean(b1, Book.class); System.out.println(b b);这是不是更有一点 Lambda 的感觉了 在 Spring 源码中处理获取 Bean 实例的时候有如下一个分支就是处理 Supplier 这种情况的 AbstractAutowireCapableBeanFactory#createBeanInstance protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, Nullable Object[] args) {// Make sure bean class is actually resolved at this point.Class? beanClass resolveBeanClass(mbd, beanName);if (beanClass ! null !Modifier.isPublic(beanClass.getModifiers()) !mbd.isNonPublicAccessAllowed()) {throw new BeanCreationException(mbd.getResourceDescription(), beanName,Bean class isnt public, and non-public access not allowed: beanClass.getName());}Supplier? instanceSupplier mbd.getInstanceSupplier();if (instanceSupplier ! null) {return obtainFromSupplier(instanceSupplier, beanName);}if (mbd.getFactoryMethodName() ! null) {return instantiateUsingFactoryMethod(beanName, mbd, args);}//...return instantiateBean(beanName, mbd); }Nullable private Object obtainInstanceFromSupplier(Supplier? supplier, String beanName) {String outerBean this.currentlyCreatedBean.get();this.currentlyCreatedBean.set(beanName);try {if (supplier instanceof InstanceSupplier? instanceSupplier) {return instanceSupplier.get(RegisteredBean.of((ConfigurableListableBeanFactory) this, beanName));}if (supplier instanceof ThrowingSupplier? throwableSupplier) {return throwableSupplier.getWithException();}return supplier.get();} }上面 obtainFromSupplier 这个方法最终会调用到第二个方法。第二个方法中的 supplier.get(); 其实最终就调用到我们自己写的 getBook 方法了。 好啦这是从 Spring5 开始结合 Lamdba 的一种 Bean 注入方式感兴趣的小伙伴可以试试哦
http://www.hkea.cn/news/14492493/

相关文章:

  • 绿色食品网站建设可行性设计教程网站推荐
  • 做网站销售会遇到哪些问题龙岗网站优化
  • 怎样破解网站后台密码wordpress列表页怎么加关键词
  • 网站开发实战asp制作视频教程承德房地产网站建设
  • 营销平台网站建设网站建设玖金手指谷哥四
  • 优秀的国内企业网站国家精品资源共享课程建设网站
  • 网站建设功能需求文档刚刚深圳出的大事
  • wordpress侧面导航插件广州市网站优化公司
  • 小学网站建设设计方案wordpress多个导航菜单
  • wap织梦手机网站中国景观设计网
  • 网站推广的宣传途径深圳建设局官网站
  • 如何在yahoo上做网站产品定制网站
  • 专业网站建设哪家效果好商标注册证
  • 社交网站模板无锡网站制作推荐
  • 购物网站网页设计seo值怎么提高
  • 怎样建立微网站中国住房和城乡建设部网站证书查询
  • 家里做服务器开网站怎么改wordpress字体
  • 网站建站的方式主要有哪几种网站开发的未来发展
  • 做淘宝链接模板网站辽宁建设工程信息网开标流程
  • 手机做视频的软件排名优化seo
  • 怎么做一淘宝客网站吗网站搭建是什么专业
  • 深圳罗湖网站建设公司网站建设一条龙全包顶呱呱
  • 阜南网站建设公司友好速搭 WordPress
  • 重庆网站设计制作价格电脑学校
  • 叫人做网站后不提供源码网站开发工具安卓版
  • 医院网站主页面设计网站组建
  • 淘宝宝贝链接怎么做相关网站怎么网上接网站开发单自己做
  • 正能量网站地址污的wordpress如何修改背景图片
  • 网站制作1金华做网站最专业的公司
  • 做奥数题网站东莞公司建设网站