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

成交型网站建设价格怎么进电力建设公司网站

成交型网站建设价格,怎么进电力建设公司网站,嘉定公司网站设计,怎么做记步数的程序到网站前言Spring是一款非常强大的框架#xff0c;可以说是几乎所有的企业级Java项目使用了Spring#xff0c;而Bean又是Spring框架的核心。Spring框架运用了非常多的设计模式#xff0c;从整体上看#xff0c;它的设计严格遵循了OCP----开闭原则#xff0c;即#xff1a;1、保…前言Spring是一款非常强大的框架可以说是几乎所有的企业级Java项目使用了Spring而Bean又是Spring框架的核心。Spring框架运用了非常多的设计模式从整体上看它的设计严格遵循了OCP----开闭原则即1、保证对修改关闭即外部无法修改Spring整个运作的流程2、提供对扩展开放即可以通过继承、实现Spring提供的众多抽象类与接口来改变类加载的行为开卷有益阅读Spring源码(无需每个类都看得很细大体流程能梳理出来即可)对于个人水平的提升是帮助非常大的同时也能在工作中即使发现和解决一些不常见的Spring问题。不过本文的目的不是整理Spring的流程而是通过介绍一些常用的Spring Bean工具类来让我们可以更好地使用Spring提供给开发者的多种特性下面让我们开始吧。InitialingBean和DisposableBeanInitialingBean是一个接口提供了一个唯一的方法afterPropertiesSet()。DisposableBean也是一个接口提供了一个唯一的方法destory()。这两个接口是一组的功能类似因此放在一起前者顾名思义在Bean属性都设置完毕后调用afterPropertiesSet()方法做一些初始化的工作后者在Bean生命周期结束前调用destory()方法做一些收尾工作。下面看一下例子为了能明确地知道afterPropertiesSet()方法的调用时机加上一个属性给属性set方法在set方法中打印一些内容/*** author 五月的仓颉 http://www.cnblogs.com/xrq730/p/5721366.html*/public class LifecycleBean implements InitializingBean, DisposableBean{SuppressWarnings(unused)private String lifeCycleBeanName;public void setLifeCycleBeanName(String lifeCycleBeanName){System.out.println(Enter LifecycleBean.setLifeCycleBeanName(), lifeCycleBeanName lifeCycleBeanName);this.lifeCycleBeanName lifeCycleBeanName;}public void destroy() throws Exception{System.out.println(Enter LifecycleBean.destroy());}public void afterPropertiesSet() throws Exception{System.out.println(Enter LifecycleBean.afterPropertiesSet());}public void beanStart(){System.out.println(Enter LifecycleBean.beanStart());}public void beanEnd(){System.out.println(Enter LifecycleBean.beanEnd());}}配置一个spring.xmlxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-4.1.xsd启动Spring容器LifecycleBean执行的结果为Enter LifecycleBean.setLifeCycleBeanName(), lifeCycleBeanName lifeCycleBeanEnter LifecycleBean.afterPropertiesSet()Enter LifecycleBean.beanStart()Enter LifecycleBean.destroy()Enter LifecycleBean.beanEnd()执行结果和我们想的一样afterPropertiesSet()方法就如同它的名字所表示的那样是在Bean的属性都被设置完毕之后才会调用。关于这两个接口我总结几点1、InitializingBean接口、Disposable接口可以和init-method、destory-method配合使用接口执行顺序优先于配置2、InitializingBean接口、Disposable接口底层使用类型强转.方法名()进行直接方法调用init-method、destory-method底层使用反射前者和Spring耦合程度更高但效率高后者解除了和Spring之间的耦合但是效率低使用哪个看个人喜好3、afterPropertiesSet()方法是在Bean的属性设置之后才会进行调用某个Bean的afterPropertiesSet()方法执行完毕才会执行下一个Bean的afterPropertiesSet()方法因此不建议在afterPropertiesSet()方法中写处理时间太长的方法BeanNameAware、ApplicationContextAware和BeanFactoryAware这三个接口放在一起写是因为它们是一组的作用相似。Aware的意思是感知到的那么这三个接口的意思也不难理解1、实现BeanNameAware接口的Bean在Bean加载的过程中可以获取到该Bean的id2、实现ApplicationContextAware接口的Bean在Bean加载的过程中可以获取到Spring的ApplicationContext这个尤其重要ApplicationContext是Spring应用上下文从ApplicationContext中可以获取包括任意的Bean在内的大量Spring容器内容和信息3、实现BeanFactoryAware接口的Bean在Bean加载的过程中可以获取到加载该Bean的BeanFactory看一下例子/*** author 五月的仓颉 http://www.cnblogs.com/xrq730/p/5721366.html*/public class AwareBean implements BeanNameAware, BeanFactoryAware, ApplicationContextAware{private String beanName;private ApplicationContext applicationContext;private BeanFactory beanFactory;public void setBeanName(String beanName){System.out.println(Enter AwareBean.setBeanName(), beanName beanName \n);this.beanName beanName;}public void setApplicationContext(ApplicationContext applicationContext) throws BeansException{System.out.println(Enter AwareBean.setApplicationContext(), applicationContext applicationContext \n);this.applicationContext applicationContext;}public void setBeanFactory(BeanFactory beanFactory) throws BeansException{System.out.println(Enter AwareBean.setBeanFactory(), beanfactory beanFactory \n);this.beanFactory beanFactory;}}配置一个Spring.xmlxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-4.1.xsd启动Spring容器后的执行结果为Enter AwareBean.setBeanName(), beanName AwareBeanEnter AwareBean.setBeanFactory(), beanfactory org.springframework.beans.factory.support.DefaultListableBeanFactory2747fda0: defining beans [AwareBean,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.ConfigurationClassPostProcessor.importAwareProcessor,org.springframework.context.annotation.ConfigurationClassPostProcessor.enhancedConfigurationProcessor]; root of factory hierarchyEnter AwareBean.setApplicationContext(), applicationContext org.springframework.context.support.GenericApplicationContext5514cd80: startup date [Mon Aug 08 19:23:30 CST 2016]; root of context hierarchy关于这三个接口以及上面的打印信息总结几点1、如果你的BeanName、ApplicationContext、BeanFactory有用那么就自己定义一个变量将它们保存下来如果没用那么只需要实现setXXX()方法用一下Spring注入进来的参数即可2、如果Bean同时还实现了InitializingBean容器会保证BeanName、ApplicationContext和BeanFactory在调用afterPropertiesSet()方法被注入FactoryBeanFactoryBean在Spring中是非常有用的使用Eclipse/MyEclipse的朋友可以对FactoryBean使用ctrlt查看一下FactoryBean这个接口在Spring容器中有大量的子实现。传统的Spring容器加载一个Bean的整个过程都是由Spring控制的换句话说开发者除了设置Bean相关属性之外是没有太多的自主权的。FactoryBean改变了这一点开发者可以个性化地定制自己想要实例化出来的Bean方法就是实现FactoryBean接口。看一下代码例子为了讲清楚FactoryBean内容相对多一些首先定义一个接口Animalpublic interface Animal{public void move();}定义两个实现类Monkey和Tigerpublic class Monkey implements Animal{public void move(){System.out.println(Monkey move!);}}public class Tiger implements Animal{public void move(){System.out.println(Tiger move!);}}写一个实现类实现FactoryBean接口/*** author 五月的仓颉 http://www.cnblogs.com/xrq730/p/5721366.html*/public class AnimalFactoryBean implements FactoryBean{private String animal;public Animal getObject() throws Exception{if (Monkey.equals(animal)){return new Monkey();}else if (Tiger.equals(animal)){return new Tiger();}else{return null;}}public Class getObjectType(){return Animal.class;}public boolean isSingleton(){return true;}public void setAnimal(String animal){this.animal animal;}}配置一个spring.xml注入属性Tigerxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-4.1.xsd写一个JUnit的测试类RunWith(SpringJUnit4ClassRunner.class)ContextConfiguration(locations {classpath*:spring.xml,})public class BaseTest{Resourceprivate Animal animal;Testpublic void aa(){animal.move();}}查看一下运行结果Tiger move!看到最后得到的并不是FactoryBean本身而是FactoryBean的泛型对象这就是FactoryBean的作用。FactoryBean的几个方法1、getObject()方法是最重要的控制Bean的实例化过程2、getObjectType()方法获取接口返回的实例的class3、isSingleton()方法获取该Bean是否为一个单例的Bean像我这段代码的功能就是传入一个String类型的参数可以动态控制生成出来的是接口的哪种子类。有了FactoryBean同样的我们也可以灵活地操控Bean的生成。BeanPostProcessor之前的InitializingBean、DisposableBean、FactoryBean包括init-method和destory-method针对的都是某个Bean控制其初始化的操作而似乎没有一种办法可以针对每个Bean的生成前后做一些逻辑操作PostProcessor则帮助我们做到了这一点先看一个简单的BeanPostProcessor。网上有一张图画了Bean生命周期的过程画得挺好原图出处BeanPostProcess接口有两个方法都可以见名知意1、postProcessBeforeInitialization在初始化Bean之前2、postProcessAfterInitialization在初始化Bean之后值得注意的是这两个方法是有返回值的不要返回null否则getBean的时候拿不到对象。写一段测试代码首先定义一个普通的Bean为了后面能区分给Bean加一个属性public class CommonBean{private String commonName;public void setCommonName(String commonName){this.commonName commonName;}public void initMethod(){System.out.println(Enter CommonBean.initMethod(), commonName commonName);}}定义一个PostProcess实现BeanPostProcess接口/*** author 五月的仓颉 http://www.cnblogs.com/xrq730/p/5721366.html*/public class PostProcessorBean implements BeanPostProcessor{public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException{System.out.println(Enter ProcessorBean.postProcessAfterInitialization()\n);return bean;}public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException{System.out.println(Enter ProcessorBean.postProcessBeforeInitialization());return bean;}}配置一个spring.xml给CommonBean的commonName赋予不同的值以区分xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-4.1.xsd运行一个Spring容器 初始化结果为Enter ProcessorBean.postProcessBeforeInitialization()Enter CommonBean.initMethod(), commonName common0Enter ProcessorBean.postProcessAfterInitialization()Enter ProcessorBean.postProcessBeforeInitialization()Enter CommonBean.initMethod(), commonName common1Enter ProcessorBean.postProcessAfterInitialization()Enter ProcessorBean.postProcessBeforeInitialization()Enter ProcessorBean.postProcessAfterInitialization()看到每个Bean初始化前后都会分别执行postProcessorBeforeInitiallization()方法与postProcessorAfterInitialization()方法最后两行出现原因是PostProcessorBean本身也是一个Bean。BeanFactoryPostProcessor接下来看另外一个PostProcessor----BeanFactoryPostProcessor。Spring允许在Bean创建之前读取Bean的元属性并根据自己的需求对元属性进行改变比如将Bean的scope从singleton改变为prototype最典型的应用应当是PropertyPlaceholderConfigurer替换xml文件中的占位符替换为properties文件中相应的key对应的value这将会在下篇文章中专门讲解PropertyPlaceholderConfigurer的作用及其原理。BeanFactoryPostProcessor就可以帮助我们实现上述的功能下面来看一下BeanFactoryPostProcessor的使用定义一个BeanFactoryPostProcessor的实现类/*** author 五月的仓颉 http://www.cnblogs.com/xrq730/p/5721366.html*/public class FactoryPostProcessorBean implements BeanFactoryPostProcessor{public void postProcessBeanFactory(ConfigurableListableBeanFactory configurablelistablebeanfactory)throws BeansException{System.out.println(Enter FactoryPostProcessorBean.postProcessBeanFactory()\n);}}spring.xml里面配置一下这个Bean就不写了运行一下Spring容器结果为Enter FactoryPostProcessorBean.postProcessBeanFactory()Enter ProcessorBean.postProcessBeforeInitialization()Enter CommonBean.initMethod(), commonName common0Enter ProcessorBean.postProcessAfterInitialization()Enter ProcessorBean.postProcessBeforeInitialization()Enter CommonBean.initMethod(), commonName common1Enter ProcessorBean.postProcessAfterInitialization()Enter ProcessorBean.postProcessBeforeInitialization()Enter ProcessorBean.postProcessAfterInitialization()从执行结果中可以看出两点1、BeanFactoryPostProcessor的执行优先级高于BeanPostProcessor2、BeanFactoryPostProcessor的postProcessBeanFactory()方法只会执行一次注意到postProcessBeanFactory方法是带了参数ConfigurableListableBeanFactory的这就和我之前说的可以使用BeanFactoryPostProcessor来改变Bean的属性相对应起来了。ConfigurableListableBeanFactory功能非常丰富最基本的它携带了每个Bean的基本信息比如我简单写一段代码/*** author 五月的仓颉 http://www.cnblogs.com/xrq730/p/5721366.html*/public void postProcessBeanFactory(ConfigurableListableBeanFactory configurablelistablebeanfactory)throws BeansException{BeanDefinition beanDefinition configurablelistablebeanfactory.getBeanDefinition(common0);MutablePropertyValues beanProperty beanDefinition.getPropertyValues();System.out.println(scope before change beanDefinition.getScope());beanDefinition.setScope(singleton);System.out.println(scope after change beanDefinition.getScope());System.out.println(beanProperty beanProperty);}看一下执行结果scope before changescope after changesingletonbeanPropertyPropertyValues: length1; bean property commonName这样就获取了Bean的生命周期以及重新设置了Bean的生命周期。ConfigurableListableBeanFactory还有很多的功能比如添加BeanPostProcessor可以自己去查看。InstantiationAwareBeanPostProcessor最后写一个叫做InstantiationAwareBeanPostProcessor的PostProcessor。InstantiationAwareBeanPostProcessor又代表了Spring的另外一段生命周期实例化。先区别一下Spring Bean的实例化和初始化两个阶段的主要作用1、实例化----实例化的过程是一个创建Bean的过程即调用Bean的构造函数单例的Bean放入单例池中2、初始化----初始化的过程是一个赋值的过程即调用Bean的setter设置Bean的属性之前的BeanPostProcessor作用于过程(2)前后现在的InstantiationAwareBeanPostProcessor则作用于过程(1)前后看一下代码给前面的CommonBean加上构造函数public class CommonBean{public CommonBean(){System.out.println(Enter CommonBeans constructor);}private String commonName;public void setCommonName(String commonName){System.out.println(Enter CommonBean.setCommonName(), commonName commonName);this.commonName commonName;}public void initMethod(){System.out.println(Enter CommonBean.initMethod(), commonName commonName);}}实现InstantiationAwareBeanPostProcessor接口/*** author 五月的仓颉 http://www.cnblogs.com/xrq730/p/5721366.html*/public class InstantiationAwareBeanPostProcessorBean implements InstantiationAwareBeanPostProcessor{public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException{System.out.println(Enter InstantiationAwareBeanPostProcessorBean.postProcessAfterInitialization());return bean;}public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException{System.out.println(Enter InstantiationAwareBeanPostProcessorBean.postProcessBeforeInitialization());return bean;}public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException{System.out.println(Enter InstantiationAwareBeanPostProcessorBean.postProcessAfterInstantiation());return true;}public Object postProcessBeforeInstantiation(Class bean, String beanName) throws BeansException{System.out.println(Enter InstantiationAwareBeanPostProcessorBean.postProcessBeforeInstantiation());return null;}public PropertyValues postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pd, Object bean,String beanName) throws BeansException{return pvs;}}配置一下spring.xmlxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-4.1.xsd启动容器观察一下运行结果为Enter InstantiationAwareBeanPostProcessorBean.postProcessBeforeInstantiation()Enter CommonBeans constructorEnter InstantiationAwareBeanPostProcessorBean.postProcessAfterInstantiation()Enter CommonBean.setCommonName(), commonName commonEnter InstantiationAwareBeanPostProcessorBean.postProcessBeforeInitialization()Enter InstantiationAwareBeanPostProcessorBean.postProcessAfterInitialization()Enter InstantiationAwareBeanPostProcessorBean.postProcessAfterInstantiation()Enter InstantiationAwareBeanPostProcessorBean.postProcessBeforeInitialization()Enter InstantiationAwareBeanPostProcessorBean.postProcessAfterInitialization()最后三行的运行结果不去关注看到很明显的InstantiationAwareBeanPostProcessor作用的是Bean实例化前后即1、Bean构造出来之前调用postProcessBeforeInstantiation()方法2、Bean构造出来之后调用postProcessAfterInstantiation()方法不过通常来讲我们不会直接实现InstantiationAwareBeanPostProcessor接口而是会采用继承InstantiationAwareBeanPostProcessorAdapter这个抽象类的方式来使用。后记如果只会写个Bean配置在xml文件里面注入一下那是最最基础的Spring开发者。一个中级、高级的Spring开发者必然会对Spring中的多个扩展点有所了解并利用这些扩展点更好地为项目服务使得整个代码结构更加地优雅并且可读性、可维护性更好。抛砖引玉本文只是简单地介绍一些常用的Spring Bean扩展接口以及它们的简单用法更深入的或者它们一些合适的使用场景还需要留待网友朋友们自己去探索。以上就是本文的全部内容希望本文的内容对大家的学习或者工作能带来一定的帮助同时也希望多多支持脚本之家!
http://www.pierceye.com/news/123786/

相关文章:

  • 建设部安全事故通报网站怎么更改网站的备案号
  • 重庆网站建设维护网络推广引流方法
  • 精品网站开发分销网站建站
  • 建设一个教程视频网站需要什么资质策划书案例范文
  • 郑州汉狮做网站的大公司海尔网站建设
  • 成都网站制作成都重庆网红景点排名
  • 广西南宁市网站制作公司制作图片的软件加字体
  • 新手搭建网站教程品牌推广费用预算
  • 广州网站设计网站制作竞价托管多少钱
  • 创建企业营销网站包括哪些内容软考高项彻底没用了
  • 企业品牌网站建设方案无锡网站设计多少钱
  • 轻量级网站开发在线旅游网站平台有哪些
  • 怎么用vs做网站推广优化网站排名
  • 免费推广网站软件常宁网站建设常宁网站建设
  • 冀州市网站建设html编辑器安卓版手机版软件
  • 广州专业网站改版方案网站建设要做ui和什么
  • 做网站显示上次登录时间代码h5素材库
  • 比较有名的网站建设公司谷歌网站优化
  • 企业网站改版计划书中国制造网是做什么的
  • 非主营电子商务企业网站有哪些企业网项目建设实践
  • 颍东网站建设手机vi设计公司
  • 林哥seo网络营销seo培训
  • 如何面试网站开发网站制作交易流程
  • 绍兴网站建设冯炳良互联网营销
  • 制作企业网站怎么报价可以做我女朋友吗网站
  • 广西玉林网站建设正规公司建手机网站
  • 乐清网站制作公司招聘做私人网站 违法
  • 珠海电脑自己建网站电子商务排名
  • 怎样做网站的背景图片安卓原生开发
  • 现代电子商务网站建设技术wordpress采用的mvc